当前位置:首页 > JavaScript

js实现无缝滚动代码

2026-04-04 11:14:13JavaScript

js实现无缝滚动代码

js实现无缝滚动代码

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

横向无缝滚动

<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实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…