Nowości w interfejsie internetowym: podsumowanie konferencji I/O 2025

Opublikowano: 14 sierpnia 2025 r.

Sezon wydarzeń Google I/O dobiega końca. W tym poście podsumowujemy najważniejsze informacje dotyczące CSS i interfejsu internetowego, które zostały przedstawione na naszych wydarzeniach w tym roku.

Niezwykle zaawansowane funkcje, o których deweloperzy kiedyś tylko marzyli, pojawiły się w przeglądarkach i szybciej niż kiedykolwiek wcześniej zyskują kompatybilność z różnymi przeglądarkami. Mimo tych postępów niektóre z najpopularniejszych wzorców interfejsu użytkownika są zaskakująco trudne do prawidłowego wdrożenia. Aby tworzyć komponenty, które powinny być prostsze, często musisz korzystać z frameworków JavaScript, złożonych sztuczek CSS i ogromnych ilości kodu niestandardowego.

Zespół Chrome we współpracy z innymi dostawcami przeglądarek, organizacjami normalizacyjnymi, takimi jak CSSWG i WHATWG, oraz grupami społecznościowymi, takimi jak Open UI, koncentruje się na tym, aby te podstawowe wzorce interfejsu były naprawdę proste do wdrożenia.

Menu wyboru z możliwością dostosowania

Element <select> jest niezbędny w przypadku formularzy, ale jego wewnętrzna struktura była historycznie chroniona przez przeglądarkę, co sprawiało, że spójne i kompleksowe stylowanie CSS było niemal niemożliwe. Aby stworzyć lepszy element <select>, musisz poznać jego elementy składowe: interfejs Popover API i interfejs CSS Anchor Positioning API.

Interfejs Popover API: teraz w Baseline

Niestandardowe menu wymaga pływającego pola z opcjami, które pojawia się nad wszystkimi innymi elementami interfejsu, jest łatwe do zamknięcia i prawidłowo zarządza fokusem. Interfejs Popover API obsługuje wszystkie te elementy, a od tego roku ma stan „Baseline Newly available”, co oznacza, że jest stabilny w każdej głównej przeglądarce.

Browser Support

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

Source

Tworzenie wyskakującego okienka wymaga 2 elementów: elementu wywołującego (np. <button>) i samego wyskakującego okienka. Połącz je, nadając wyskakującemu okienku atrybut id i [popover], a następnie odwołaj się do tego atrybutu id w atrybucie [popovertarget] przycisku.

Interfejs Popover API zarządza całym cyklem życia elementu, zapewniając:

  • Renderowanie na wierzchu: koniec z problemem z kolejnością nakładania elementów.
  • Opcjonalne możliwości lekkiego zamykania: zamyka się, gdy użytkownik kliknie poza obszarem wyskakującego okienka.
  • Automatyczne zarządzanie zaznaczeniem: przeglądarka obsługuje nawigację po kartach w oknie wyskakującym i poza nim.
  • Dostępne powiązania: podstawowy model interakcji jest obsługiwany natywnie.

Ulepszenie elementu <dialog>

Wyskakujące okienko jest przydatne, ale nie zawsze jest najlepszym rozwiązaniem. Na przykład w przypadku interakcji blokujących stronę, które wymagają opinii użytkownika, bardziej odpowiednie jest okno modalne <dialog>.

<dialog> brakowało niektórych funkcji [popover], ale to się zmienia. Dzięki nowemu atrybutowi closedby="any" okna modalne obsługują teraz funkcję lekkiego zamykania, która umożliwia zamknięcie okna, gdy użytkownik kliknie poza nim lub naciśnie klawisz Escape.

Browser Support

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

Source

Dodatkowo wywołania poleceń ([command][commandfor]) zapewniają deklaratywny sposób łączenia przycisku z działaniem, takim jak otwieranie okna za pomocą command="show-modal", bez użycia JavaScriptu.

Browser Support

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

Source

<dialog> Element + closedby=any + wywołania poleceń [popover] atrybut
Główne zastosowanie Interakcja z oknem modalnym (umowy użytkowników, przewodniki itp.) Przejściowy interfejs (menu, etykietki, karty, powiadomienia)
Możliwość zamknięcia przez kliknięcie poza obszarem Tak Tak
Traps Focus Tak Nie
Strona elementów bezwładnych Tak Nie
Aktywacja deklaratywna Tak Tak
Implementacja Element Atrybut
Renderowanie w najwyższej warstwie Tak Tak
W pełni konfigurowalny Tak Tak

Pozycjonowanie kotwicy CSS

Gdy pojawi się wyskakujące okienko, musi być ono umieszczone względem elementu, który je otworzył. Ręczne obliczanie tego za pomocą JavaScriptu jest podatne na błędy i może obniżać wydajność.

