Einführung in CSS Scroll Snap Points

Avatar of Sarah Drasner
Sarah Drasner am

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

Bevor dieses neue CSS, das ich einführen werde, existierte, war das Sperren eines Elements beim Scrollen im Viewport mit etwas JavaScript verbunden. Wie Sie vielleicht wissen, hat JavaScript einen wohlverdienten Ruf dafür, knifflig zu sein, wenn es mit Scroll-Verhalten kombiniert wird.

Die neue CSS Scroll Snap Points Spezifikation verspricht Abhilfe und ermöglicht Verhaltensweisen dieser Art mit sehr wenigen Zeilen CSS.

Wie bei brandneuer Webtechnologie üblich, hat sich diese Spezifikation im Laufe der Zeit verändert. Es gibt „alte“ und „neue“ Eigenschaften und Werte. Vielversprechend ist sie aber dennoch, da die Unterstützung rasant zugenommen hat. Ich zeige Ihnen, wie Sie in dieser Übergangsphase die breiteste Unterstützung erzielen.

Polyfilled Demo

Die untenstehende Demo hat horizontale Scroll-Möglichkeit. Sie ist responsiv: Jedes „Panel“ hat die Breite und Höhe des Viewports (dank vh und vw Einheiten).

Sie verwendet ein Polyfill, aber um es nutzen zu können (und die Unterstützung ist noch gering genug, dass ich es empfehle), müssen Sie die „alten“ Werte unterstützen, weshalb ich auch diese behandeln werde.

Sehen Sie den Pen Simple Responsive Scroll Snap Point Demo von CSS-Tricks (@css-tricks) auf CodePen.

  • Wenn Sie in Firefox schauen: Es hat die beste aktuelle Unterstützung, sodass Sie am klarsten sehen können, wie das native Verhalten aussieht und sich anfühlt.
  • Wenn Sie in Chrome oder Opera schauen: Es gibt keine Unterstützung, daher ist jedes Verhalten, das Sie in diesen Browsern bemerken, ausschließlich dem Polyfill zuzuschreiben.
  • Wenn Sie in Edge oder IE schauen: Wahrscheinlich wird es gar nicht funktionieren. Diese Browser haben teilweise Unterstützung, aber anscheinend nicht genug, um dies zum Laufen zu bringen.
  • Wenn Sie auf einem mobilen Gerät schauen: iOS 9 unterstützt es (getestet auf einem iPhone 6), aber ich habe gesehen, dass das Easing-Verhalten ziemlich seltsam war. Keine Chrome/Android-Unterstützung, aber das Polyfill greift und handhabt es ziemlich gut (getestet auf einem Android Nexus 6).

Beachten Sie, dass ich Autoprefixer im Pen verwende, um mir automatisch alle notwendigen Vendor-Präfix-Eigenschaften geben zu lassen.

Hier ist der Code, mit dem die Magie entsteht

.scroller {
  
  scroll-snap-type: x mandatory;

  /* older spec implementation */
  scroll-snap-destination: 0% 100%;
  scroll-snap-points-x: repeat(100%);
}

.page {
  scroll-snap-align: start;
}

Ziemlich schlank! Lassen Sie uns diese Eigenschaften eine nach der anderen aufschlüsseln.

Aktuelle CSS Scroll Snap Eigenschaften

scroll-snap-type

scroll-snap-type: none | mandatory | proximity; 

Ein mandatory Wert bedeutet, was Sie vielleicht erwarten: Dass das Element zwangsweise auf einem Snap-Punkt zur Ruhe kommt, auch wenn keine aktiven Scroll-Aktionen ausgeführt werden. Wenn der Inhalt irgendwie geändert oder aktualisiert wird, findet die Seite den Snap-Punkt wieder.

Der proximity Wert ist mandatory ähnlich, aber weniger streng. Wenn die Browsergröße geändert wird oder Inhalte hinzugefügt werden, wird der Snap-Punkt möglicherweise wieder gefunden oder auch nicht, je nachdem, wie nah er an einem Snap-Punkt liegt.

Nachdem ich damit herumgespielt habe, scheint mandatory derzeit häufiger in Browsern unterstützt zu werden und ein konsistenteres Verhalten zu zeigen.

scroll-snap-align

scroll-snap-align: [none | start | end | center] [none | start | end | center]; 

Diese Eigenschaft bezieht sich darauf, wie der Scroll-Snap-Rand eines Elements mit seinem übergeordneten Scroll-Container ausgerichtet wird. Sie verwendet zwei Werte, x und y, und wenn Sie nur einen Wert verwenden, wird er als Kurzschreibweise gelesen und für beide Werte wiederholt (ähnlich wie bei Padding, wo padding: 10px; gleich padding: 10px 10px 10px 10px; ist). Diese Eigenschaft ist nicht animierbar.

scroll-snap-align

scroll-snap-paddingscroll-padding

Achtung, scroll-snap-padding wurde umbenannt in scroll-padding.

