@zebra-ui/swiper
Version:
专为多端设计的高性能swiper轮播组件库,支持多种复杂的 3D swiper轮播效果。
93 lines (81 loc) • 2.77 kB
text/typescript
import { createElement, elementChildren, showWarning } from '../../shared/utils'
import type { LoopCreate } from '../../../types/components/core/loop/loop-create'
import type { SwiperInterface } from '../../../types/swiper-class'
const loopCreate: LoopCreate = function (
this: SwiperInterface,
slideRealIndex
) {
const swiper = this
const { params, slidesEl } = swiper
if (
!params.loop ||
(swiper.virtual &&
typeof swiper.params.virtual === 'object' &&
swiper.params.virtual.enabled)
)
return
const initSlides = () => {
const slides = elementChildren(
slidesEl,
`.${params.slideClass}, swiper-slide`
)
slides.forEach((el, index) => {
el.setAttribute('data-swiper-slide-index', index.toString())
})
}
const gridEnabled =
swiper.grid && params.grid && params.grid.rows && params.grid.rows > 1
const slidesPerGroup =
params.slidesPerGroup &&
params.slidesPerGroup * (gridEnabled ? params.grid?.rows || 1 : 1)
const shouldFillGroup =
slidesPerGroup && swiper.slides.length % slidesPerGroup !== 0
const shouldFillGrid =
gridEnabled && swiper.slides.length % (params.grid?.rows || 1) !== 0
const addBlankSlides = (amountOfSlides: number) => {
for (let i = 0; i < amountOfSlides; i += 1) {
const slideEl = swiper.isElement
? createElement('swiper-slide', [params.slideBlankClass || ''])
: createElement('div', [
params.slideClass || '',
params.slideBlankClass || ''
])
swiper.slidesEl.append(slideEl || '')
}
}
if (shouldFillGroup) {
if (params.loopAddBlankSlides) {
const slidesToAdd =
slidesPerGroup - (swiper.slides.length % slidesPerGroup)
addBlankSlides(slidesToAdd)
swiper.recalcSlides()
swiper.updateSlides()
} else {
showWarning(
'Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)'
)
}
initSlides()
} else if (shouldFillGrid) {
if (params.loopAddBlankSlides) {
const slidesToAdd =
(params.grid?.rows || 1) -
(swiper.slides.length % (params.grid?.rows || 1))
addBlankSlides(slidesToAdd)
swiper.recalcSlides()
swiper.updateSlides()
} else {
showWarning(
'Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)'
)
}
initSlides()
} else {
initSlides()
}
swiper.loopFix({
slideRealIndex,
direction: params.centeredSlides ? undefined : 'next'
})
}
export default loopCreate