Styling Based on Scroll Position

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Rik Schennink dokumentiert ein System, um CSS-Selektoren schreiben zu können, die eine Seite stylen, wenn sie bis zu einem bestimmten Punkt gescrollt wurde. Wenn Sie so sind wie ich, sind Sie bereits auf der Suche nach document.addEventListener('scroll' ... und haben Angst um die Performance. Rik geht dem sofort auf den Grund, indem er die Funktion sowohl debounct als auch das Event als passive markiert.

Das Endergebnis ist ein data-scroll-Attribut auf dem <html>-Element, das in CSS verwendet werden kann. Das bedeutet, wenn Sie die Seite um 640 Pixel nach unten gescrollt haben, haben Sie <html data-scroll="640"> und könnten einen Selektor wie diesen schreiben:

html:not([data-scroll='0']) {
  padding-top: 3em;
}
html:not([data-scroll='0']) header {
  position: fixed;
}

See the Pen
Writing Dumb JS 🧟‍♂️ and Smart CSS 👩‍🔬
von Rik Schennink (@rikschennink)
auf CodePen.

Leider haben wir in CSS keine Größer als (>) oder Kleiner als (<) Selektoren für Dinge wie nummerierte Attribute, sodass die CSS-Styling-Möglichkeiten hier ziemlich begrenzt sind. Möglicherweise müssen Sie die JavaScript-Funktion letztendlich so anpassen, dass sie andere Klassen oder Datenattribute basierend auf Ihrer Mathematik anwendet. Aber hier sind Sie bereits für gute Performance gerüstet.

„Stile anwenden, wenn der Benutzer vom oberen Rand weggescrollt hat“ ist ein legitimer Anwendungsfall. Das erinnert mich an eine once function (wie wir sie in jQuery haben), bei der jedes Scroll-Ereignis nur einmal ausgelöst und dann nicht wieder. Sie haben gescrollt! Sie sind also per Definition nicht mehr ganz oben! Aber das befasst sich nicht damit, wann sie wieder nach oben scrollen.

Ich finde es generell nützlicher, IntersectionObserver für das Stylen von Dingen basierend auf der Scroll-Position zu verwenden. Damit können Sie Dinge tun wie: „Wurde dieses Element ins Blickfeld oder darüber hinaus gescrollt?“, was allgemein nützlich ist und auch für Dinge verwendet werden kann, die vom oberen Rand weggescrollt werden.

Hier ist ein Beispiel, das eine Klasse hinzufügt oder entfernt, wenn ein Benutzer einen versteckten Pixel passiert hat, der 500 Pixel unterhalb der Seite positioniert ist.

See the Pen
Fixed Header with IntersectionObserver
von Chris Coyier (@chriscoyier)
auf CodePen.

Das ist ebenfalls performant und vermeidet jegliche Scroll-Event-Handler.

Und wo wir gerade von IntersectionObserver sprechen, werfen Sie einen Blick auf „Trust is Good, Observation is Better—Intersection Observer v2“.