vue 自己写个横向滚动列表吧

文章展示了如何在Vue.js应用中手写一个横向滚动列表,因为uview的内置组件无法满足特定的业务和样式需求。代码示例包括HTML结构、JavaScript数据处理和CSS样式,特别关注了滚动事件的处理和自定义滚动条样式。
摘要由CSDN通过智能技术生成

手动写个横向滚动列表吧,其实在uview中也有该组件,但是不支持具体的业务需要和样式需求,因此决定自己手写一个了

在这里插入图片描述
直接上代码吧,对你有用的话请点个赞哦

html

 <!-- 渲染的tab栏,需要加个scroll-view,使其横向滚动 -->
        <view class="tab-box">
          <scroll-view scroll-x="true" class="tab" @scroll="scrollEvent" @touchmove.stop>
            <view class="scroll-tab" v-for="(item, index) in tab" :key="index">
              <view class="content" :style="{ width: `${screenWidth}px` }">
                <view class="img-box">
                  <img class="img" :src="$imgUrl(item.url)" alt="" />
                </view>
                <view class="text">{{ item.title }}</view>
              </view>
            </view>
          </scroll-view>
          <!-- 滚动条 -->
          <!-- <view class="scroll">
                  <view class="scroll-box">
                    <view
                      class="action"
                      :style="{ marginLeft: scrollPercent }"
                    ></view>
                  </view>
                </view> -->
        </view>

js

data() {
	 return {
 		scrollPercent: '',
		screenWidth: '100%',
 	}
}

  mounted() {
    let _this = this
    uni.getSystemInfo({
      success: function (res) {
      // 30是你的内外边距 5是你在当前页面要放几个
        _this.screenWidth = (res.windowWidth - 30) / 5
      },
    })
  },


scrollEvent(e) {
      let offsetWidth
      uni.getSystemInfo({
        success: function (res) {
          offsetWidth = res.windowWidth
        },
      })
      // 滚动长度百分比
      let scrollLeft = Math.floor(
        (e.detail.scrollLeft * 100) / (e.detail.scrollWidth - offsetWidth)
      )
      // (里面滑块长度/滚动条总长度)*滚动长度百分比
      let scrollNum = (((this.scrollIndexWidth * 100) / this.scrollWidth) * scrollLeft) / 10000
      scrollNum < 0 ? (scrollNum = 0) : (scrollNum = scrollNum)
      scrollNum > 0.5 ? (scrollNum = 0.5) : (scrollNum = scrollNum)
      this.scrollPercent = toPercent(scrollNum)
    },

css

      // tab栏
      .tab-box {
        margin: 40rpx 30rpx;

        .tab {
          white-space: nowrap;
          margin-bottom: 32rpx;
          margin-top: -20rpx;
          overflow-y: hidden;

          .scroll-tab {
            display: inline-block;
          }

          .content {
            text-align: center;
          }

          .img-box {
            text-align: center;

            .img {
              text-align: center;
              width: 64rpx;
              height: 64rpx;
            }
          }

          .text {
            font-size: 22rpx;
            color: #4b4d50;
            opacity: 0.7;
            margin-top: 6rpx;
            white-space: nowrap;
          }
        }

        .tab::-webkit-scrollbar {
          width: 0;
        }

        .tab::-webkit-scrollbar {
          display: none !important;
          width: 0px;
          height: 0px;
        }

        // 滚动条
        .scroll {
          display: flex;
          justify-content: center;

          .scroll-box {
            border-radius: 2rpx;
            background-color: #d8d8d8;
            height: 4rpx;
            width: 40rpx;

            .action {
              border-radius: 2rpx;
              background-color: $themeColor;
              height: 4rpx;
              width: 20rpx;
            }
          }

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
当然可以!下面是一个用Vue 3编写的公告横向滚动轮播的示例代码: ```html <template> <div class="announcement"> <div class="announcement-container"> <ul ref="list" class="announcement-list"> <li v-for="(item, index) in announcements" :key="index" class="announcement-item"> {{ item }} </li> </ul> </div> </div> </template> <script> import { ref, onMounted, watch } from 'vue'; export default { name: 'Announcement', data() { return { announcements: [ '公告1', '公告2', '公告3', '公告4', '公告5' ], interval: null, currentIndex: 0, scrollWidth: 0 }; }, mounted() { onMounted(() => { this.scrollWidth = this.$refs.list.scrollWidth; this.startScroll(); }); }, methods: { startScroll() { this.interval = setInterval(() => { this.currentIndex++; if (this.currentIndex >= this.announcements.length) { this.currentIndex = 0; this.$refs.list.scrollLeft = 0; } else { this.$refs.list.scrollLeft += this.scrollWidth; } }, 3000); } }, beforeUnmount() { clearInterval(this.interval); } }; </script> <style scoped> .announcement { width: 100%; overflow: hidden; } .announcement-container { width: 100%; overflow: hidden; } .announcement-list { display: flex; list-style-type: none; padding: 0; margin: 0; animation: scroll 20s infinite linear; } .announcement-item { flex: 0 0 auto; white-space: nowrap; margin-right: 20px; } @keyframes scroll { from { transform: translateX(0); } to { transform: translateX(-100%); } } </style> ``` 在这个示例中,我们使用了Vue的`ref`、`onMounted`和`watch`函数来处理滚动逻辑。`announcements`数组中存储了公告内容,`currentIndex`表示当前显示的公告索引,`scrollWidth`存储了滚动容器的宽度。 在组件的`mounted`生命周期钩子中,我们获取了滚动容器的宽度,并调用`startScroll`函数开始滚动。 `startScroll`函数使用`setInterval`定时器来每隔一段时间更新当前公告索引,并通过修改滚动容器的`scrollLeft`属性实现滚动效果。当滚动到最后一个公告时,重新设置索引为0,并将滚动容器的`scrollLeft`重置为0。 最后,在组件的`beforeUnmount`生命周期钩子中清除了定时器,防止内存泄漏。 你可以根据需要自定义样式和公告内容。希望这个示例能帮到你!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值