Neues in der Web-UI: I/O 2025 – Zusammenfassung

Veröffentlicht: 14. August 2025

Die Google I/O-Saison neigt sich dem Ende zu. In diesem Beitrag finden Sie eine Zusammenfassung der wichtigsten Highlights zu CSS und Web-UI, die dieses Jahr auf unseren Veranstaltungen vorgestellt wurden.

Unglaublich leistungsstarke Funktionen, von denen Entwickler früher nur geträumt haben, sind in Browsern verfügbar und erreichen schneller als je zuvor die browserübergreifende Kompatibilität. Trotz dieser Fortschritte ist die korrekte Implementierung einiger der häufigsten UI-Muster jedoch immer noch überraschend schwierig. Oft müssen Sie sich auf JavaScript-Frameworks, komplexe CSS-Tricks und viel benutzerdefinierten Code verlassen, um Komponenten zu erstellen, die eigentlich einfacher sein sollten.

Das Chrome-Team arbeitet mit anderen Browseranbietern, Standardisierungsgremien wie CSSWG und WHATWG sowie Community-Gruppen wie Open UI zusammen, um die Implementierung dieser grundlegenden UI-Muster zu vereinfachen.

Anpassbare Auswahlmenüs

Das <select>-Element ist für Formulare unerlässlich, aber seine interne Struktur wurde in der Vergangenheit vom Browser geschützt, was einheitliches und umfassendes CSS-Styling nahezu unmöglich machte. Um ein besseres <select> zu erstellen, müssen Sie die Bausteine verstehen: die Popover API und die CSS Anchor Positioning API.

Popover API: Jetzt in Baseline

Für ein benutzerdefiniertes Drop-down-Menü ist ein unverankertes Optionsfeld erforderlich, das über allen anderen UI-Elementen angezeigt wird, sich einfach schließen lässt und den Fokus richtig verwaltet. Die Popover API übernimmt all das. Seit diesem Jahr hat sie den Status „Baseline Newly available“ erreicht, d. h., sie ist in allen wichtigen Browsern stabil.

Browser Support

  • Chrome: 114.
  • Edge: 114.
  • Firefox: 125.
  • Safari: 17.

Source

Zum Erstellen eines Pop-overs sind zwei Teile erforderlich: ein Triggerelement (z. B. ein <button>) und das Pop-over-Element selbst. Verbinden Sie sie, indem Sie dem Pop-over das Attribut id und das Attribut [popover] zuweisen und dann im Attribut [popovertarget] der Schaltfläche auf id verweisen.

Die Popover API verwaltet den gesamten Lebenszyklus des Elements und bietet Folgendes:

  • Rendering der obersten Ebene: Z-Index-Konflikte gehören der Vergangenheit an.
  • Optionale Light Dismiss-Funktionen: Das Popover wird geschlossen, wenn ein Nutzer außerhalb des Popover-Bereichs klickt.
  • Automatische Fokusverwaltung: Der Browser übernimmt die Tab-Navigation in und aus dem Popover.
  • Barrierefreie Bindungen: Das zugrunde liegende Interaktionsmodell wird nativ verarbeitet.

Das <dialog>-Element wird aktualisiert

Das Pop-over-Element ist zwar leistungsstark, aber nicht immer die richtige Wahl. Bei seitenblockierenden Interaktionen, die Nutzerfeedback erfordern, ist beispielsweise ein Modal <dialog> besser geeignet.

Bisher fehlten bei <dialog> einige der praktischen Funktionen von [popover], aber das ändert sich. Mit dem neuen Attribut closedby="any" unterstützen modale Dialogfelder jetzt die Funktion „Light Dismiss“. Sie werden geschlossen, wenn der Nutzer außerhalb des Dialogfelds klickt oder die Esc-Taste drückt.

Browser Support

  • Chrome: 134.
  • Edge: 134.
  • Firefox Technology Preview: supported.
  • Safari: not supported.

Source

Außerdem bieten Befehlsaufrufer ([command] und [commandfor]) eine deklarative, JavaScript-kostenlose Möglichkeit, eine Schaltfläche mit einer Aktion zu verknüpfen, z. B. das Öffnen eines Dialogfelds mit command="show-modal".

