demo · v133

Scrolled progress — scrolled query

The second state — scrolled — matches when the scroll position is away from the top. Pop in a “back to top” affordance and add a heavier sticky-header shadow only once reading has actually started.

scroll inside the pane below

The Reader

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.

the rule

.read-pane { container-type: scroll-state; }
.back-to-top { opacity: 0; pointer-events: none; }
@container scroll-state(scrolled: y) {
  .back-to-top { opacity: 1; pointer-events: auto; }
  h3 { box-shadow: 0 4px 0 black; }
}

This pattern was previously a scroll listener feeding a class on the container. scrolled: y is the declarative equivalent and matches the same instant the browser knows about, with no JS frame cost.

see also