Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Verwendung von Container-Scrollstatus-Abfragen

Container-Scrollstatus-Abfragen sind eine Art von Container-Abfragen. Anstatt Stile auf Nachkommenelemente basierend auf der Größe des Containers selektiv anzuwenden, ermöglichen Scrollstatus-Abfragen, Stile basierend auf dem Scrollstatus des Containers selektiv anzuwenden. Dies kann umfassen, ob der Container teilweise gescrollt ist, an einen Vorfahren mit Scroll Snap Container geschnappt ist oder mit position: sticky positioniert ist und an einer Grenze eines Scrollcontainers Vorfahren haftet.

Dieser Artikel erklärt, wie Container-Scrollstatus-Abfragen verwendet werden, indem er ein Beispiel für jeden Typ durchgeht. Es wird vorausgesetzt, dass Sie die Grundlagen von Container-Abfragen kennen. Wenn Sie neu bei Container-Abfragen sind, lesen Sie CSS Container Queries, bevor Sie fortfahren.

Arten von Container-Scrollstatus-Abfragen

Es gibt drei @container Deskriptoren, die Sie in einer scroll-state() Abfrage verwenden können:

  • scrollable: Fragt ab, ob ein Container in die gegebene Richtung über benutzerinitiierte Scrollvorgänge gescrollt werden kann (zum Beispiel durch Ziehen des Scrollbalkens oder Verwendung einer Trackpad-Geste). Mit anderen Worten, gibt es in der gegebenen Richtung überlaufende Inhalte, zu denen gescrollt werden kann? Dies ist nützlich, um Stile in Bezug auf die Scrollposition eines Scrollcontainers anzuwenden. Zum Beispiel könnten Sie einen Hinweis anzeigen, der dazu ermutigt, nach unten zu scrollen, um mehr Inhalte zu sehen, wenn der Scrollbalken oben ist, und ihn ausblenden, wenn der Benutzer tatsächlich zu scrollen begonnen hat.
  • scrolled: Fragt ab, ob ein Container zuletzt in die gegebene Richtung gescrollt wurde. Dadurch können Sie Stile basierend auf der Scrollrichtung des Benutzers selektiv anwenden, zum Beispiel eine obere Menüleiste, die nur angezeigt wird, wenn der Benutzer nach oben scrollt.
  • snapped: Fragt ab, ob ein Container im Begriff ist, an einen Vorfahren mit Scroll Snap Container entlang einer gegebenen Achse geschnappt zu werden. Dies ist nützlich, um Stile anzuwenden, wenn ein Element an einen Scroll Snap Container geschnappt wird. Zum Beispiel könnten Sie ein geschnapptes Element auf irgendeine Weise hervorheben oder einige seiner Inhalte zeigen, die zuvor versteckt waren.
  • stuck: Fragt ab, ob ein Container mit einem position Wert von sticky an eine Kante seines Scrollcontainer-Vorfahren haftet. Dies ist nützlich, um position: sticky-Elemente anders zu stylen, wenn sie haften — zum Beispiel könnten Sie ihnen ein anderes Farbschema oder Layout geben.

Syntaxübersicht

Um ein Containerelement als Scrollstatus-Abfrage-Container festzulegen, setzen Sie die container-type Eigenschaft mit einem Wert von scroll-state. Sie können ihm optional auch einen container-name geben, damit Sie es mit einer spezifischen Container-Abfrage ansprechen können:

css
.container {
  container-type: scroll-state;
  container-name: my-container;
}

Sie können dann einen @container Block erstellen, der die Abfrage spezifiziert, die Regeln, die auf die Kinder des Containers angewendet werden, wenn der Test besteht, und optional den container-name der Container, die Sie abfragen möchten. Wenn Sie keinen container-name angeben, wird die Container-Abfrage auf alle Scrollstatus-Abfragen-Container auf der Seite angewendet.

Hier fragen wir nur Container mit dem Namen my-container ab, um zu bestimmen, ob der Container in Richtung seiner oberen Kante gescrollt werden kann:

css
@container my-container scroll-state(scrollable: top) {
  /* CSS rules go here */
}

Hinweis: Um Scrollstatus-Abfragen von anderen Container-Abfragen zu trennen, werden die Scrollstatus-Deskriptoren und -Werte in Klammern gesetzt, vorangestellt von scroll-state (scroll-state( ... )). Diese Konstrukte sehen aus wie Funktionen, sind es aber nicht.

Verwendung von scrollable Abfragen

