| @ -0,0 +1,132 @@ | |||||
| <!-- 虚拟滚动组件 --> | |||||
| <template> | |||||
| <view class="virtualScroll"> | |||||
| <view class="virtualScroll-title">{{ $t('page.virtualScroll.title') }}</view> | |||||
| <!-- 滚动列表 --> | |||||
| <view | |||||
| :style="{ height : scrollListLength >= maxShowNumber ? `${ maxShowNumber * 160 }rpx` : `${scrollListLength * 164}rpx` }" | |||||
| class="scroll-list"> | |||||
| <view :class="{ animate }" :style="{ transform : `translate(0rpx,${ -scrollPostion }rpx)`}"> | |||||
| <!-- 主要数据 --> | |||||
| <view class="scroll-list-main-data"> | |||||
| <view ref="scrollItem" v-for="item in scrollList" :key="item.id" class="scroll-item"> | |||||
| <view class="user-name">{{ item.auccont }}</view> | |||||
| <view class="money">{{ item.money }}</view> | |||||
| <view class="time">{{ item.createTime }}</view> | |||||
| </view> | |||||
| </view> | |||||
| <!-- 副本数据 --> | |||||
| <view class="scroll-list-copy-data"> | |||||
| <view v-for="item in scrollList" :key="item.id" class="scroll-item"> | |||||
| <view class="user-name">{{ item.auccont }}</view> | |||||
| <view class="money">{{ item.money }}</view> | |||||
| <view class="time">{{ item.createTime }}</view> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </view> | |||||
| </template> | |||||
| <script> | |||||
| export default { | |||||
| data() { | |||||
| return { | |||||
| scrollList: [], //滚动的数据列表 | |||||
| scrollListLength: 0, //滚动数据列表数据总数 | |||||
| maxShowNumber: 3, //显示个数 | |||||
| scrollInterval: null, //控制元素滚动的定时器 | |||||
| topInterval: null, //返回顶部定时器 | |||||
| scrollPostion: 0, //滚动位置 | |||||
| animate: true, //是否显示延迟动画效果 | |||||
| lineHeight: 0, //每个滚动元素的高度 | |||||
| } | |||||
| }, | |||||
| mounted() { | |||||
| this.getScrollList() | |||||
| }, | |||||
| methods: { | |||||
| //获取滚动列表 | |||||
| async getScrollList() { | |||||
| this.request('getIndexScroll').then(res => { | |||||
| if (res.code == 200) { | |||||
| this.scrollList = res.result | |||||
| this.scrollListLength = res.result.length | |||||
| this.scroll() | |||||
| } | |||||
| }) | |||||
| }, | |||||
| //控制元素滚动 | |||||
| scroll() { | |||||
| this.scrollInterval = setInterval(() => { | |||||
| this.animate = true | |||||
| this.scrollPostion += 160 | |||||
| }, 1000) | |||||
| this.topInterval = setInterval(() => { | |||||
| if (this.scrollPostion > this.scrollListLength * 160) { | |||||
| this.animate = false | |||||
| clearInterval(this.scrollInterval) | |||||
| clearInterval(this.topInterval) | |||||
| this.scrollPostion = 0 | |||||
| this.scroll() | |||||
| } | |||||
| }, 100) | |||||
| }, | |||||
| } | |||||
| } | |||||
| </script> | |||||
| <style lang="scss" scoped> | |||||
| .virtualScroll { | |||||
| margin: 0rpx auto; | |||||
| width: 96%; | |||||
| .virtualScroll-title { | |||||
| display: flex; | |||||
| align-items: center; | |||||
| font-size: 36rpx; | |||||
| height: 80rpx; | |||||
| color: $uni-bg-color-app; | |||||
| } | |||||
| .scroll-list { | |||||
| overflow: hidden; | |||||
| // 主要数据 、副本数据 | |||||
| .scroll-list-main-data, | |||||
| .scroll-list-copy-data { | |||||
| padding-top: 20rpx; | |||||
| .scroll-item { | |||||
| display: flex; | |||||
| align-items: center; | |||||
| height: 140rpx; | |||||
| width: 98%; | |||||
| margin-left: 1%; | |||||
| margin-bottom: 20rpx; | |||||
| border-radius: 10rpx; | |||||
| box-shadow: 4rpx 4rpx 10rpx rgba(0, 0, 0, .1), | |||||
| -4rpx -4rpx 10rpx rgba(0, 0, 0, .1); | |||||
| view { | |||||
| flex: 1; | |||||
| text-align: center; | |||||
| &:nth-child(3) { | |||||
| flex: 2; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| .animate { | |||||
| transition: all .4s linear; | |||||
| } | |||||
| } | |||||
| } | |||||
| </style> | |||||