Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
hello uni-app x
提交
cda15ab4
H
hello uni-app x
项目概览
DCloud
/
hello uni-app x
通知
5995
Star
90
Fork
162
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
18
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hello uni-app x
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
18
Issue
18
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
cda15ab4
编写于
8月 29, 2023
作者:
H
hdx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
long-list: 优化tab布局;调整蛇形线算法,同时兼容微信webview和skyline
上级
8c7ac2b5
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
23 addition
and
34 deletion
+23
-34
pages/template/long-list/long-list.uvue
pages/template/long-list/long-list.uvue
+23
-34
未找到文件。
pages/template/long-list/long-list.uvue
浏览文件 @
cda15ab4
...
@@ -7,11 +7,10 @@
...
@@ -7,11 +7,10 @@
<scroll-view class="swiper-tabs" :scroll-left="tabsScrollLeft" :scroll-x="true" :show-scrollbar="false">
<scroll-view class="swiper-tabs" :scroll-left="tabsScrollLeft" :scroll-x="true" :show-scrollbar="false">
<view>
<view>
<view class="flex-row">
<view class="flex-row">
<view class="swiper-tabs-item" v-for="(item, index) in swiperList" :id="'swipertab' + index" ref="swipertab"
<text class="swiper-tabs-item" :class="swiperIndex==index ? 'swiper-tabs-item-active' : ''"
:key="index" @click="onTabClick(index)">
v-for="(item, index) in swiperList" ref="swipertab" :key="index" @click="onTabClick(index)">
<text class="swiper-tabs-item-text"
{{item.name}}
:class="swiperIndex==index ? 'swiper-tabs-item-text-active' : ''">{{item.name}}</text>
</text>
</view>
</view>
</view>
<view class="swiper-tabs-indicator">
<view class="swiper-tabs-indicator">
<view class="swiper-tabs-underline"
<view class="swiper-tabs-underline"
...
@@ -19,8 +18,8 @@
...
@@ -19,8 +18,8 @@
</view>
</view>
</view>
</view>
</scroll-view>
</scroll-view>
<swiper class="swiper-view" ref="swiper" :current="swiperIndex" @
change="onSwiperChange
"
<swiper class="swiper-view" ref="swiper" :current="swiperIndex" @
transition="onSwiperTransition
"
@
transition="onSwiperTransition" @
animationfinish="onSwiperAnimationfinish">
@animationfinish="onSwiperAnimationfinish">
<swiper-item class="swiper-item" v-for="(item, index) in swiperList" :key="index">
<swiper-item class="swiper-item" v-for="(item, index) in swiperList" :key="index">
<long-page ref="longPage" :type="item.type" :preload="item.preload"></long-page>
<long-page ref="longPage" :type="item.type" :preload="item.preload"></long-page>
</swiper-item>
</swiper-item>
...
@@ -74,10 +73,9 @@
...
@@ -74,10 +73,9 @@
swiperIndicatorLineLeft: 0,
swiperIndicatorLineLeft: 0,
swiperIndicatorLineWidth: 0,
swiperIndicatorLineWidth: 0,
$headerHeight: 0,
$headerHeight: 0,
$
lastSwiper
Index: 0,
$
animationFinish
Index: 0,
$swiperWidth: 0,
$swiperWidth: 0,
$swiperTabsRect: [] as SwiperTabsItem[],
$swiperTabsRect: [] as SwiperTabsItem[]
$isTap: false
}
}
},
},
onReady() {
onReady() {
...
@@ -90,18 +88,18 @@
...
@@ -90,18 +88,18 @@
onTabClick(index : number) {
onTabClick(index : number) {
this.setSwiperIndex(index, false)
this.setSwiperIndex(index, false)
},
},
onSwiperChange(e : SwiperChangeEvent) {
this.setSwiperIndex(e.detail.current, false)
},
onSwiperTransition(e : SwiperTransitionEvent) {
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.$lastSwiper
Index - 1
let moveToIndex = offsetX > 0 ?
currentIndex + 1 : current
Index - 1
if (moveToIndex < 0) { moveToIndex = 0 }
if (moveToIndex < 0) { moveToIndex = 0 }
if (moveToIndex > this.$swiperTabsRect.length - 1) { moveToIndex = this.$swiperTabsRect.length - 1 }
if (moveToIndex > this.$swiperTabsRect.length - 1) { moveToIndex = this.$swiperTabsRect.length - 1 }
const percentage = Math.abs(offsetX) / this.$swiperWidth
const percentage = Math.abs(offsetX) / this.$swiperWidth
const currentSize = this.$swiperTabsRect[
this.$lastSwiper
Index]
const currentSize = this.$swiperTabsRect[
current
Index]
const moveToSize = this.$swiperTabsRect[moveToIndex]
const moveToSize = this.$swiperTabsRect[moveToIndex]
const indicatorlineL = currentSize.left + (moveToSize.left - currentSize.left) * percentage
const indicatorlineL = currentSize.left + (moveToSize.left - currentSize.left) * percentage
const indicatorlineW = currentSize.width + (moveToSize.width - currentSize.width) * percentage
const indicatorlineW = currentSize.width + (moveToSize.width - currentSize.width) * percentage
...
@@ -109,16 +107,13 @@
...
@@ -109,16 +107,13 @@
this.updateTabIndicator(indicatorlineL, indicatorlineW)
this.updateTabIndicator(indicatorlineL, indicatorlineW)
this.initSwiperItemPage(moveToIndex)
this.initSwiperItemPage(moveToIndex)
//console.log(this.$lastSwiperIndex, moveToIndex, offsetX, this.$swiperWidth, percentage);
},
},
onSwiperAnimationfinish(e : SwiperAnimationFinishEvent) {
onSwiperAnimationfinish(e : SwiperAnimationFinishEvent) {
// console.log("onSwiperAnimationfinish", e.detail.current);
this.$lastSwiperIndex = e.detail.current
this.setSwiperIndex(e.detail.current, true)
this.setSwiperIndex(e.detail.current, true)
this.$animationFinishIndex = e.detail.current
},
},
queryTabItemsSize() {
queryTabItemsSize() {
this.$swiperTabsRect.length = 0
;
this.$swiperTabsRect.length = 0
const tabs = this.$refs["swipertab"] as INode[]
const tabs = this.$refs["swipertab"] as INode[]
tabs.forEach((node) => {
tabs.forEach((node) => {
this.$swiperTabsRect.push({
this.$swiperTabsRect.push({
...
@@ -139,18 +134,15 @@
...
@@ -139,18 +134,15 @@
this.updateTabIndicator(this.$swiperTabsRect[index].left, this.$swiperTabsRect[index].width)
this.updateTabIndicator(this.$swiperTabsRect[index].left, this.$swiperTabsRect[index].width)
}
}
},
},
initSwiperItemPage(index : Number) {
if (!this.swiperList[index].preload) {
this.swiperList[index].preload = true;
(this.$refs["longPage"] as ComponentPublicInstance[])[index].$callMethod('loadData')
}
},
updateTabIndicator(left : Number, width : Number) {
updateTabIndicator(left : Number, width : Number) {
this.swiperIndicatorLineLeft = left
this.swiperIndicatorLineLeft = left
this.swiperIndicatorLineWidth = width
this.swiperIndicatorLineWidth = width
const offset = left + width / 2
this.tabsScrollLeft = left + width / 2 - this.$swiperWidth / 2
if (offset > this.$swiperWidth / 2) {
},
this.tabsScrollLeft = offset - this.$swiperWidth / 2
initSwiperItemPage(index : Number) {
if (!this.swiperList[index].preload) {
this.swiperList[index].preload = true;
(this.$refs["longPage"]! as ComponentPublicInstance[])[index].$callMethod('loadData')
}
}
}
}
}
}
...
@@ -180,15 +172,12 @@
...
@@ -180,15 +172,12 @@
}
}
.swiper-tabs-item {
.swiper-tabs-item {
padding: 12px 25px;
}
.swiper-tabs-item-text {
color: #555;
color: #555;
font-size: 16px;
font-size: 16px;
padding: 12px 25px;
}
}
.swiper-tabs-item-
text-
active {
.swiper-tabs-item-active {
color: #007AFF;
color: #007AFF;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录