Scrollstatus-scrollable Abfragen, geschrieben als scroll-state(scrollable: <keyword>), testen, ob ein Containerfilter in die gegebene Richtung über benutzergeführtes Scrollen gescrollt werden kann. Wenn nicht, ergibt die Abfrage false.

Der Schlüsselwortwert gibt die Richtung an, für die Sie die Scrollverfügbarkeit testen, zum Beispiel:

  • top: Testet, ob der Container in Richtung seiner oberen Kante gescrollt werden kann.
  • inline-end: Testet, ob der Container in Richtung seiner Inline-Ende-Kante gescrollt werden kann.
  • y: Testet, ob der Container in einer oder beiden Richtungen entlang seiner y-Achse gescrollt werden kann.

Wenn der Test bestanden wird, werden die Regeln im @container Block auf die Nachkommen des passenden Scrollcontainers angewendet.

Schauen wir uns ein Beispiel an, bei dem wir einen scrollenden Container voller Inhalte haben und einen praktischen kleinen Link, um zurück nach oben zu scrollen, wenn gewünscht. Wir verwenden eine scrollable Abfrage, um den Link nur anzuzeigen, wenn der Benutzer begonnen hat, durch den Inhalt nach unten zu scrollen.

HTML

Im HTML haben wir ein <article> Element, das genügend Inhalte enthält, um das Dokument zum Scrollen zu bringen, vorangestellt von einem Link-zurück-nach-oben:

html
<a class="back-to-top" href="#" aria-label="Top of page">↑</a>
<article>
  <h1>Reader with container query-controlled "back-to-top" link</h1>
  <section>
    <header>
      <h2>This first section is interesting</h2>

      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </header>

    ...
  </section>

  ...
</article>

Ein Großteil des HTML-Codes wurde zur Kürze ausgeblendet.

CSS

Der .back-to-top Link erhält einen position Wert von fixed, wird in die untere rechte Ecke des Viewports gesetzt und außerhalb des Viewports mit einem translate Wert von 80px 0 verschoben. Ein transition Wert animiert das translate und background-color, wenn sich einer der beiden Werte ändert.

css
.back-to-top {
  width: 64px;
  height: 64px;
  color: white;
  text-align: center;
  position: fixed;
  bottom: 10px;
  right: 10px;
  translate: 80px 0;
  transition:
    0.4s translate,
    0.2s background-color;
}

Der Scrollcontainer in diesem Beispiel ist das <html> Element selbst, das als ein Scrollstatus-Abfrage-Container mit einem container-type Wert von scroll-state bezeichnet wird. Der container-name ist nicht unbedingt erforderlich, kann jedoch nützlich sein, wenn der Code zu einem Codebase hinzugefügt wird, das mehrere Scrollstatus-Abfrage-Container enthält, die mit verschiedenen Abfragen gezielt angesprochen werden.

css
html {
  container-type: scroll-state;
  container-name: scroller;
}

Als nächstes definieren wir einen @container Block, der den Container-Namen angibt, der von dieser Abfrage anvisiert wird, und die Abfrage selbst — scrollable: top. Diese Abfrage wendet die innerhalb des Blocks enthaltenen Regeln nur dann an, wenn das <html> Element nach oben gescrollt werden kann — mit anderen Worten, wenn der Container zuvor nach unten gescrollt wurde. In diesem Fall wird translate: 0 0 auf den .back-to-top Link angewendet, wodurch er zurück auf den Bildschirm verschoben wird.

css
@container scroller scroll-state(scrollable: top) {
  .back-to-top {
    translate: 0 0;
  }
}

Der Rest des Beispiel-CSS ist der Kürze halber ausgeblendet.

Ergebnis

Versuchen Sie, das Dokument nach unten zu scrollen, und beachten Sie, wie der "zurück-nach-oben"-Link als Ergebnis erscheint, der sich aufgrund des transition sanft von der rechten Seite des Viewports einblendet. Wenn Sie durch Aktivieren des Links oder manuelles Scrollen zurück nach oben scrollen, bewegt sich der "zurück-nach-oben"-Link wieder aus dem Bildschirm.

Verwendung von scrolled Abfragen

Scrollstatus-scrolled Abfragen, geschrieben als scroll-state(scrolled: <keyword>), testen, ob ein Container-Vorfahre zuletzt in die gegebene Richtung gescrollt wurde. Wenn nicht, ergibt die Abfrage false.

