2021-10-19 07:43:41
在 JavaScript 中处理鼠标滚轮事件主要通过 wheel 事件实现,结合兼容性处理、性能优化和用户体验设计,可实现高效交互。以下是具体实现方法与注意事项:
1. 基本实现使用 document.addEventListener('wheel', callback) 监听滚轮事件,通过 event.deltaY 判断滚动方向(正值向下,负值向上),event.preventDefault() 阻止默认行为:
document.addEventListener('wheel', (event) => { event.preventDefault(); const deltaY = event.deltaY; if (deltaY > 0) { console.log('向下滚动'); } else { console.log('向上滚动'); }});2. 兼容性处理旧版浏览器可能不支持 wheel 事件,需兼容 mousewheel(IE/WebKit)和 DOMMouseScroll(Firefox):
function handleWheel(event) { event.preventDefault(); const delta = event.deltaY || event.wheelDelta || -event.detail; // 统一方向判断 if (delta > 0) { console.log('向下滚动'); } else { console.log('向上滚动'); }}document.addEventListener('wheel', handleWheel);document.addEventListener('mousewheel', handleWheel);document.addEventListener('DOMMouseScroll', handleWheel);3. 性能优化(1)使用 requestAnimationFrame对复杂计算或 DOM 操作,通过 requestAnimationFrame 优化帧率(约 60fps):
let lastScrollTime = 0;document.addEventListener('wheel', (event) => { event.preventDefault(); const currentTime = performance.now(); if (currentTime - lastScrollTime > 16) { // 16ms ≈ 60fps lastScrollTime = currentTime; requestAnimationFrame(() => { const deltaY = event.deltaY; if (deltaY > 0) console.log('向下滚动'); else console.log('向上滚动'); }); }});(2)节流(Throttling)限制事件触发频率,避免快速滚动导致性能问题:
let isScrolling = false;document.addEventListener('wheel', (event) => { event.preventDefault(); if (!isScrolling) { isScrolling = true; setTimeout(() => { isScrolling = false; const deltaY = event.deltaY; if (deltaY > 0) console.log('向下滚动'); else console.log('向上滚动'); }, 100); // 每 100ms 处理一次 }});4. 用户体验优化处理鼠标滚轮事件的核心步骤:
通过合理设计,可实现流畅、高效的交互效果,同时避免兼容性和性能问题。