Od Chrome 125 możesz używać interfejsu CSS Anchor Positioning API. Ta nowa funkcja deklaratywnie łączy jeden element z innym, automatycznie zmieniając jego położenie, gdy zbliża się do krawędzi ekranu. Ta funkcja jest częścią inicjatywy Interop 2025, która ma na celu wprowadzenie w różnych przeglądarkach najbardziej oczekiwanych funkcji. Oznacza to, że do końca 2025 r. powinna być dostępna we wszystkich głównych przeglądarkach.

Browser Support

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

Source

Pokazuje, jak różne części pozycjonowania elementu zakotwiczonego są powiązane z kodem, np. górna krawędź elementu zakotwiczonego to anchor(top), a prawa krawędź to anchor(right).
Diagram pokazujący pozycjonowanie kotwicy CSS.

Chociaż możesz jawnie połączyć elementy za pomocą właściwości anchor-nameposition-anchor, aktualizacja specyfikacji i Chrome 133 tworzy niejawne powiązanie kotwicy między elementem <popover> a jego wywołującym elementem <button>. To znacznie upraszcza kod i oznacza, że możesz teraz umieścić wyskakujące okienko za pomocą jednego wiersza kodu CSS, np. position-area: bottom span-left.

Narzędzie do kotwic na stronie chrome.dev pokazuje, jak używać position-area, aby uzyskać odpowiednie umiejscowienie:

Pójdź o krok dalej i zdefiniuj alternatywne pozycje za pomocą position-try-fallbacks, aby przeglądarka mogła zmienić położenie kotwic i zapobiec ich znikaniu z ekranu. Ten przykładowy projekt demonstruje wyskakujące okienko, które używa tej właściwości do wbudowanej logiki zmiany pozycji:


Prawdziwie konfigurowalny <select>

W poprzednich wersjach wprowadziliśmy już odpowiednie elementy, a w Chrome 134 pojawiły się wreszcie style natywne dla sieci w przypadku elementów <select>. Obejmuje to nową właściwość appearance, nowe pseudoelementy i element <selectedcontent>.

Aby odblokować dostosowywanie, zastosuj appearance: base-select; do elementu <select> i jego nowego pseudoelementu ::picker(select), który jest kierowany na listę opcji. Udostępnia to nowe wewnętrzne części do stylizacji, w tym:

  • <selectedcontent>: reprezentuje zawartość wybranej opcji wyświetlanej na przycisku.
  • ::picker-icon: ikona strzałki w dół
  • <option>:checked::checkmark: do określania stylu wybranej opcji i jej wskaźnika w postaci znacznika wyboru.
Diagram przedstawiający nowe części elementu select, takie jak ::picker-icon, selectedcontent i ::picker(select).
Elementy dostosowywanego selektora.

Umożliwia to umieszczanie w opcjach treści multimedialnych i precyzyjną kontrolę nad wyświetlaniem. Możesz na przykład wyświetlać ikonę i podtytuł na liście opcji, ale ukrywać je w stanie zamkniętym za pomocą display: none w selectedcontent.


Najlepsze jest to, że ten interfejs API można stopniowo ulepszać. W przeglądarkach, które nie obsługują tych funkcji, użytkownicy nadal będą mogli korzystać z funkcjonalnego elementu wyboru w internecie. Zyskujesz niestandardowy wygląd, zachowując wbudowane funkcje ułatwień dostępu, nawigację za pomocą klawiatury i integrację formularzy natywnego elementu wyboru.

Karuzele

Karuzel można używać w dowolnym miejscu w internecie, nie tylko w sekcjach głównych. Dotyczy to treści przewijanych w poziomie w ciasnych układach, takich jak interfejs sklepu z aplikacjami. Tworzenie karuzel w internecie nadal jest jednak trudne ze względu na wiele kwestii, takich jak zarządzanie stanem, skakanie podczas przewijania, interaktywność i ułatwienia dostępu. Jeśli jednak się nad tym zastanowisz, karuzele to w zasadzie zaawansowane obszary przewijania z dodatkowymi elementami interfejsu.

Pierwsze kroki z przewijaniem

Aby utworzyć karuzelę, zacznij od listy elementów, które nie mieszczą się w kontenerze. Aby ukryć poziomy pasek przewijania, ale zachować możliwość przewijania treści, użyj scrollbar-width: none. Aby przewijanie było „szybkie”, zastosuj też właściwości scroll-snap-typescroll-snap-align, które sprawiają, że elementy wskakują na swoje miejsce podczas przewijania.

Poprzedni i następny z ::scroll-button

Browser Support

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

Source