Browser Support

  • Chrome: 135.
  • Edge: 135.
  • Firefox: behind a flag.
  • Safari Technology Preview: supported.

Source

<dialog>-Element + closedby=any + Befehlsaufrufer [popover] Attribut
Primäre Verwendung Modale Interaktion (Nutzervereinbarungen, Anleitungen usw.) Vorübergehende Benutzeroberfläche (Menüs, Tooltips, Karten, Pop-up-Benachrichtigungen)
Leicht zu schließen Ja Ja
Fokus auf Fallen Ja Nein
Seite „Inerts“ Ja Nein
Deklarative Aktivierung Ja Ja
Implementierung Element Attribut
Renders in Top Layer Ja Ja
Vollständig anpassbar Ja Ja

CSS Anchor Positioning

Wenn ein Pop-over angezeigt wird, muss es relativ zu dem Element positioniert werden, das es geöffnet hat. Die manuelle Berechnung mit JavaScript ist fehleranfällig und kann die Leistung beeinträchtigen.

Ab Chrome 125 können Sie die CSS Anchor Positioning API verwenden. Mit dieser neuen Funktion wird ein Element deklarativ an ein anderes gebunden. Die Neupositionierung wird automatisch vorgenommen, wenn sich das Element dem Bildschirmrand nähert. Diese Funktion ist Teil von Interop 2025, einer browserübergreifenden Initiative zur Einführung häufig nachgefragter Funktionen. Wir gehen davon aus, dass sie bis Ende 2025 in allen wichtigen Browsern verfügbar sein wird.

Browser Support

  • Chrome: 125.
  • Edge: 125.
  • Firefox: not supported.
  • Safari: not supported.

Source

Es wird gezeigt, wie verschiedene Teile der Ankerpositionierung mit dem Code zusammenhängen. So ist beispielsweise die obere Kante des Ankers „anchor(top)“ und die rechte Kante „anchor(right)“.
Diagramm zur CSS-Ankerpositionierung.

Sie können Elemente zwar explizit mit den Attributen anchor-name und position-anchor verknüpfen, aber durch eine Aktualisierung der Spezifikation und in Chrome 133 wird eine implizite Ankerbeziehung zwischen einem <popover> und dem zugehörigen <button> erstellt. Dadurch wird der Code erheblich vereinfacht. Sie können das Pop-over jetzt mit einer einzigen CSS-Zeile positionieren, z. B. position-area: bottom span-left.

Im Ankertool auf chrome.dev wird gezeigt, wie Sie position-area verwenden, um die gewünschte Platzierung zu erzielen:

Sie können den Browser auch dazu bringen, Ihre Anker neu zu positionieren, damit sie nicht außerhalb des Bildschirms liegen. Dazu definieren Sie Fallbacks mit position-try-fallbacks. Im folgenden Demobeispiel wird ein Pop-over gezeigt, das diese Eigenschaft für die integrierte Neupositionierungslogik verwendet:


Ein wirklich anpassbares <select>

Nachdem diese Bausteine in früheren Versionen eingeführt wurden, ist das webnative Styling für <select>-Elemente nun in Chrome 134 verfügbar. Dazu gehören das neue Attribut appearance, neue Pseudoelemente und das <selectedcontent>-Element.

Um die Anpassung zu ermöglichen, wenden Sie appearance: base-select; auf das <select>-Element und sein neues ::picker(select)-Pseudoelement an, das auf die Drop-down-Liste mit Optionen ausgerichtet ist. Dadurch werden neue interne Teile für das Styling verfügbar, darunter:

  • <selectedcontent>: Stellt den Inhalt der ausgewählten Option dar, die auf der Schaltfläche angezeigt wird.
  • ::picker-icon: Das Drop-down-Pfeilsymbol
  • <option>:checked und ::checkmark: Zum Formatieren der ausgewählten Option und des zugehörigen Häkchensymbols
Diagramm mit neuen Teilen von „select“, z. B. „::picker-icon“, „selectedcontent“ und „::picker(select)“.
Teile der anpassbaren Auswahl.

