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

相关文章

jquery js

jquery js

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

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…