Nowy pseudoelement ::scroll-button(), który pojawił się w Chrome 135, informuje przeglądarkę, że ma wygenerować stanowe, dostępne przyciski „Dalej” i „Wstecz”. Przeglądarka automatycznie obsługuje prawidłowe role ARIA, kolejność tabulatorów, a nawet wyłącza przyciski, gdy dotrzesz do początku lub końca – wszystko to bez dodatkowego kodu JavaScript.

Aby zainicjować przyciski przewijania, podaj im treść i etykietę ułatwień dostępu, np.:

.carousel {

  &::scroll-button(left) {
    content: "⬅" / "Scroll Previous";
  }
  
  &::scroll-button(right) {
    content: "⮕" / "Scroll Next";
  }
}
Obraz karuzeli z przyciskami po lewej i prawej stronie
Zrzut ekranu prostego przycisku przewijania w poprzedniej wersji demonstracyjnej.

Określ styl tych przycisków i umieść je względem karuzeli nadrzędnej za pomocą pozycjonowania za pomocą kotwicy CSS, które jest zalecanym sposobem na to.

Nawigacja bezpośrednia za pomocą ::scroll-marker

Browser Support

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

Source

W przypadku wskaźników punktowych lub miniaturek pseudoelementy ::scroll-marker i ::scroll-marker-group łączą znaczniki nawigacji bezpośrednio z elementami w kontenerze przewijania. Przeglądarka traktuje grupę jako tablist i obsługuje nawigację za pomocą klawiatury.

Podobnie jak w przypadku przycisków przewijania, inicjuj markery przewijania, włączając je za pomocą właściwości content i podając etykietę ułatwień dostępu. W poniższym przykładzie atrybut danych służy do ustawienia etykiety znacznika przewijania. Dodatkowo umieść znaczniki przewijania w ::scroll-marker-group za pomocą właściwości scroll-marker-group. Na koniec zastosuj styl do aktywnego markera za pomocą nowej klasy pozornej :target-current. Oto przykład, jak może wyglądać podstawowa karuzela:

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

  > li::scroll-marker:target-current {
    background: blue;
  }
}
Obraz karuzeli z wskaźnikami w postaci kropek u dołu
Zrzut ekranu podstawowego znacznika przewijania w poprzedniej wersji demonstracyjnej.

Zapytania dotyczące stanu przewijania

Nowe funkcje CSS związane z przewijaniem pozwalają tworzyć bardziej dynamiczne i interaktywne karuzele. Zapytanie dotyczące stanu przewijania to nowe zapytanie o media, które jest stosowane na podstawie stanu przewijania. Istnieją 3 rodzaje zapytań o stan przewijania, do których można uzyskać dostęp za pomocą znaku scroll-state() w instrukcji @container. Są to:

  • scroll-state(snapped): pasuje, gdy element jest w pozycji „przyciągniętej”. W karuzelach jest to moment, w którym element znajduje się na środku karuzeli.
  • scroll-state(stuck): stylizowanie elementu, np. nagłówka, gdy jego element nadrzędny staje się przyklejony.
  • scroll-state(scrollable): dodaj wskaźniki wizualne, np. efekt zanikania, aby pokazać, że można przewinąć do większej ilości treści.

Wszystko w jednym miejscu

Połączenie nowych elementów karuzeli CSS, zapytań o stan przewijania i pozycjonowania elementów zakotwiczonych ułatwia tworzenie niestandardowych i interaktywnych karuzel. Możesz pójść o krok dalej i zastosować animacje wywoływane przez przewijanie, aby powiązać animacje bezpośrednio z pozycją przewijania. Dzięki temu uzyskasz efekty o wysokiej wydajności, np. skalowanie i zanikanie elementów podczas przewijania do widoku. Animacje te działają poza wątkiem głównym, co zapewnia płynne działanie.


Ten interaktywny karuzel łączy zapytania scroll-state(), ::scroll-button, ::scroll-marker, pozycjonowanie elementu zakotwiczonego CSS i :target-current.

Możesz też użyć nowej właściwości o nazwie interactivity, aby pomóc użytkownikom skupić się na aktywnych treściach. interactivity: inert umożliwia użytkownikowi zastosowanie bezwładności za pomocą CSS, dzięki czemu elementy karuzeli poza ekranem nie są dostępne i są usuwane z drzewa ułatwień dostępu.

Dowiedz się więcej o karuzelach CSS.

Interaktywne wizytówki

Karty najazdowe, czyli bogate wyskakujące okienka, które pojawiają się po najechaniu kursorem myszy na nazwę użytkownika lub link, są niezwykle przydatne, ale ich prawidłowe utworzenie jest bardzo trudne. Zapewnienie prawidłowego działania opóźnień, obsługi zdarzeń i obsługi wielu urządzeń może zająć dedykowanemu zespołowi wiele miesięcy. Pracujemy jednak nad nowym deklaratywnym rozwiązaniem, które powinno raz na zawsze rozwiązać ten problem.