So können Sie Optionen mit Rich Content erstellen und die Darstellung präzise steuern. Sie können beispielsweise ein Symbol und einen Untertitel in der Optionsliste anzeigen, aber im geschlossenen Zustand mit display: none innerhalb von selectedcontent ausblenden.


Das Beste daran ist, dass diese API schrittweise verbessert werden kann. In Browsern, die diese Funktionen nicht unterstützen, wird Nutzern weiterhin eine funktionale native Webauswahl angezeigt. Sie erhalten ein benutzerdefiniertes Erscheinungsbild und behalten gleichzeitig die integrierte Barrierefreiheit, Tastaturnavigation und Formularintegration des webnativen select-Elements bei.

Karussells

Karussells sind überall im Web zu finden, nicht nur in Hero-Bereichen. Dazu gehören auch horizontal scrollbare Inhalte in kompakten Layouts wie der Benutzeroberfläche eines App-Stores. Das Erstellen von Karussells im Web ist jedoch immer noch schwierig, da viele Aspekte wie Statusverwaltung, Scroll-Jank, Interaktivität und Barrierefreiheit berücksichtigt werden müssen. Wenn man genauer darüber nachdenkt, sind Karussells im Grunde nur scrollbare Bereiche mit zusätzlichen UI-Elementen.

Erste Schritte mit Scrollern

Um ein Karussell zu erstellen, beginnen Sie mit einer Liste von Elementen, die ihren Container überlaufen. Wenn Sie die horizontale Scrollleiste ausblenden, aber die Inhalte weiterhin scrollbar halten möchten, verwenden Sie scrollbar-width: none. Damit sich das Scrollen „schnell“ anfühlt, wenden Sie außerdem scroll-snap-type und scroll-snap-align an. So werden Elemente beim Scrollen des Nutzers eingerastet.

Vorherige und nächste mit einem ::scroll-button

Browser Support

  • Chrome: 135.
  • Edge: 135.
  • Firefox: not supported.
  • Safari: not supported.

Source

Das neue ::scroll-button()-Pseudoelement, das in Chrome 135 eingeführt wurde, weist den Browser an, statusbehaftete, barrierefreie Schaltflächen „Weiter“ und „Zurück“ zu generieren. Der Browser kümmert sich automatisch um die richtigen ARIA-Rollen und die Tab-Reihenfolge und deaktiviert sogar die Schaltflächen, wenn Sie den Anfang oder das Ende erreichen – alles ohne zusätzliches JavaScript.

Um die Scrollschaltflächen zu initialisieren, müssen Sie ihnen Inhalt und ein zugängliches Label geben:

.carousel {

  &::scroll-button(left) {
    content: "⬅" / "Scroll Previous";
  }
  
  &::scroll-button(right) {
    content: "⮕" / "Scroll Next";
  }
}
Bild eines Karussells mit Schaltflächen für links und rechts
Screenshot der einfachen Scroll-Schaltfläche in der vorherigen Demo.

Gestalten Sie diese Schaltflächen und positionieren Sie sie relativ zum übergeordneten Karussell mit der CSS-Ankerpositionierung. Das ist die empfohlene Vorgehensweise.

Direkte Navigation mit ::scroll-marker

Browser Support

  • Chrome: 135.
  • Edge: 135.
  • Firefox: not supported.
  • Safari: not supported.

Source

Bei Punktindikatoren oder Thumbnails werden die Pseudoelemente ::scroll-marker und ::scroll-marker-group verwendet, um Navigationsmarkierungen direkt mit den Elementen im Scrollcontainer zu verknüpfen. Der Browser behandelt die Gruppe wie ein tablist und übernimmt die Tastaturnavigation.

Ähnlich wie bei Scrollschaltflächen müssen Sie die Scrollmarkierungen mit dem Attribut content aktivieren und ein zugängliches Label angeben. Im folgenden Beispiel wird ein Datenattribut verwendet, um das Label für die Scrollmarkierung festzulegen. Außerdem müssen Sie die Scrollmarkierungen mit der Property scroll-marker-group im ::scroll-marker-group positionieren. Zum Schluss können Sie die aktive Markierung mit der neuen Pseudoklasse :target-current gestalten. Hier ist ein Beispiel für ein einfaches Karussell:

