当前位置:首页 > JavaScript

用js实现列表无缝滚动

2026-01-31 05:54:33JavaScript

使用CSS动画实现无缝滚动

通过CSS的@keyframestransform属性实现循环滚动效果。HTML结构需将列表内容复制一份拼接在后方,滚动到复制内容时重置位置实现无缝效果。

<div class="scroll-container">
  <div class="scroll-content">
    <span>Item 1</span>
    <span>Item 2</span>
    <span>Item 3</span>
    <!-- 复制的内容 -->
    <span>Item 1</span>
    <span>Item 2</span>
    <span>Item 3</span>
  </div>
</div>
.scroll-container {
  width: 300px;
  overflow: hidden;
}
.scroll-content {
  display: inline-block;
  white-space: nowrap;
  animation: scroll 10s linear infinite;
}
@keyframes scroll {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}

使用JavaScript动态计算滚动

通过requestAnimationFrame实现更精确的滚动控制,动态克隆列表元素并计算滚动位置:

用js实现列表无缝滚动

function seamlessScroll(container, content, speed = 1) {
  const contentWidth = content.scrollWidth;
  container.appendChild(content.cloneNode(true));

  let position = 0;
  function animate() {
    position -= speed;
    if (position <= -contentWidth) {
      position = 0;
    }
    content.style.transform = `translateX(${position}px)`;
    requestAnimationFrame(animate);
  }
  animate();
}

// 使用示例
const container = document.querySelector('.scroll-container');
const content = document.querySelector('.scroll-content');
seamlessScroll(container, content, 2);

处理动态内容更新

当列表内容可能变化时,需要重新计算宽度并重置动画:

function updateSeamlessScroll() {
  const newContent = content.cloneNode(true);
  container.innerHTML = '';
  container.appendChild(newContent);
  container.appendChild(newContent.cloneNode(true));
  seamlessScroll(container, newContent);
}

// 内容更新时调用
updateSeamlessScroll();

响应式布局适配

通过监听窗口大小变化调整滚动速度:

用js实现列表无缝滚动

window.addEventListener('resize', () => {
  const containerWidth = container.offsetWidth;
  const speed = Math.max(1, containerWidth / 200);
  updateSeamlessScroll(speed);
});

性能优化建议

使用will-change: transform提升CSS动画性能:

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

对于大量列表项,考虑虚拟滚动技术,只渲染可视区域内的元素。通过Intersection Observer API实现动态加载:

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // 加载新内容
    }
  });
});
observer.observe(content.lastElementChild);

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

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现继承

js实现继承

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

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…