Der Schlüsselwortwert gibt die Richtung an, die Sie testen. Zum Beispiel:

  • block-start: Testet, ob der Container zuletzt in Richtung seiner Block-Start-Kante gescrollt wurde.
  • right: Testet, ob der Container zuletzt in Richtung seiner rechten Kante gescrollt wurde.
  • y: Testet, ob der Container zuletzt auf oder ab entlang der y-Achse gescrollt wurde.
  • none: Testet, ob der Container kein Scrollcontainer ist oder seit dem Rendern nicht in irgendeine Richtung gescrollt wurde.

Wenn der Test true ergibt, werden die Regeln im @container Block auf die Nachkommen des passenden Scrollcontainers angewendet.

Sehen wir uns ein Beispiel mit einem Scrollcontainer und einer scrolled Abfrage an, die obere und untere Inhalts-"Balken" nur dann anzeigt, wenn der Benutzer nach oben oder unten scrollt.

HTML

In unserem HTML haben wir ein <article> Element, das genügend Inhalte enthält, um das Dokument zum Scrollen zu bringen, vorangestellt von zwei <div> Elementen, die unsere oberen und unteren "Balken" darstellen:

html
<div class="bar" id="top-bar">You're currently scrolling towards the top.</div>
<div class="bar" id="bottom-bar">
  You're currently scrolling towards the bottom.
</div>
<article>
  <h1>Document with scrolled container query</h1>
  <section>
    <header>
      <h2>This first section is interesting</h2>

      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </header>

    ...
  </section>

  ...
</article>

Ein Großteil des HTML-Codes wurde zur Kürze ausgeblendet.

CSS

Die "Balken" erhalten ein einfaches Styling. Am wichtigsten ist, dass sie einen position Wert von fixed erhalten, den wir mit left und right Werten von beiden Seiten versetzen.

css
.bar {
  border-radius: 10px;
  border: 1px solid black;
  background-color: #00000099;
  padding: 10px;
  color: white;
  text-shadow: 1px 1px 1px black;
  display: flex;
  justify-content: center;
  align-items: center;

  position: fixed;
  left: 5px;
  right: 5px;
}

Anschließend setzen wir negative top und bottom Längenwerte auf die oberen und unteren Balken, sodass sie standardmäßig über und unter dem Viewport verborgen sind. Wir fügen ein transition hinzu, um sie bei Änderung ihrer translate Werte sanft einzublenden.

css
#top-bar {
  top: -50px;
  transition: 0.6s translate;
}

#bottom-bar {
  bottom: -50px;
  transition: 0.6s translate;
}

Der Scrollcontainer in diesem Beispiel ist das <html> Element selbst, das als Scrollstatus-Abfrage-Container mit einem container-type Wert von scroll-state bezeichnet wird. Der container-name ist nicht unbedingt erforderlich, aber nützlich, wenn eine Codebasis über mehrere Scrollstatus-Abfrage-Container verfügt, die mit verschiedenen Abfragen gezielt angesprochen werden.

css
html {
  container-type: scroll-state;
  container-name: scroller;
}

Als nächstes definieren wir zwei @container Blöcke, die beide den Container-Namen scroller anvisieren. Der erste Block definiert eine Abfrage scrolled: block-end und der zweite eine Abfrage scrolled: block-start. Diese Abfragen wenden die in ihrem Block enthaltenen Regeln nur dann an, wenn das <html> Element zuletzt in Richtung seiner Block-Ende-Kante oder Block-Start-Kante gescrollt wurde. Mit anderen Worten, wenn der Container nach unten oder oben gescrollt wird. Wenn eine dieser Bedingungen wahr wird, erhält der Balken, der sich im Block befindet, einen translate Wert, der ihn auf den Bildschirm verschiebt. Der Balken im @condition, der nicht mehr wahr ist, bewegt sich aus dem Bildschirm.

css
@container scroller scroll-state(scrolled: block-start) {
  #top-bar {
    translate: 0 55px;
  }
}

@container scroller scroll-state(scrolled: block-end) {
  #bottom-bar {
    translate: 0 -55px;
  }
}

Der Rest des Beispiel-CSS ist der Kürze halber ausgeblendet.

Ergebnis

Versuchen Sie, das Dokument hoch- und runterzuscrollen, und beachten Sie, wie die verschiedenen Balken als Ergebnis erscheinen und sich sanft ein- und ausblenden.

Verwendung von snapped Abfragen

Relevant nur, wenn Scrollsnap implementiert ist, testen Scrollstatus-snapped Abfragen, geschrieben als scroll-state(snapped: <keyword>), ob ein Container an einen Vorfahren mit Scroll Snap Container entlang der gegebenen Achse geschnappt werden soll. Wenn nicht, ergibt die Abfrage false.

