当前位置:首页 > JavaScript

用js实现列表无缝滚动

2026-03-01 21:05:00JavaScript

实现无缝滚动的核心思路

通过动态调整列表元素的位置,当元素滚动到可视区域外时,将其移动到列表末尾,形成循环滚动的效果。关键点在于监听滚动事件并计算元素位置。

基础HTML结构

<div class="scroll-container" id="scrollContainer">
  <ul class="scroll-list" id="scrollList">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
  </ul>
</div>

CSS样式准备

.scroll-container {
  width: 300px;
  height: 200px;
  overflow: hidden;
  border: 1px solid #ccc;
}
.scroll-list {
  margin: 0;
  padding: 0;
  list-style: none;
  position: relative;
}
.scroll-list li {
  height: 40px;
  line-height: 40px;
  padding: 0 10px;
  border-bottom: 1px solid #eee;
}

JavaScript实现方案

方案一:使用requestAnimationFrame实现动画

用js实现列表无缝滚动

const container = document.getElementById('scrollContainer');
const list = document.getElementById('scrollList');
const items = list.children;
let scrollPosition = 0;

function cloneItems() {
  for (let i = 0; i < items.length; i++) {
    const clone = items[i].cloneNode(true);
    list.appendChild(clone);
  }
}

function animate() {
  scrollPosition += 1;
  if (scrollPosition >= list.scrollHeight / 2) {
    scrollPosition = 0;
  }
  list.style.transform = `translateY(-${scrollPosition}px)`;
  requestAnimationFrame(animate);
}

cloneItems();
animate();

方案二:使用CSS动画结合DOM操作

const container = document.getElementById('scrollContainer');
const list = document.getElementById('scrollList');
const items = list.children;

function initScroll() {
  // 克隆元素保证无缝衔接
  const cloneFragment = document.createDocumentFragment();
  Array.from(items).forEach(item => {
    cloneFragment.appendChild(item.cloneNode(true));
  });
  list.appendChild(cloneFragment);

  // 设置动画
  list.style.animation = `scroll ${items.length * 0.5}s linear infinite`;

  // 监听动画循环
  list.addEventListener('animationiteration', () => {
    list.style.transition = 'none';
    list.style.transform = 'translateY(0)';
    setTimeout(() => {
      list.style.transition = 'transform 0.3s ease';
    }, 0);
  });
}

// 添加CSS动画定义
const style = document.createElement('style');
style.textContent = `
  @keyframes scroll {
    100% { transform: translateY(-${list.scrollHeight / 2}px); }
  }
`;
document.head.appendChild(style);

initScroll();

性能优化建议

设置CSS属性will-change: transform可以提升滚动性能:

用js实现列表无缝滚动

.scroll-list {
  will-change: transform;
}

对于大量数据的情况,建议使用虚拟滚动技术,只渲染可视区域内的元素。可以通过监听滚动事件动态计算需要显示的元素索引,减少DOM操作。

响应式处理

添加窗口大小变化的监听,动态调整滚动参数:

window.addEventListener('resize', () => {
  // 重新计算动画参数
  list.style.animationDuration = `${items.length * 0.5}s`;
});

以上两种实现方案都能实现无缝滚动效果,方案一更适合需要精确控制滚动速度的场景,方案二则更简洁且能利用硬件加速。根据实际需求选择合适的实现方式。

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

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…