The scrollend event fires when element scrolling has completed. Learn addEventListener vs onscrollend, how it pairs with scroll, when it does not fire, feature detection for older browsers, and five try-it labs.
01
Kind
Instance event
02
Type
Event
03
When
Scrolling finished
04
Handler
onscrollend
05
Bubbles?
No
06
Status
Baseline newly available
Fundamentals
Introduction
scrollend answers: “Has scrolling on this element fully stopped?” Scrolling is complete when there are no more pending scroll position updates and the user has finished their gesture.
That includes wheel scrolling, keyboard scrolling, scroll-snap, and APIs that change scroll position. Touch panning and trackpad scrolling are not complete until pointers or keys are released. If the scroll position never changed, scrollend does not fire.
💡
Beginner tip
Use scroll for continuous updates (progress bars, live offsets). Use scrollend for one-shot work when motion stops—snap UI, save position, or run a final calculation.
Concept
Understanding scrollend
An instance event that answers: “Did scrolling finish on this element?”
Trigger — scroll completed (gesture done, no pending position updates).
Event type — generic Event; read final position from the element.
Does not bubble — attach to the scrolling element.
No fire if unchanged — if offset did not move, no scrollend.
Baseline Newly available on MDN (since December 2025).
Foundation
📝 Syntax
Use the event name with addEventListener, or set the handler property:
scrollend is marked Baseline Newly available on MDN (since December 2025). Logos use the shared browser-image-sprite.png sprite from this project. Feature-detect and keep a debounced scroll fallback for older browsers.
✓ Baseline · Newly available
Element scrollend
Fires when scrolling has completed; Chrome 114+, Firefox 109+, Safari 26.2+, Edge 114+, Opera 100+.
NewNewly available
Google Chrome114+
Supported
Mozilla Firefox109+
Supported
Apple Safari26.2+
Supported
Microsoft Edge114+
Supported
Opera100+
Supported
Internet ExplorerNot supported
Unavailable
scrollendBaseline 2025
Bottom line: Listen on the scrolling element, pair with scroll for live updates, and feature-detect for older Safari / Chromium builds.
Wrap Up
Conclusion
scrollend is the standard signal that an element’s scrolling has finished. Attach it to the scrolling target, read the final offsets, and feature-detect when you still support older browsers.
Use scroll for live updates and scrollend for stop work
Feature-detect with "onscrollend" in window
Read final scrollTop / scrollLeft in the handler
Prefer addEventListener for multiple handlers
❌ Don’t
Expect scrollend if the offset never changed
Expect the event to bubble from a child scroller
Put heavy continuous UI work only on scrollend (use scroll)
Skip a fallback on older browsers still in your audience
Overwrite onscrollend if you need multiple listeners
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about scrollend
Scrolling finished—listen on the scroller, then do one-shot work.
5
Core concepts
📱01
On end
scroll finished
Trigger
📄02
Event
read final offset
API
⇄03
vs scroll
many vs one
Compare
🔎04
Detect
onscrollend in window
Compat
🎯05
Baseline
newly available 2025
Status
❓ Frequently Asked Questions
It fires when element scrolling has completed—no more pending scroll position updates and the user’s gesture is finished. Use it when you need a stop signal, not continuous scroll updates.
No. MDN marks Element scrollend as Baseline Newly available (since December 2025). It is not Deprecated, Experimental, or Non-standard.
A generic Event (not a specialized ScrollEvent). Read the final scroll position from the element via scrollTop, scrollLeft, and related properties.
No. If the scroll position did not change, scrollend does not fire.
MDN notes that touch panning and trackpad scrolling are not complete until pointers or keys have been released.
scroll fires whenever the offset changes (often many times). scrollend fires once scrolling has finished. Pair them: scroll for live feedback, scrollend for final work.
Did you know?
Before scrollend was widely available, developers often debounced scroll with setTimeout to guess when scrolling stopped. Native scrollend is the reliable replacement when supported.