Der Schlüsselwortwert gibt in diesem Fall die Richtung an, in der Sie die Fähigkeit des Elements testen, zu schnappen, zum Beispiel:

  • x: Testet, ob der Container horizontal an seinen Scroll-Snap-Container-Vorfahren geschnappt wird.
  • inline: Testet, ob der Container in der Inline-Richtung an seinen Scroll-Snap-Container-Vorfahren geschnappt wird.
  • y: Testet, ob der Container in beiden Richtungen an seinen Scroll-Snap-Container-Vorfahren geschnappt wird.

Um einen Container mit einer nicht-none snapped Scrollstatus-Abfrage auszuwerten, muss er ein Container mit einem Scroll-Snap-Container-Vorfahren sein, d.h. der Vorfahre hat einen scroll-snap-type Wert, der nicht none ist. Die Container-Abfrage scroll-state(snapped: none) entspricht Scrollstatus-Containern, die keinen Scrollcontainer-Vorfahren haben.

Die Auswertung erfolgt, wenn das scrollsnapchanging Ereignis am Scroll Snap Container ausgelöst wird.

Wenn der Test besteht, werden die Regeln im @container Block auf die Nachkommen des passenden Scroll-Snap-Zielcontainers angewendet.

In diesem Beispiel schauen wir uns einen Scroll-Snap-Container mit Kindern an, die vertikal an ihn schnappen und verwenden eine snapped Abfrage, um die Kinder nur dann zu stylen, wenn sie geschnappt sind oder gerade geschnappt werden sollen.

HTML

Das HTML besteht aus einem <main> Element, das ein Scroll Snap Container sein wird. Darin befinden sich mehrere <section> Elemente, die Snap-Ziele sein werden. Jedes <section> enthält einen Wrapper-<div> und eine <h2> Überschrift. Die Wrapper sind enthalten, um ein Stilziel zu erstellen, da Container-Abfragen das Stylen von Nachkommen eines Containers ermöglichen, nicht des Containers selbst.

html
<main>
  <section>
    <div class="wrapper">
      <h2>Section 1</h2>
    </div>
  </section>

  ...
</main>

Ein Großteil des HTML-Codes wurde zur Kürze ausgeblendet.

CSS

Wir setzen einen overflow Wert von scroll und eine feste height auf das <main> Element, um es in einen vertikalen Scrollcontainer zu verwandeln. Wir setzen auch einen scroll-snap-type Wert von y mandatory auf <main>, um es in einen Scroll-Snap-Container zu konvertieren, an den Snap-Ziele entlang der y-Achse geschnappt werden; mandatory bedeutet, dass immer an ein Snap-Ziel geschnappt wird.

css
main {
  overflow: scroll;
  scroll-snap-type: y mandatory;
  height: 450px;
  width: 250px;
  border: 3px solid black;
}

Die <section> Elemente werden als Snap-Ziele benannt, indem sie einen nicht-none scroll-snap-align Wert erhalten. Der center Wert bedeutet, dass sie am Container an ihren Mittelpunktspunkten geschnappt werden.

css
section {
  font-family: "Helvetica", "Arial", sans-serif;
  width: 150px;
  height: 150px;
  margin: 50px auto;

  scroll-snap-align: center;
}

Wir möchten, dass die <section> Elemente abgefragt werden können. Insbesondere möchten wir testen, ob die <section> Elemente im Prozess sind, an ihren Container zu schnappen, daher kennzeichnen wir sie als Scrollstatus-Abfrage-Container durch Setzen eines container-type Werts von scroll-state. Wir geben ihnen auch einen container-name, der nicht unbedingt erforderlich ist, aber nützlich sein wird, wenn unser Code später komplexer wird und wir mehrere Scrollstatus-Abfrage-Container haben, die mit verschiedenen Abfragen gezielt angesprochen werden sollen.

css
section {
  container-type: scroll-state;
  container-name: snap-container;
}

Als nächstes definieren wir einen @container Block, der den Container-Namen festlegt, den wir mit dieser Abfrage anvisieren, und die Abfrage selbst — snapped: y. Diese Abfrage wendet die im Block enthaltenen Regeln nur an, wenn ein <section> Element vertikal an seinen Container geschnappt wird. Wenn dies der Fall ist, wenden wir einen neuen background und color auf das <section> Element's Kind-.wrapper <div> an, um es hervorzuheben.

css
@container snap-container scroll-state(snapped: y) {
  .wrapper {
    background: purple;
    color: white;
  }
}

Ergebnis