scroll-snap-padding: <length> | <percentage>;
scroll-padding: <length> | <percentage>;

Diese Eigenschaft bezieht sich auf den Scroll-Container im visuellen Viewport. Sie funktioniert ähnlich wie normales Padding, mit der gleichen Art von Wertreihenfolge. Zum Beispiel würde scroll-padding: 75px 0 0; ein Top-Padding von 75px und alle anderen 0 bedeuten. Diese Eigenschaft ist animierbar, wenn Sie also die Scroll-Snap-Ausrichtung verschieben möchten, wäre dies ein guter Weg.

Ältere CSS Scroll Snap Eigenschaften

Wie erwähnt, hat sich die Spezifikation im letzten Jahr rasant verändert, und es gibt bereits Eigenschaften, die als veraltet gelten, aber aus Gründen der Legacy-Unterstützung immer noch gut zu kennen sind.

scroll-snap-points

scroll-snap-points-<x or y>: none | repeat(<length>); 

 
scroll-snap-point bezieht sich auf die Achse, die die Richtung des Scrollens bestimmt. Im ersten Pen, den wir gesehen haben, ist diese Eigenschaft auf der x-Achse gesetzt. Hier haben wir sie auf der y-Achse (da es sich um ein vertikales Scrollen handelt) mit scroll-snap-points-y: repeat(100%);. Die Prozentsätze beziehen sich auf den Padding-Bereich dessen, was Sie als Scroll-Container definiert haben.

Sehen Sie den Pen Simple Scroll Snap Points von Sarah Drasner (@sdras) auf CodePen.

scroll-snap-destination

Diese Eigenschaft und scroll-snap-coordinate sind sich in Bezug auf die Werte sehr ähnlich. Während sich scroll-snap-destination auf das übergeordnete Element bezieht, bezieht sich scroll-snap-coordinate auf das *Element* selbst. Sie benötigen möglicherweise nur scroll-snap-destination, wenn der Snap-Punkt rein durch das Element und nicht durch den Container, in dem es sich befindet, bestimmt wird.

scroll-snap-destination: <position>;

Diese Eigenschaft ermöglicht es Ihnen, festzulegen, an welchem Punkt im Viewport das Scrollen stoppen soll. Sagen wir zum Beispiel, Sie möchten Ihren Inhalt um 100 Pixel verschieben, sodass ein Panel neben einem anderen hervorgehoben wird. Die folgende Abbildung zeigt, wie die Scroll-Snap-Destination es Ihnen ermöglicht, diesen Parameter einfach anzupassen.

scroll-snap-destination

Wenn als Prozentsatz definiert, bezieht sich der Punkt auf die Breite und Höhe des Scroll-Containers.

scroll-snap-coordinate

Scroll-snap-coordinate: none | <position>;

Diese Eigenschaft ermöglicht es Ihnen anzugeben, wohin das Scrollen zu einem Element erfolgen soll. Der Positionsbetrag bezieht sich auf die Borderbox des Elements. Möglicherweise benötigen Sie sie nicht, es sei denn, Sie führen etwas ziemlich Ausgefallenes durch. scroll-snap-coordinate ist der einzige Wert, der auf alle Elemente auf der Seite angewendet werden kann, alle anderen Scroll-Snap-Eigenschaften gelten nur für Scroll-Container.

scroll-snap-coordinate

Diese letzten beiden Eigenschaften, scroll-snap-destination und scroll-snap-coordinate, sind **animierbare** Eigenschaften, während scroll-snap-type und scroll-snap-pointses nicht sind — was Sinn ergibt.

Weitere Ressourcen

Browser-Unterstützung

Diese Daten zur Browserunterstützung stammen von Caniuse, das weitere Details enthält. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version unterstützt.

Desktop

ChromeFirefoxIEEdgeSafari
696811*7911

Mobil / Tablet

Android ChromeAndroid FirefoxAndroidiOS Safari
12712712711.0-11.2

Fazit

Zum Zeitpunkt dieses Beitrags wurde die Spezifikation vor etwa einem Monat aktualisiert und ist noch in Bewegung. Die Unterstützung ist noch nicht allgegenwärtig, aber selbst wenn Sie die älteren Werte berücksichtigen müssen, die das Polyfill benötigt, ist der Code, um dies zum Laufen zu bringen, klein und nett. Es ist unglaublich spannend zu sehen, was in CSS auf uns zukommt, und wenn Sie Experimente durchführen, lassen Sie es die Spezifikationsautoren wissen, was Sie tun und was Sie finden – es beeinflusst, woran sie arbeiten. Ich bin mir noch nicht sicher, ob ich so etwas in der Produktion verwenden würde. Es würde davon abhängen, wie bereitwillig Sie bereit sind, an diesem Code zu iterieren, wenn sich die Dinge in Zukunft ändern. In der Zwischenzeit leistet das Polyfill jedoch ziemlich gute Arbeit und es ist aufregend, diese Art von Funktion in CSS zu sehen.