From 648af40e8b2dffa2bdad21ce9eeb53f5c16779f5 Mon Sep 17 00:00:00 2001
From: Tab Atkins
- Changes in DOM elements above the visible region of a
- scrolling box
- can result in the page moving while the user is in the middle of consuming the content.
-
- This spec proposes a mechanism to mitigate this jarring user experience by
- keeping track of the position of an anchor node and adjusting the scroll
- offset accordingly.
-
- This spec also proposes an API for web developers to opt-out of this behavior.
-
- Standardizing this proposal is tracked by a WICG interventions issue.
-
- Today, users of the web are often distracted by content moving around due to
- changes that occur outside the viewport. Examples include script inserting an
- iframe containing an ad, or non-sized images loading on a slow network.
-
- Historically the browser's default behavior has been to preserve the absolute
- scroll position when such changes occur. This means that to avoid shifting
- content, the webpage can attempt to reserve space on the page for anything
- that will load later. In practice, few websites do this consistently.
-
- Scroll anchoring aims to minimize surprising content shifts. It does this by
- adjusting the scroll position to compensate for the changes outside the
- viewport.
-
- The explainer
- document gives an informal overview of scroll anchoring.
-
- Scroll anchoring works by selecting a DOM node (the anchor node) whose
- movement is used to determine adjustments to the scroll position.
-
- Each scrolling box
- aims to select an anchor node that is deep in the DOM and close to the
- block start edge of its
- optimal viewing region.
-
- The anchor node is either a non-anonymous
- block box
- or a text node.
- The anchor node is always a descendant
- of the scrolling box.
- In some cases, a scrolling box may not select any anchor node.
-
- The anchor node selection algorithm for a scrolling box S
- is as follows:
- Scroll Anchoring Has Migrated to the CSSWG
- Introduction
- Description
- Anchor Node Selection
-
-
- The candidate examination algorithm for a candidate
- DOM node N in a scrolling box S is as follows:
-
-
-
-
-
- Conceptually, a new anchor node is computed for every scrolling box whenever the scroll position of - any scrolling box changes. (As a performance optimization, the implementation may wait until the - anchor node is needed before computing it.) -
-- A DOM node N is an excluded subtree if it is an element and any of the following conditions - holds: -
- A DOM node N is fully visible in a scrolling box S if its - scroll anchoring bounding rect is entirely within the - optimal viewing region - of S. -
-- A DOM node N is fully clipped in a scrolling box S if its - scroll anchoring bounding rect is entirely outside the - optimal viewing region - of S. -
-- A DOM node N is partially visible in a scrolling box S if it - is neither fully visible in S nor fully clipped in S. -
-- The scroll anchoring bounding rect of a DOM node N - is its scrollable overflow rectangle - if N is a block box, or the bounding rect of its - line boxes if N is a text node. -
- -
- If an anchor node was selected, then when the anchor node moves,
- the browser computes the previous offset y0
, and the current offset y1
,
- of the block start edge of the anchor node's scroll anchoring bounding rect,
- relative to the block start edge of the scrolling content in the
- block
- flow direction of the scroller.
-
- It then queues an adjustment to the scroll position
- of y1 - y0
, in the block flow direction, to be performed at the end of the
- suppression window.
-
- The scroll adjustment is a type of - scrolling as defined by - CSSOM View Module, and generates - scroll events - in the manner described there. -
-- Every movement of an anchor node occurs within a window of time called the - suppression window, defined as follows: -
- At the end of a suppression window, the user agent performs all scroll - adjustments that were queued during the window and not suppressed by any - suppression trigger during the window. -
-- A suppression trigger is an operation that - suppresses the scroll anchoring adjustment for an anchor node movement, if it - occurs within the suppression window for that movement. These triggers are: -
- Scroll anchoring aims to be the default mode of behavior when launched, so that
- users benefit from it even on legacy content. A CSS property
- overflow-anchor
can disable
- scroll anchoring in part or all of a webpage (opt out), or exclude portions
- of the DOM from the anchor node selection algorithm.
- This property supports the following values when applied to an element E:
-
overflow-anchor: auto
(the default value) declares
- that the DOM subtree rooted at E is eligible to participate in the
- anchor
- node selection algorithm for any scrolling box created by E or an ancestor of E.
- overflow-anchor: none
- declares that the DOM subtree rooted at E is not eligible to
- participate in the anchor node selection algorithm
- for any scrolling box created by E or an ancestor of E.
- overflow-anchor
property was also proposed (with different values) for
- CSS Sticky Scrollbars,
- which has now been
- superseded.
-
- The overflow-anchor
property is not inherited.
-
The Scroll Anchoring spec has graduated from the WICG, + and is now