Das gerenderte Ergebnis wird unten gezeigt. Versuchen Sie, den Container hoch und runter zu scrollen, und beachten Sie, wie sich der Stil des <section> ändert, wenn es an seinen Container geschnappt wird.

Verwendung von stuck Abfragen

Scrollstatus-stuck Abfragen, geschrieben als scroll-state(stuck: <keyword>), testen, ob ein Container mit einem position Wert von sticky an eine Kante seines Scrollcontainer-Vorfahren haftet. Wenn nicht, ergibt die Abfrage false.

Der Schlüsselwortwert gibt in diesem Fall die Kante des Scrollcontainers an, die Sie testen, zum Beispiel:

  • top: Testet, ob der Container an der oberen Kante seines Scrollcontainer-Vorfahren haftet.
  • block-end: Testet, ob der Container an der Block-Ende-Kante seines Scrollcontainer-Vorfahren haftet.
  • none: Testet, ob der Container an keiner Kante seines Scrollcontainer-Vorfahren haftet. Beachten Sie, dass none Abfragen auch dann übereinstimmen, wenn der Container nicht position: sticky auf diesem gesetzt hat.

Wenn die Abfrage true ergibt, werden die Regeln im @container Block auf die Nachkommen des passenden position: sticky Containers angewendet.

Sehen wir uns ein Beispiel an, bei dem wir einen scrollenden Container mit überlaufenden Inhalten haben, in dem die Überschriften auf position: sticky gesetzt sind und an der oberen Kante des Containers haften, wenn sie an dieser Position scrollen. Wir verwenden eine stuck Scrollstatus-Abfrage, um die Überschriften anders zu stylen, wenn sie an der oberen Kante haften.

HTML

Im HTML haben wir ein <article> Element, das genügend Inhalte enthält, um das Dokument zum Scrollen zu bringen. Es ist mit mehreren <section> Elementen strukturiert, die je einen <header> mit verschachtelten Inhalten enthalten:

html
<article>
  <h1>Sticky reader with scroll-state container query</h1>
  <section>
    <header>
      <h2>This first section is interesting</h2>

      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </header>

    ...
  </section>

  <section>
    <header>
      <h2>This one, not so much</h2>

      <p>Confecta res esset.</p>
    </header>

    ...
  </section>

  ...
</article>

Ein Großteil des HTML-Codes wurde zur Kürze ausgeblendet.

CSS

Jedes <header> hat einen position Wert von sticky und einen top Wert von 0, wodurch sie an der oberen Kante des Scrollcontainers haften. Um zu testen, ob die <header> Elemente an der oberen Kante des Containers haften, werden sie als Scrollstatus-Abfrage-Container mit einem container-type Wert von scroll-state bezeichnet. Der container-name ist nicht unbedingt erforderlich, kann jedoch nützlich sein, wenn dieser Code zu einer Codebasis mit mehreren Scrollstatus-Abfrage-Containern hinzugefügt wird, die mit verschiedenen Abfragen gezielt angesprochen werden.

css
header {
  background: white;
  position: sticky;
  top: 0;
  container-type: scroll-state;
  container-name: sticky-heading;
}

Wir geben den <h2> und <p> Elementen innerhalb der <header> Elemente auch ein grundlegendes Styling und einen transition Wert, damit sie sanft animiert werden, wenn sich ihre background-Werte ändern.

css
h2,
header p {
  margin: 0;
  transition: 0.4s background;
}

h2 {
  padding: 20px 5px;
  margin-bottom: 10px;
}

header p {
  font-style: italic;
  padding: 10px 5px;
}

Als nächstes definieren wir einen @container Block, der den Container-Namen festlegt, den wir mit dieser Abfrage anvisieren, und die Abfrage selbst — stuck: top. Diese Abfrage wendet die innerhalb des Blocks enthaltenen Regeln nur an, wenn ein <header> Element an der oberen Kante seines Scrollcontainers haftet. Wenn dies der Fall ist, wird ein anderes background und ein box-shadow auf die enthaltene <h2> und <p> angewendet.

css
@container sticky-heading scroll-state(stuck: top) {
  h2,
  p {
    background: #cccccc;
    box-shadow: 0 5px 2px #00000077;
  }
}

Der Rest des CSS wurde der Kürze halber ausgeblendet.

Ergebnis

Versuchen Sie, das Dokument nach unten und oben zu scrollen, und beachten Sie, wie die <h2> und <p> Elemente in ein neues Farbschema übergehen, wenn sie an der oberen Kante ihres Containers haften.

Siehe auch