- From: pumpkinsandpies via GitHub <sysbot+gh@w3.org>
- Date: Fri, 01 Nov 2024 14:17:49 +0000
- To: public-css-archive@w3.org
For anyone still stuck on this, this is the implementation I was able to come up with:
```typescript
export const scrollToElementWithCallback = (
element: HTMLElement,
callback: () => void,
arg?: boolean | ScrollIntoViewOptions,
): void => {
const eventListenerCB = () => {
console.debug("scrollToElementWithCallback: Still scrolling");
clearTimeout(timer);
timer = setTimeout(timerCB, 50);
};
const timerCB = () => {
console.debug(
"scrollToElementWithCallback: Scrolling done, calling callback",
);
callback();
document.removeEventListener("scroll", eventListenerCB);
};
let timer = setTimeout(timerCB, 50);
document.addEventListener("scroll", eventListenerCB);
element.scrollIntoView(arg);
};
```
Rationale behind this and implementation details
- Initial Setup:
- Scroll Event Listener Registration:
When the function is called, it immediately attaches a `scroll` event listener (`eventListenerCB`) to the `document`.
- Timer Initialization:
It also sets up a timer (`timer`) that is scheduled to execute the callback function (`timerCB`) after a specified delay (50 milliseconds by default).
- Start Scrolling:
The `element.scrollIntoView(arg)` method is called to begin scrolling the target element into view.
- Scroll Event Listener Behavior:
- Resetting the Timer:
Every time a scroll event is detected, the scroll event listener clears the existing timer and starts a new one. This resetting indicates that scrolling is still in progress.
- Rationale:
As long as scrolling is occurring, scroll events will continue to fire. By resetting the timer with each scroll event, it's ensured that the callback is not called prematurely.
- Determining Scroll Completion:
- Timer Expiration:
Once scrolling has stopped, no further scroll events will be fired. Consequently, the timer will not be reset and will eventually expire after the 50-millisecond delay.
- Callback Execution:
When the timer expires, it calls the provided callback function.
- Cleanup:
The scroll event listener is removed from the `document` to prevent unintended behavior.
Final Note
- Delay Before Callback:
The callback will be executed within a maximum of 50 milliseconds after scrolling has stopped (or whatever delay you choose).
- Adjustable Timer:
The 50-millisecond delay is an arbitrary value that balances responsiveness with performance. You can adjust this value based on your specific requirements, but keep in mind that a shorter delay might lead to the callback being called prematurely and cause performance issues, while a longer delay could make the application feel less responsive.
--
GitHub Notification of comment by Asomeones222
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/3744#issuecomment-2451949981 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Friday, 1 November 2024 14:17:50 UTC