当前位置:首页 > JavaScript

js实现无缝滚动代码

2026-04-04 11:14:13JavaScript

以下是一个基于JavaScript实现的无缝滚动方案,包含横向和纵向两种常见场景的代码实现:

js实现无缝滚动代码

横向无缝滚动

<div id="scroll-container" style="width:500px; overflow:hidden; white-space:nowrap;">
  <div id="scroll-content" style="display:inline-block;">
    <!-- 内容元素 -->
  </div>
</div>
const container = document.getElementById('scroll-container');
const content = document.getElementById('scroll-content');
const clone = content.cloneNode(true);
container.appendChild(clone);

let scrollPos = 0;
function scrollHorizontally() {
  scrollPos += 1;
  if(scrollPos >= content.offsetWidth) {
    scrollPos = 0;
  }
  container.scrollLeft = scrollPos;
  requestAnimationFrame(scrollHorizontally);
}
scrollHorizontally();

纵向无缝滚动

<div id="scroll-container" style="height:200px; overflow:hidden;">
  <div id="scroll-content">
    <!-- 内容元素 -->
  </div>
</div>
const container = document.getElementById('scroll-container');
const content = document.getElementById('scroll-content');
const clone = content.cloneNode(true);
container.appendChild(clone);

let scrollPos = 0;
function scrollVertically() {
  scrollPos += 1;
  if(scrollPos >= content.offsetHeight) {
    scrollPos = 0;
  }
  container.scrollTop = scrollPos;
  requestAnimationFrame(scrollVertically);
}
scrollVertically();

优化版本(带暂停控制)

function createSeamlessScroll(containerId, direction = 'horizontal') {
  const container = document.getElementById(containerId);
  const content = container.firstElementChild;
  const clone = content.cloneNode(true);
  container.appendChild(clone);

  let scrollPos = 0;
  let isPaused = false;
  let animationId;

  function scroll() {
    if(isPaused) return;

    if(direction === 'horizontal') {
      scrollPos += 1;
      if(scrollPos >= content.offsetWidth) scrollPos = 0;
      container.scrollLeft = scrollPos;
    } else {
      scrollPos += 1;
      if(scrollPos >= content.offsetHeight) scrollPos = 0;
      container.scrollTop = scrollPos;
    }

    animationId = requestAnimationFrame(scroll);
  }

  container.addEventListener('mouseenter', () => { isPaused = true; });
  container.addEventListener('mouseleave', () => { isPaused = false; scroll(); });

  scroll();
  return () => cancelAnimationFrame(animationId);
}

// 使用示例
const stopScroll = createSeamlessScroll('scroll-container', 'vertical');
// 需要停止时调用 stopScroll()

关键实现原理

  1. 克隆滚动内容并追加到容器末尾
  2. 当原始内容完全滚出可视区域时重置滚动位置
  3. 使用requestAnimationFrame实现平滑动画
  4. 通过判断内容元素的offsetWidth/offsetHeight确定重置点

注意事项

  1. 确保容器设置overflow:hidden
  2. 内容元素需要保持连续(横向需white-space:nowrap)
  3. 移动端可能需要添加touch事件处理
  4. 性能敏感场景建议使用CSS transform替代scrollTop/Left

标签: 代码js
分享给朋友:

相关文章

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现投球

js实现投球

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

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js 实现滚动

js 实现滚动

实现滚动的方法 使用 window.scrollTo() window.scrollTo() 方法可以滚动到文档中的特定位置。可以指定 x 和 y 坐标,或者使用平滑滚动的选项。 // 滚动到指定位…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js 实现超链接

js 实现超链接

使用 HTML 的 <a> 标签 在 JavaScript 中动态创建超链接可以通过操作 DOM 实现。通过 document.createElement 创建一个 <a> 元…