v151 · input · pointer events
Wheel event momentum
After a fling, many platforms keep firing wheel events to simulate scroll inertia — long after the user's finger has left the trackpad. The momentum attribute marks exactly those synthesized events (true), so a page can finally tell platform inertia apart from the rest of the wheel stream (physical input, synthesized events on uninstrumented platforms, and script events all read false) and stop reacting to phantom scrolls.
at a glance
| Milestone listing | Chrome 151 — Enabled by default |
|---|---|
| Feature detail | Desktop 151, Android 151; status text “Proposed” (detail updated 2026-07-06) |
| Surface | One attribute (WheelEvent.momentum) and one dictionary member (WheelEventInit.momentum) |
| Runtime feature | WheelEventMomentum — status stable at trunk (crbug.com/40704952) |
| Standards body | W3C Pointer Events (Editor's Draft) — WheelEvent |
| ChromeStatus | 6631012282007552 — Wheel event momentum |
Member reference
The developer-facing surface is exactly two items, documented together on one stable page with all nine dimensions (syntax, inputs, outputs, errors, context, lifecycle, examples, compatibility, and security/privacy):
WheelEvent.momentum—truewhen the platform synthesized the event to simulate scroll inertia after the physical interaction endedWheelEventInit.momentum— the matching constructor dictionary member (defaults tofalse)
Why it exists
Trackpads fling: the physical gesture ends, but the OS keeps the scroll gliding with synthesized wheel events. Pages that react to every wheel event — carousels, maps, custom scrollers — cannot tell these inertia events from real user input, so they keep responding after the user has let go. A boolean on the event itself ends the guessing games (velocity heuristics, timeouts): when momentum is true, the event was synthesized by the platform to simulate inertia; when false, the spec says only “otherwise” — it does not establish physical input (a script-constructed event also initializes to false, and uninstrumented platforms report false throughout).
Runtime qualification: in Chromium the value is mapped from the platform event as momentum_phase != kPhaseNone (the Blink unit test injects kPhaseBegan /kPhaseChanged /kPhaseNone to pin the mapping). The implementation CL records that manual testing on Linux did not surface the value in JS — “maybe because of platform limitations” — and landed with extra tracing to investigate other platforms in Dev/Canary builds. Real hardware/OS behavior (which platforms and devices actually emit momentum phases) therefore needs Chrome 151+ hardware evidence; this reference does not claim it.
Examples
// Stop a custom scroller from reacting to inertia-only events.
scroller.addEventListener("wheel", (event) => {
if (event.momentum) return; // platform inertia after the fling — ignore
event.preventDefault();
scroller.scrollBy(0, event.deltaY);
}, { passive: false });
// Feature-detect before relying on it:
const supported = "momentum" in WheelEvent.prototype;
Source: Pointer Events — WheelEvent interface; Sample (CodePen, from the ChromeStatus entry)
Browser compatibility
| Engine / runtime | Support | Notes |
|---|---|---|
| Chrome | 151 | Matches the Chrome 151 milestone listing (Enabled by default); detail desktop + Android 151; Chrome for Android and WebView (Android + iOS) are BCD mirrors |
| Edge | mirror | BCD mirrors Chrome's data |
| Firefox | Not supported | BCD version_added: false (Firefox for Android mirrors); the ChromeStatus entry records a Positive signal |
| Safari | Not supported | BCD version_added: false (Safari on iOS mirrors); the ChromeStatus entry records No signal |
| Deno / Node.js | Unknown | No BCD entries as of 2026-07-26 (DOM event API; not a server-side surface) |
Support rows are from BCD only. Separately, vendor signals come from the ChromeStatus API feature record (checked 2026-07-26): Firefox “Positive”, Safari “No signal”, web developers “Positive” (as labelled on the ChromeStatus feature entry). There is no behavioral WPT test for momentum as of 2026-07-26: the pinned tree at commit 1985b47 contains exactly two momentum declarations — the WebIDL surface itself in interfaces/pointerevents.idl (lines 90 and 98) — and no behavioral .html/.js test was found.
Specifications
| Specification | Status |
|---|---|
| W3C Pointer Events — WheelEvent interface | Editor's Draft (normative attribute + dictionary member text); landed via w3c/pointerevents PR #643 (merged) |
Note: the ChromeStatus entry's spec link anchors to #dom-wheelevent-momentum and BCD's spec link anchors to #dom-wheeleventinit-momentum — neither resolves in the current draft (the attribute has no dedicated anchors); the resolvable section is #interface-wheelevent (linked above and throughout this reference).
See also
- crbug.com/40704952 — implementation tracking; Chromium runtime_enabled_features.json5 (
WheelEventMomentum, stable) - Sample — CodePen demo (from the ChromeStatus entry)
- MDN — WheelEvent (general interface; no
momentumcoverage as of 2026-07-26) - Chrome Platform Showcase — Wheel event momentum (also: feature detect)