You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用JavaScript预判鼠标滚轮触发时滚动条的像素滚动量

JavaScript Scroll Solutions: Initial Scroll Position, Scroll Delta, and Preemptive Element Position Detection

Hey there! Let's break down your three scroll-related questions with practical code examples and explanations you can drop right into your project.

1. Get the Initial Scroll Position When the Mouse Wheel Starts Scrolling

To capture the exact pixel position where a user begins scrolling with their mouse wheel, listen for the wheel event—it fires the moment the scroll action initiates. We’ll add a small guard to avoid duplicate triggers during continuous scrolling:

let isScrollInitiated = false;
let initialScrollPosition;

window.addEventListener('wheel', (e) => {
  if (!isScrollInitiated) {
    // Cross-browser compatible scroll position
    initialScrollPosition = window.scrollY || document.documentElement.scrollTop;
    console.log(`Scroll started at: ${initialScrollPosition}px`);
    isScrollInitiated = true;
  }
});

// Reset the flag when scrolling stops (debounced with a timeout)
window.addEventListener('scroll', () => {
  clearTimeout(window.scrollEndTimer);
  window.scrollEndTimer = setTimeout(() => {
    isScrollInitiated = false;
  }, 150); // Adjust this timeout based on how quickly you want to detect "scroll end"
});

This captures the first scroll position when the wheel moves, and resets once the user stops scrolling for 150ms.

2. Calculate the Vertical Scrollbar's Pixel Movement

To track how many pixels the scrollbar moves during each scroll action, compare the current scroll position to the last recorded position in the scroll event:

let lastScrollPosition = window.scrollY || document.documentElement.scrollTop;

window.addEventListener('scroll', () => {
  const currentScrollPosition = window.scrollY || document.documentElement.scrollTop;
  // Positive = scrolling down, negative = scrolling up
  const scrollDelta = currentScrollPosition - lastScrollPosition;
  
  console.log(`Scrollbar moved: ${scrollDelta}px`);
  
  // Update position for the next scroll event
  lastScrollPosition = currentScrollPosition;
});

This gives you real-time feedback on exactly how far the user has scrolled with each movement.

3. Preemptively Detect When an Element's offsetTop Will Fall Between 200px and 1000px

Quick note: offsetTop refers to an element’s position relative to its closest positioned parent (not the entire document). If you need the element’s position relative to the document, calculate the total offset first.

To preemptively detect when the element’s position enters the 200px–1000px range:

  1. Calculate the scroll range that will trigger the position change
  2. Listen for scroll events and trigger logic before the element enters the range

Step 1: Calculate Total Document Offset (if needed)

If your element’s parent is positioned, use this function to get its total offset from the document top:

function getTotalDocumentOffset(element) {
  let totalOffset = 0;
  let currentElement = element;
  while (currentElement) {
    totalOffset += currentElement.offsetTop;
    currentElement = currentElement.offsetParent;
  }
  return totalOffset;
}

Step 2: Preemptive Detection Logic

const targetElement = document.getElementById('your-element-id');
// Get element's total offset from the document top
const elementTotalOffset = getTotalDocumentOffset(targetElement);
// Define your target offset range
const targetMin = 200;
const targetMax = 1000;

// Calculate scroll positions to trigger early warning
const preTriggerBuffer = 100; // Trigger 100px before the element enters the range
const scrollStartTrigger = elementTotalOffset - targetMax - preTriggerBuffer;
const scrollEndTrigger = elementTotalOffset - targetMin + preTriggerBuffer;

window.addEventListener('scroll', () => {
  const currentScroll = window.scrollY || document.documentElement.scrollTop;
  
  // Check if we're approaching the target range
  if (currentScroll >= scrollStartTrigger && currentScroll <= scrollEndTrigger) {
    console.log('Warning: Element is about to enter the 200px–1000px offsetTop range!');
    // Execute preemptive logic here (e.g., preload content, prepare animations)
  }

  // Optional: Real-time check if element is currently in the range
  const currentElementOffsetTop = targetElement.offsetTop;
  if (currentElementOffsetTop >= targetMin && currentElementOffsetTop <= targetMax) {
    console.log('Element is currently in the target offsetTop range');
  }
});

Adjust the preTriggerBuffer to control how early you want the preemptive signal—this lets you prepare actions before the element actually enters the desired range.


内容的提问来源于stack exchange,提问作者Dip Parmar

火山引擎 最新活动