You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现横向Slider的无限滚动效果?现有代码滚动到Item6后停止

无限滚动Slider实现方案

核心改动点

  • 新增子元素自动复制逻辑,每个容器末尾拼接一份相同的item列表,作为无缝衔接的过渡载体
  • 移除容器固定宽度配置,改为自适应内容宽度,同时给item添加不可压缩属性避免布局变形
  • 滚动偏移计算新增取模逻辑,滚动距离超过单轮item总宽度时自动重置偏移量,实现无感知循环
  • 修复原有代码中container1位置变量重复赋值的bug,两个容器的倾斜效果可独立生效

完整修改代码

JavaScript代码

let container = document.querySelector(".container")
let container1 = document.querySelector(".container1")

// 复制容器子元素,返回单轮item总宽度
const cloneItems = (container) => {
  const items = Array.from(container.children)
  items.forEach(item => {
    const clone = item.cloneNode(true)
    container.appendChild(clone)
  })
  return items.reduce((totalWidth, item) => totalWidth + item.offsetWidth, 0)
}

const containerCycleWidth = cloneItems(container)
const container1CycleWidth = cloneItems(container1)

window.onscroll = ()=>{
  const scrollY = window.scrollY
  // 取模实现滚动偏移循环,无感知衔接
  container.style.left = `${-scrollY % containerCycleWidth}px` 
  container1.style.right = `${-scrollY % container1CycleWidth}px` 
}
let currentpos = container.getBoundingClientRect().left
let currentpos1 = container1.getBoundingClientRect().left


let callDisort = () =>{
  let newPos = container.getBoundingClientRect().left;
  let newPos1 = container1.getBoundingClientRect().left;
  let diff = newPos - currentpos;
  let speed = diff * 0.50
  container.style.transform = `skewX(${speed}deg)`
  currentpos = newPos
  let diff1 = newPos1 - currentpos1
  let speed1 = diff1 * 0.50
  container1.style.transform = `skewX(${speed1}deg)`
  currentpos1 = newPos1

  requestAnimationFrame(callDisort)
}

callDisort()

CSS代码

*{
  margin:0;
  padding:0;
  box-sizing:border-box;
  font-family: arial;
}
html,body{
  height:10000px;
  overflow-X:hidden;
}

.container{
  position:fixed;
  display:flex;
  justify-content: space-between;
  top:30vh;
  width: fit-content;
  transition:transform 0.15s;
  will-change:transform;
  border:2px solid green;
  gap: 40px;
}
.container1{
  position:fixed;
  display:flex;
  justify-content: space-evenly;
  top:45vh;
  width: fit-content;
  transition:transform 0.15s;
  will-change:transform;
  border:2px solid green;
  gap: 60px;
}

.box{
  position:relative;
  flex-shrink: 0;
}
.box h2{
  font-size:4em;
}

HTML代码

无需修改,保持原有结构即可。

实现原理

复制一轮item后,当滚动偏移刚好走完单轮所有item的总宽度时,取模运算会将偏移重置为0,此时视觉上第二轮的首个item(即原Item1)刚好和第一轮的首个item位置重合,无跳跃感,即可实现无限滚动效果。

内容的提问来源于stack exchange,提问作者Shayan Kanwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:45:04