需求小能手——滚动列表

184 阅读2分钟

前言

前段时间看到同事做的大屏项目有一个滚动列表,就像信息滚动屏,感觉还挺有意思的,本节就来试着简单实现一下。

实现

该需求我就用vue3来实现,大家用自己喜欢的技术栈就行,思路是一致的。大屏项目一般会有专门的UI设计,加上各种背景图与样式会显得非常的高大上,这里就简单实现,不搞那么多花里胡哨。
滚动列表是自动从上到下滚动,要想实现该效果首先列表包裹着一个div中,然后让整个列表沿着y轴进行位移,就能做出滚动效果,因为是自动的,我们就用setInterval写一个定时任务去位移。 根据以上分析我们先简单把页面写一下,定义一个数据列表,用v-for去循环出来:

   <div class="wrapper">
      <ul>
        <li
          v-for="(item, index) in list"
          :key="item.id + index"
          class="list-item"
        >
          {{ item.content }}{{ index + 1 }}
        </li>
      </ul>
    </div>
    <script setup>
    const list = new Array(10).fill({ id: Math.random(), content: '列表' });
    </script>

注意这里我们要把包裹的div设置为overflow:hidden。 接下来我们利用css中的transform去平移列表,每次平移的距离我们可以用一个变量去表示,用定时器不断修改变量的值达到自动的效果。

 let distance = ref(0);
onMounted(() => {
  setInterval(() => {
    distance.value -= 10;
    if (-distance.value > 10 * list.length) {
      distance.value = 0;
    }
  }, 1000);
});

这样我们就得到了自动滚动的列表,但是这个滚动一卡一卡的,这是因为我们是分段去位移的,那么我们简单优化下,将位置一步位移到位,也就是让distance的值是每次位移距离乘以列表数,并且设置transition过渡属性,让位移显得更加顺畅。

<ul
        :style="{
          transform: 'translateY(' + distance + 'px)',
          transition: 'all 3s'
        }"
      >
 </ul>

到此我们就实现了一个简单的demo,除了样式还有很多待优化的点,比如让列表进行重复循环,将可视区域变成虚拟列表提升性能。

总结

以上就是滚动列表的实现,就是css加上定时器实现的,感兴趣的可以丰富其功能。