原生js实现无缝循环滚动效果

文章描述了如何使用原生JavaScript实现一个循环滚动效果,并在2024年进行了优化,通过封装函数处理滚动容器的动态添加和位置调整。作者分享了HTML、CSS和优化后的JavaScript代码片段。

封装插件了

一步到位https://blog.youkuaiyun.com/chuenst/article/details/139095523

原生js实现如下图循环滚动效果

请添加图片描述

核心代码

<div class="scroll">
  <div class="blist" id="scrollContainer">
    <div class="bitem">
    </div>
    ......
    <div class="bitem">
    </div>
  </div>
</div>
<script>
setTimeout(() => {
  let speed = 10; // 调整滚动速度,单位是毫秒  
  let scrollContainer = document.getElementById('scrollContainer');
  let contentHeight = scrollContainer.offsetHeight;
  let top = 0
  scrollContainer.style.position = 'relative';
  scrollContainer.style.top = top + 'px';
  scrollContainer.append(scrollContainer.cloneNode(scrollContainer))
  setInterval(() => {
    if (top * -1 < contentHeight) top--
    else top = 0
    scrollContainer.style.top = top + 'px';;
  }, speed);
}, 200)
</script>

20240507优化

//html
<div class="scroll">
  <div class="scrollContainer" ref="scrollContainer">
    <div class="l-item" v-for="(item, index) in leftList" :key="index">
      ...
    </div>
  </div>
</div>

//css
.scroll {
  height: 800px;
  overflow: hidden;
}

//js
//封装方法
function toScroll(e: any) {
  let sc = e.el;
  if (sc && typeof sc === "object" && sc !== null) {
    let contentHeight = sc.offsetHeight;
    if (contentHeight < sc.parentElement.offsetHeight) return
    let distance = 0
    if (e.direction == 'down') distance = -contentHeight
    sc.append(sc.cloneNode(sc))
    let timer = null
    if (timer) clearInterval(timer)
    timer = setInterval(() => {
      if (e.direction == 'up') {
        if (distance * -1 < contentHeight) distance--
        else distance = 0
        sc.style.transform = 'translate(0px, ' + distance + 'px)';;
      } else if (e.direction == 'down') {
        if (distance < 0) distance++
        else distance = -contentHeight
        sc.style.transform = 'translate(0px, ' + distance + 'px)';
      }

    }, e.step || 3);
  }
}
//调用
toScroll({
  el: scrollContainer.value,
  step: 3,
  direction: 'up'
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初辰ge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值