diff --git a/pages/template/swiper-list/swiper-list.uvue b/pages/template/swiper-list/swiper-list.uvue index e4f8e485b82df45a089341ac16c2d19da9e25754..9babf4e22d698677b3a287ec2cf23b932b7edeff 100644 --- a/pages/template/swiper-list/swiper-list.uvue +++ b/pages/template/swiper-list/swiper-list.uvue @@ -3,11 +3,10 @@ - - {{item.title}} - + + {{item.title}} + - + {{index}} @@ -31,7 +30,7 @@ } type SwiperViewItem = { - title : string + title : string, } export default { @@ -42,53 +41,49 @@ tabsScrollLeft: 0, swiperIndicatorLineLeft: 0, swiperIndicatorLineWidth: 0, - $lastSwiperIndex: 0, + $animationFinishIndex: 0, $swiperWidth: 0, - $swiperTabsRect: [] as SwiperTabsItem[], - $isTap: false + $swiperTabsRect: [] as SwiperTabsItem[] } }, onLoad() { for (let i = 0; i < 8; i++) { + const space = " ".repeat(i) this.swiperList.push({ - title: "TAB " + i + title: "Tab " + space + i } as SwiperViewItem) } }, onReady() { - this.$swiperWidth = (this.$refs["swiper"]! as INode)!?.offsetWidth! as number; - this.queryTabItemsSize(); - this.setSwiperIndex(0, true); + this.$swiperWidth = (this.$refs["swiper"] as INode)!.offsetWidth! as number + this.queryTabItemsSize() + this.setSwiperIndex(0, true) }, methods: { onTabClick(index : number) { - this.setSwiperIndex(index, false); - }, - onSwiperChange(e : SwiperChangeEvent) { - this.setSwiperIndex(e.detail.current, false); - console.log("onSwiperChange", e.detail.current); + this.setSwiperIndex(index, false) }, onSwiperTransition(e : SwiperTransitionEvent) { - const offsetX = e.detail.dx; + const offsetX = e.detail.dx + // 兼容微信 skyline 和 webview + const offsetIndex = Math.abs(offsetX.toInt()) == this.$swiperWidth ? 0 : offsetX / this.$swiperWidth + const currentIndex = this.$animationFinishIndex + Math.abs(offsetIndex.toInt()) - let moveToIndex = offsetX > 0 ? this.$lastSwiperIndex + 1 : this.$lastSwiperIndex - 1 + let moveToIndex = offsetX > 0 ? currentIndex + 1 : currentIndex - 1 if (moveToIndex < 0) { moveToIndex = 0 } if (moveToIndex > this.$swiperTabsRect.length - 1) { moveToIndex = this.$swiperTabsRect.length - 1 } - const percentage = Math.abs(offsetX) / this.$swiperWidth; - const currentSize = this.$swiperTabsRect[this.$lastSwiperIndex]; - const moveToSize = this.$swiperTabsRect[moveToIndex]; - const indicatorlineL = currentSize.left + (moveToSize.left - currentSize.left) * percentage; - const indicatorlineW = currentSize.width + (moveToSize.width - currentSize.width) * percentage; + const percentage = Math.abs(offsetX) / this.$swiperWidth + const currentSize = this.$swiperTabsRect[currentIndex] + const moveToSize = this.$swiperTabsRect[moveToIndex] + const indicatorlineL = currentSize.left + (moveToSize.left - currentSize.left) * percentage + const indicatorlineW = currentSize.width + (moveToSize.width - currentSize.width) * percentage - this.updateTabIndicator(indicatorlineL, indicatorlineW); - //console.log(this.$lastSwiperIndex, moveToIndex, offsetX, this.$swiperWidth, percentage); + this.updateTabIndicator(indicatorlineL, indicatorlineW) }, - // TODO 事件触发时机不对 onSwiperAnimationfinish(e : SwiperAnimationFinishEvent) { - this.$lastSwiperIndex = e.detail.current; - console.log("onSwiperAnimationfinish", e.detail.current); - // this.setSwiperIndex(e.detail.current, true); + this.setSwiperIndex(e.detail.current, true) + this.$animationFinishIndex = e.detail.current }, queryTabItemsSize() { this.$swiperTabsRect.length = 0; @@ -102,21 +97,18 @@ }, setSwiperIndex(index : Number, updateIndicator : Boolean) { if (this.swiperIndex === index) { - return; + return } - this.swiperIndex = index; + this.swiperIndex = index if (updateIndicator) { - this.updateTabIndicator(this.$swiperTabsRect[index].left, this.$swiperTabsRect[index].width); + this.updateTabIndicator(this.$swiperTabsRect[index].left, this.$swiperTabsRect[index].width) } }, updateTabIndicator(left : Number, width : Number) { - this.swiperIndicatorLineLeft = left; - this.swiperIndicatorLineWidth = width; - const offset = left + width / 2; - if (offset > this.$swiperWidth / 2) { - this.tabsScrollLeft = offset - this.$swiperWidth / 2; - } + this.swiperIndicatorLineLeft = left + this.swiperIndicatorLineWidth = width + this.tabsScrollLeft = left + width / 2 - this.$swiperWidth / 2 } } } @@ -136,15 +128,12 @@ } .swiper-tabs-item { - padding: 12px 25px; - } - - .swiper-tabs-item-text { color: #555; font-size: 16px; + padding: 12px 25px; } - .swiper-tabs-item-text-active { + .swiper-tabs-item-active { color: #007AFF; } @@ -161,11 +150,6 @@ background-color: #007AFF; } - .swiper-tabs-animation { - transition-duration: 0.2s; - transition-property: left; - } - .swiper-view { flex: 1; } @@ -179,6 +163,5 @@ .swiper-item-text { font-size: 72px; font-weight: bold; - margin: auto; } \ No newline at end of file