Hinweise zur Scrollbarkeit

Übersicht

Visuelle Hinweise wie Schatten oder Farbverläufe helfen Nutzern zu erkennen, dass sie scrollen können, um mehr Inhalte zu sehen. In diesem Leitfaden erfahren Sie, wie Sie diese Hinweise mit CSS-container-scroll-state-queries erstellen. So können Sie Elemente basierend auf dem scrollbaren Status ihres Containers formatieren, ohne auf JavaScript-Scroll-Listener oder -Observer angewiesen zu sein.

Implementierung

1. Scroll-Container einrichten

Der Scrollcontainer muss als Scrollstatus-Abfragecontainer deklariert werden.

.scroller {
  overflow-y: auto;
  /* Establish this element as a scroll-state query container */
  container-type: scroll-state;
  position: relative;
}

2. Indikatoren gestalten

Platzieren Sie die Indikatorelemente (z. B. Schatten, Farbverläufe oder Pfeile) im Container und gestalten Sie sie. Standardmäßig sollten sie nicht sichtbar sein. Wenn sie angezeigt werden, sollten sie nicht interaktiv sein. Legen Sie dazu pointer-events: none fest.

.indicator-top, .indicator-bottom {
  position: sticky;
  left: 0;
  right: 0;
  height: 20px;
  opacity: 0;
  transition: opacity 0.2s;
  pointer-events: none; /* Let clicks pass through */
}

.indicator-top {
  top: 0;
  background: linear-gradient(to bottom, rgba(0,0,0,0.2), transparent); /* Example: Shadow */
}

.indicator-bottom {
  bottom: 0;
  background: linear-gradient(to top, rgba(0,0,0,0.2), transparent); /* Example: Shadow */
}

3. Scrollstatus abfragen

Verwenden Sie die Regel @container mit der Funktion scroll-state. Prüfen Sie, ob der Container nach oben oder unten scrollbar ist, um die entsprechende Anzeige einzublenden.

/* Show top indicator when the user can scroll up */
@container scroll-state(scrollable: top) {
  .indicator-top {
    opacity: 1;
  }
}

/* Show bottom indicator when the user can scroll down */
@container scroll-state(scrollable: bottom) {
  .indicator-bottom {
    opacity: 1;
  }
}

Fallback-Strategien

Einfacher Fallback

Wenn die Funktion nicht unterstützt wird, bleiben die Anzeigen unsichtbar. Da es sich hierbei um Hinweise handelt, die für die Funktionalität nicht entscheidend sind, ist es akzeptabel, sie in nicht unterstützten Browsern wegzulassen.

Erweiterter Fallback (Intersection Observer)

Wenn die Hinweise erforderlich sind, verwenden Sie einen IntersectionObserver, um Klassen umzuschalten, wenn sich Sentinel-Elemente oben und unten im Scroller in den Scrollport hinein- und herausbewegen.

<!-- Sentinel elements placed at the ends of the scroller -->
<div class="sentinel-top"></div>
<!-- Content goes here -->
<div class="sentinel-bottom"></div>
/* Marker styling to ensure it does not affect layout */
.sentinel-top, .sentinel-bottom {
  height: 0;
  width: 0;
  visibility: hidden;
}

.scroller.scrolled-down .indicator-top {
  opacity: 1;
}

.scroller.can-scroll-down .indicator-bottom {
  opacity: 1;
}
if (!CSS.supports('container-type', 'scroll-state')) {
  const topSentinel = document.querySelector('.sentinel-top');
  const bottomSentinel = document.querySelector('.sentinel-bottom');
  const scroller = document.querySelector('.scroller');

  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.target === topSentinel) {
        // If top sentinel is not intersecting, we have scrolled down
        scroller.classList.toggle('scrolled-down', !entry.isIntersecting);
      }
      if (entry.target === bottomSentinel) {
        // If bottom sentinel is intersecting, we reached the bottom
        scroller.classList.toggle('can-scroll-down', !entry.isIntersecting);
      }
    });
  }, { root: scroller });

  observer.observe(topSentinel);
  observer.observe(bottomSentinel);
}