.carousel {
  scroll-marker-group: after;
  
  > li::scroll-marker {
    content: ''/ attr(data-name);
  }

  > li::scroll-marker:target-current {
    background: blue;
  }
}
Bild eines Karussells mit Punktindikatoren unten
Screenshot der einfachen Scrollmarkierung in der vorherigen Demo.

Abfragen zum Scrollstatus

Mit den neuen scrollbezogenen CSS-Funktionen lassen sich dynamischere und interaktivere Karussells erstellen. Die scroll-state-Abfrage ist eine neue Media-Abfrage, die je nach Status eines Scrollers angewendet wird. Es gibt drei verschiedene Arten von Scrollstatus-Abfragen, auf die mit scroll-state() in einer @container-Anweisung zugegriffen werden kann. Diese sind:

  • scroll-state(snapped): Wird ausgelöst, wenn sich ein Element in der „eingerasteten“ Position befindet. Bei Karussells ist das der Fall, wenn das Bild in der Mitte des Karussells angezeigt wird.
  • scroll-state(stuck): Damit können Sie ein Element wie eine Überschrift formatieren, wenn das übergeordnete Element fixiert wird.
  • scroll-state(scrollable): Fügen Sie visuelle Hinweise wie ein Fade-out hinzu, um zu zeigen, dass es weitere Inhalte gibt, zu denen gescrollt werden kann.

Zusammenfassung

Eine Kombination aus neuen CSS-Karussell-Primitiven, Scrollstatusabfragen und Ankerpositionierung erleichtert das Erstellen benutzerdefinierter und interaktiver Karussells. Mit scrollgesteuerten Animationen können Sie Animationen direkt mit der Scrollposition verknüpfen und so leistungsstarke Effekte erzielen, z. B. dass Elemente skaliert und ein- oder ausgeblendet werden, wenn sie in den sichtbaren Bereich gescrollt werden. Diese Animationen werden außerhalb des Haupt-Threads ausgeführt, was für ein flüssiges Nutzererlebnis sorgt.


Dieses interaktive Karussell kombiniert scroll-state()-Anfragen, ::scroll-button, ::scroll-marker, CSS-Ankerpositionierung und :target-current.

Außerdem können Sie die neue Property interactivity verwenden, damit sich Nutzer auf die aktiven Inhalte konzentrieren. Mit interactivity: inert kann der Nutzer mit CSS die Inaktivität anwenden. Dadurch werden Karussell-Elemente außerhalb des sichtbaren Bildschirmbereichs nicht mehr fokussierbar und aus dem Barrierefreiheitsbaum entfernt.

Weitere Informationen zu CSS-Karussells

Interaktive Kurzinfos

Hovercards – die umfangreichen Pop-ups, die angezeigt werden, wenn Sie den Mauszeiger auf einen Nutzernamen oder Link bewegen – sind unglaublich nützlich, aber notorisch schwierig zu erstellen. Die Verzögerungen, die Ereignisverarbeitung und die Unterstützung mehrerer Geräte richtig zu implementieren, kann ein eigenes Team Monate kosten. Wir arbeiten jedoch an einer neuen deklarativen Lösung, die dieses Problem ein für alle Mal beheben soll.

Pop-overs mit [interestfor], die durch Interesse ausgelöst werden

Das Attribut[interestfor]ist das Herzstück der deklarativen Kurzinfos. Diese Funktion bietet die Vorteile von Pop-overs, löst sie aber basierend auf dem „Interesse“ des Nutzers aus. Das Nutzerinteresse an einem Zeigegerät kann sich beispielsweise in einem Mouse-Over, einer Tab-Navigation mit einer Tastatur oder einem langen Drücken oder Tippen auf Touchscreens äußern. Die mobile Interaktion muss noch behoben werden.

Wenn Sie ein klickbasiertes Pop-over in ein interessenbasiertes Pop-over umwandeln möchten, erstellen Sie ein aufrufendes Element, das ein <button> oder ein <a> sein kann, und weisen Sie ihm ein [interestfor]-Attribut zu, das dem id des [popover]-Elements entspricht. So sieht das in HTML aus:

<button interestfor="profile-callout">
  ...