Wyskakujące okienka wywoływane zainteresowaniami z [interestfor]

Podstawą działania deklaratywnych kart informacyjnych jest atrybut[interestfor]. Ta nadchodząca funkcja wykorzystuje możliwości wyskakujących okienek, ale wywołuje je na podstawie „zainteresowania” użytkownika. Na przykład zainteresowanie użytkownika urządzeniem wskazującym może być wyrażone przez najechanie kursorem, nawigację za pomocą klawiatury lub długie naciśnięcie lub kliknięcie ekranu dotykowego. Problem z interakcją na urządzeniach mobilnych nie został jeszcze rozwiązany.

Aby przekształcić wyskakujące okienko oparte na kliknięciu w wyskakujące okienko oparte na zainteresowaniach, utwórz element wywołujący, który może być elementem <button> lub <a>, i nadaj mu atrybut [interestfor] równy atrybutowi id elementu [popover]. W HTML-u wygląda to tak:

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

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

Przeglądarka obsługuje całą złożoną logikę zdarzeń, w tym:

  • Zdarzenia wejścia i wyjścia: najechanie kursorem na urządzeniach z precyzyjnym wskaźnikiem, nawigacja za pomocą klawisza Tab na klawiaturze, długie naciśnięcie lub dotknięcie na urządzeniach z grubym wskaźnikiem.
  • Opóźnienia zdarzeń: kontroluj opóźnienia wejścia i wyjścia za pomocą jednej właściwości CSS.

Ta funkcja obsługuje inne funkcje wyskakujących okienek, takie jak obsługa najwyższej warstwy, w której wyskakujące okienko jest renderowane w nowej warstwie nad resztą drzewa DOM. Powiązania komponentów semantycznych i model drzewa ułatwień dostępu są obsługiwane natywnie.

Style wywołujących zainteresowanie

Wywołania związane z zainteresowaniami obejmują nowe możliwości. Jedną z nich jest możliwość kontrolowania opóźnień wejścia i wyjścia za pomocą właściwości CSS: interest-target-delay. Drugą jest możliwość stylizowania elementu wywołującego na podstawie tego, czy ma on zainteresowanie, czy nie, za pomocą pseudoklasy :has-interest.

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

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


popover="hint" i wielofunkcyjny interfejs,

Kluczowym elementem układanki dla wywoływaczy zainteresowań jest nowy typ wyskakującego okienka: popover="hint". Główna różnica w porównaniu z innymi wyskakującymi okienkami polega na tym, że wyskakujące okienko z podpowiedzią nie zamyka innych wyskakujących okienek po otwarciu. Jest to idealne rozwiązanie w przypadku etykietek lub kart podglądu, które powinny pojawiać się bez zamykania otwartego już menu lub okna czatu.

Browser Support

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

popover=autopopover=manualpopover=hint
Zamknięcie przez kliknięcie poza obszarem lub naciśnięcie klawisza escTakNieTak
Po otwarciu zamyka inne elementy popover=auto.TakNieNie
Po otwarciu zamyka inne elementy popover=hint.TakNieTak
Po otwarciu zamyka inne elementy popover=manual.NieNieNie
Możliwość otwierania i zamykania okna podręcznego za pomocą JavaScriptu (showPopover() lub hidePopover())TakTakTak
Domyślne zarządzanie zaznaczeniem w przypadku następnego punktu zatrzymaniaTakTakTak
Można ukryć lub przełączyć za pomocą popovertargetactionTakTakTak
Można otworzyć w ramach elementu nadrzędnego popover, aby pozostawić go otwartego.TakTakTak

Umożliwia to deklaratywne tworzenie zaawansowanych, wielofunkcyjnych interfejsów. Pojedynczy przycisk może teraz mieć automatycznie wysuwane okienko z użyciem popovertarget jako głównego działania po kliknięciu (np. otwieranie panelu powiadomień) i okienko z podpowiedzią wywoływaną przez zainteresowanie, które wyświetla przydatną etykietkę po najechaniu wskaźnikiem.


Przyszłość jest deklaratywna

Opisane tu funkcje stanowią fundamentalną zmianę w kierunku bardziej zaawansowanej i deklaratywnej platformy internetowej. Pozwalając przeglądarce na wykonywanie złożonej, powtarzalnej pracy związanej z zarządzaniem stanem i dostępnością, możemy usunąć ogromne ilości kodu JavaScript, poprawić wydajność i skupić się na tym, co robimy najlepiej: tworzeniu innowacyjnych i angażujących rozwiązań dla użytkowników. To prawdziwy złoty wiek interfejsów internetowych, a to dopiero początek. Śledź nasze postępy w tworzeniu wydajniejszej i łatwiejszej w obsłudze sieci.

Dodatkowe materiały: