@zebra-ui/swiper
Version:
专为多端设计的高性能swiper轮播组件库,支持多种复杂的 3D swiper轮播效果。
81 lines (70 loc) • 2.57 kB
text/typescript
import type { UpdateProgress } from '../../../types/components/core/update/update-progress'
import type { SwiperInterface } from '../../../types/swiper-class'
import type { SwiperEvents } from '../../../types/swiper-events'
const updateProgress: UpdateProgress = function (
this: SwiperInterface,
translate
) {
const swiper = this
if (typeof translate === 'undefined') {
const multiplier = swiper.rtlTranslate ? -1 : 1
translate =
(swiper && swiper.translate && swiper.translate * multiplier) || 0
}
const { params } = swiper
const translatesDiff = swiper.maxTranslate() - swiper.minTranslate()
let { progress, isBeginning, isEnd, progressLoop } = swiper
const wasBeginning = isBeginning
const wasEnd = isEnd
if (translatesDiff === 0) {
progress = 0
isBeginning = true
isEnd = true
} else {
progress = (translate - swiper.minTranslate()) / translatesDiff
const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1
const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1
isBeginning = isBeginningRounded || progress <= 0
isEnd = isEndRounded || progress >= 1
if (isBeginningRounded) progress = 0
if (isEndRounded) progress = 1
}
if (params.loop) {
const firstSlideIndex = swiper.getSlideIndexByData(0)
const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1)
const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex]
const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex]
const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1]
const translateAbs = Math.abs(translate)
if (translateAbs >= firstSlideTranslate) {
progressLoop = (translateAbs - firstSlideTranslate) / translateMax
} else {
progressLoop =
(translateAbs + translateMax - lastSlideTranslate) / translateMax
}
if (progressLoop > 1) progressLoop -= 1
}
Object.assign(swiper, {
progress,
progressLoop,
isBeginning,
isEnd
})
if (
params.watchSlidesProgress ||
(params.centeredSlides && params.autoHeight)
) {
swiper.updateSlidesProgress(translate)
}
if (isBeginning && !wasBeginning) {
swiper.emit('reachBeginning toEdge' as keyof SwiperEvents)
}
if (isEnd && !wasEnd) {
swiper.emit('reachEnd toEdge' as keyof SwiperEvents)
}
if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
swiper.emit('fromEdge' as keyof SwiperEvents)
}
swiper.emit('progress' as keyof SwiperEvents, progress)
}
export default updateProgress