当前位置:首页 > 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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEv…

js实现复制到剪贴板

js实现复制到剪贴板

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

js防抖和节流实现

js防抖和节流实现

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