当前位置:首页 > 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实现动画

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可以提升滚动性能:

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

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

响应式处理

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

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

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

用js实现列表无缝滚动

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

相关文章

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…