当前位置:首页 > JavaScript

用js实现列表无缝滚动

2026-04-04 21:53:04JavaScript

实现无缝滚动的基本原理

无缝滚动的核心是通过动态调整列表项的位置,当元素滚动到可视区域外时,将其移动到列表末尾,形成循环滚动的效果。需要监听滚动事件并计算元素位置。

HTML结构准备

创建一个固定高度的容器,内部放置需要滚动的列表。列表项数量应足够多以确保滚动流畅。

<div class="scroll-container" id="scroller">
  <ul class="scroll-list" id="list">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <!-- 更多列表项 -->
  </ul>
</div>

CSS样式设置

为容器设置固定高度和溢出隐藏,列表项设置为行内显示以便横向滚动。

用js实现列表无缝滚动

.scroll-container {
  width: 300px;
  height: 200px;
  overflow: hidden;
  border: 1px solid #ccc;
}

.scroll-list {
  display: inline-block;
  white-space: nowrap;
  margin: 0;
  padding: 0;
  list-style: none;
}

.scroll-list li {
  display: inline-block;
  padding: 10px 20px;
  background: #f0f0f0;
  margin-right: 10px;
}

JavaScript实现逻辑

通过定时器或requestAnimationFrame实现自动滚动,动态调整列表位置实现无缝效果。

const scroller = document.getElementById('scroller');
const list = document.getElementById('list');
let position = 0;

function animate() {
  position -= 1;
  if (position <= -list.children[0].offsetWidth) {
    position = 0;
    list.appendChild(list.children[0]);
  }
  list.style.transform = `translateX(${position}px)`;
  requestAnimationFrame(animate);
}

animate();

性能优化方案

使用CSS transform代替left/top定位减少重排,使用requestAnimationFrame优化动画流畅度。克隆列表项避免滚动时出现空白。

用js实现列表无缝滚动

// 克隆列表项填充容器
const items = list.innerHTML;
list.innerHTML = items + items;

function optimizedAnimate() {
  position -= 1;
  if (position <= -list.scrollWidth/2) {
    position = 0;
  }
  list.style.transform = `translateX(${position}px)`;
  requestAnimationFrame(optimizedAnimate);
}

响应式处理

监听窗口大小变化,动态调整滚动速度或列表项布局。

let speed = 1;
window.addEventListener('resize', () => {
  speed = window.innerWidth < 768 ? 0.5 : 1;
});

暂停与继续控制

添加鼠标事件实现悬停暂停功能,提升用户体验。

let isPaused = false;
scroller.addEventListener('mouseenter', () => isPaused = true);
scroller.addEventListener('mouseleave', () => isPaused = false);

function controlledAnimate() {
  if (!isPaused) {
    position -= speed;
    if (position <= -list.scrollWidth/2) position = 0;
    list.style.transform = `translateX(${position}px)`;
  }
  requestAnimationFrame(controlledAnimate);
}

标签: 列表js
分享给朋友:

相关文章

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

vue实现列表循环

vue实现列表循环

列表循环的实现方式 在Vue中实现列表循环主要依赖于v-for指令,该指令基于源数据多次渲染元素或模板块。 基础数组循环 使用v-for遍历数组时,语法为item in items或(item, i…

vue实现搜索列表

vue实现搜索列表

Vue 实现搜索列表功能 在 Vue 中实现搜索列表功能通常需要以下几个关键步骤: 数据绑定与列表渲染 使用 v-model 绑定搜索输入框,监听用户输入。通过 v-for 指令渲染过滤后的列表数据…