当前位置:首页 > JavaScript

怎么用js实现滚动播放

2026-03-01 23:22:57JavaScript

使用原生JavaScript实现滚动播放

监听滚动事件 通过window.addEventListener监听scroll事件,获取当前滚动位置window.scrollYwindow.pageYOffset。结合requestAnimationFrame优化性能,避免滚动卡顿。

let lastScrollPosition = 0;
function handleScroll() {
  const currentScroll = window.pageYOffset;
  // 滚动方向判断
  const direction = currentScroll > lastScrollPosition ? 'down' : 'up';
  lastScrollPosition = currentScroll;
  requestAnimationFrame(handleScroll);
}
window.addEventListener('scroll', handleScroll);

自动滚动动画 使用window.scrollTo方法配合缓动函数实现平滑滚动。通过递归调用实现连续滚动效果。

function autoScroll(targetY, duration = 1000) {
  const startY = window.pageYOffset;
  const distance = targetY - startY;
  let startTime = null;

  function animation(currentTime) {
    if (!startTime) startTime = currentTime;
    const elapsed = currentTime - startTime;
    const progress = Math.min(elapsed / duration, 1);
    const ease = progress < 0.5 
      ? 2 * progress * progress 
      : 1 - Math.pow(-2 * progress + 2, 2) / 2;

    window.scrollTo(0, startY + distance * ease);
    if (elapsed < duration) requestAnimationFrame(animation);
  }
  requestAnimationFrame(animation);
}

使用CSS动画实现滚动

关键帧动画定义 通过CSS的@keyframes定义滚动动画,结合transform属性实现性能优化的硬件加速动画。

@keyframes scrollAnimation {
  0% { transform: translateY(0); }
  100% { transform: translateY(-100%); }
}

.scroll-container {
  animation: scrollAnimation 10s linear infinite;
  overflow: hidden;
}

动态内容更新 使用JavaScript动态更新内容容器的高度,确保无缝循环滚动。

const container = document.querySelector('.scroll-container');
function updateContent() {
  const firstChild = container.children[0];
  container.appendChild(firstChild.cloneNode(true));
  container.removeChild(firstChild);
}
setInterval(updateContent, 5000);

实现无限循环滚动

DOM节点复用技术 当元素滚动出可视区域时,将其移动到列表末尾,保持DOM节点数量恒定,提高性能。

const list = document.getElementById('infinite-list');
function scrollHandler() {
  const firstItem = list.firstElementChild;
  if (firstItem.getBoundingClientRect().bottom < 0) {
    list.appendChild(firstItem);
  }
}
list.addEventListener('scroll', scrollHandler);

滚动位置重置 当滚动接近底部时,瞬间重置滚动位置到顶部,制造无限循环的假象。

const wrapper = document.querySelector('.infinite-wrapper');
wrapper.addEventListener('scroll', () => {
  if (wrapper.scrollTop >= wrapper.scrollHeight - wrapper.clientHeight) {
    wrapper.scrollTop = 1;
  } else if (wrapper.scrollTop <= 0) {
    wrapper.scrollTop = wrapper.scrollHeight - wrapper.clientHeight - 1;
  }
});

响应式滚动控制

触摸事件处理 添加touchstarttouchmove事件监听器,确保在移动设备上也能正常控制滚动。

let touchStartY = 0;
document.addEventListener('touchstart', (e) => {
  touchStartY = e.touches[0].clientY;
}, { passive: true });

document.addEventListener('touchmove', (e) => {
  const touchY = e.touches[0].clientY;
  const diff = touchStartY - touchY;
  window.scrollBy(0, diff);
  touchStartY = touchY;
}, { passive: false });

滚动节流优化 使用setTimeoutrequestAnimationFrame实现滚动事件节流,防止性能问题。

怎么用js实现滚动播放

let isScrolling = false;
window.addEventListener('scroll', () => {
  if (!isScrolling) {
    isScrolling = true;
    setTimeout(() => {
      // 执行滚动相关操作
      isScrolling = false;
    }, 100);
  }
});

标签: js
分享给朋友:

相关文章

js实现vue

js实现vue

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

js如何实现继承

js如何实现继承

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

js实现验证

js实现验证

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

js 实现滚动

js 实现滚动

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

js 实现图片 放大

js 实现图片 放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性可以实现图片的平滑放大效果。结合 JavaScript 监听鼠标事件控制放大状态: con…

js实现乘法

js实现乘法

实现乘法运算的方法 在JavaScript中实现乘法运算可以通过多种方式完成,以下列举几种常见方法: 基础运算符 直接使用乘法运算符*是最简单的方式: let result = 3 * 5; //…