</button>

<div id="profile-callout" popover>
 ...
</div>

Der Browser verarbeitet die gesamte komplexe Ereignislogik, einschließlich:

  • Eintritts- und Austrittsereignisse:Hover-Eintritt auf Geräten mit feinem Zeiger, Tab-Navigation mit der Tastatur, langes Drücken oder Berühren auf Geräten mit grobem Zeiger.
  • Ereignisverzögerungen:Mit einer einzigen CSS-Eigenschaft können Sie die Ein- und Ausstiegsverzögerungen steuern.

Dieses Feature unterstützt andere Popover-Funktionen wie die Unterstützung der obersten Ebene, bei der das Popover auf einer neuen Ebene über dem Rest des DOM-Baums gerendert wird. Die semantischen Komponentenbindungen und das zugrunde liegende Barrierefreiheitsbaummodell werden nativ verarbeitet.

Aufrufer gestalten

Für die Auslöser für Interessen gibt es einige neue Funktionen. Eine davon ist die Möglichkeit, Ein- und Ausstiegsverzögerungen mit einer CSS-Property zu steuern: interest-target-delay. Außerdem lässt sich das aufrufende Element mithilfe der Pseudoklasse :has-interest formatieren, je nachdem, ob es Interesse weckt oder nicht.

[interesttarget] {
  interest-target-delay: 0s 1s;

  &:has-interest {
    background: yellow;
  }
}


popover="hint" und multifunktionale Benutzeroberfläche

Ein wichtiger Baustein für Interesse weckende Inhalte ist ein neuer Pop-over-Typ: popover="hint". Der Hauptunterschied zu anderen Pop-overs besteht darin, dass ein Hinweis-Pop-over beim Öffnen keine anderen Pop-overs schließt. Das ist ideal für Tooltips oder Vorschaukarten, die angezeigt werden sollen, ohne dass ein bereits geöffnetes Menü oder Chatfenster geschlossen wird.

Browser Support

  • Chrome: 133.
  • Edge: 133.
  • Firefox: not supported.
  • Safari: not supported.

popover=autopopover=manualpopover=hint
Leichtes Schließen (durch Klicken außerhalb des Pop-ups oder durch Drücken der esc-Taste)JaNeinJa
Schließt andere popover=auto-Elemente, wenn es geöffnet wirdJaNeinNein
Schließt andere popover=hint-Elemente, wenn es geöffnet wirdJaNeinJa
Schließt andere popover=manual-Elemente, wenn es geöffnet wirdNeinNeinNein
Pop-over kann mit JS (showPopover() oder hidePopover()) geöffnet und geschlossen werdenJaJaJa
Standardmäßiges Fokusmanagement für den nächsten TabstoppJaJaJa
Kann mit popovertargetaction ausgeblendet oder ein- und ausgeblendet werdenJaJaJa
Kann innerhalb des übergeordneten popover geöffnet werden, damit das übergeordnete Element geöffnet bleibtJaJaJa

So können Sie leistungsstarke, multifunktionale Benutzeroberflächen deklarativ erstellen. Eine einzelne Schaltfläche kann jetzt ein automatisches Pop-over für die primäre Klickaktion (z. B. zum Öffnen eines Benachrichtigungsbereichs) mit popovertarget und ein Pop-over mit einem Hinweis zum Aufrufen von Interessen haben, um einen hilfreichen Tooltip beim Bewegen des Mauszeigers einzublenden.


Die Zukunft ist deklarativ

Die hier behandelten Funktionen stellen eine grundlegende Änderung hin zu einer leistungsstärkeren und deklarativen Webplattform dar. Wenn wir dem Browser die komplexe, sich wiederholende Arbeit der Statusverwaltung und Barrierefreiheit überlassen, können wir Unmengen an JavaScript entfernen, die Leistung verbessern und uns auf das konzentrieren, was wir am besten können: innovative und ansprechende Nutzererlebnisse schaffen. Wir befinden uns in einem goldenen Zeitalter für Web-UIs und das ist erst der Anfang. Hier erfahren Sie, wie wir ein leistungsstarkes und noch nutzerfreundlicheres Web schaffen.

Weitere Ressourcen: