Nowości w CSS i interfejsie: edycja I/O 2023

Ostatnie miesiące były złotym okresem dla interfejsu internetowego. Nowe możliwości platformy zostały stworzone z myślą o ścisłej rozpowszechnieniu nowej platformy w różnych przeglądarkach, co daje dostęp do większej niż dotąd możliwości internetowych i funkcji dostosowywania.

Oto 20 najbardziej ekscytujących i skutecznych funkcji, które zostały już wprowadzone lub wkrótce pojawią się w Google Ads:

Nowy responsywny

Zacznijmy od nowych funkcji projektowania responsywnego. Nowe funkcje platformy umożliwiają tworzenie logicznych interfejsów z komponentami, które mają własne informacje o stylu responsywnym, tworzenie interfejsów wykorzystujących możliwości systemu, aby zapewnić bardziej natywny interfejs użytkownika, oraz umożliwiają użytkownikom udział w procesie projektowania dzięki zapytaniom o preferencje, które zapewniają pełną możliwość dostosowania.

Zapytania dotyczące kontenerów

Obsługa przeglądarek

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 110.
  • Safari: 16.

Źródło

Zapytania dotyczące kontenerów są od niedawna stabilne we wszystkich nowoczesnych przeglądarkach. Umożliwiają one zapytanie o rozmiar i styl elementu nadrzędnego, aby określić style, które należy zastosować do jego elementów podrzędnych. Zapytania o multimedia mogą uzyskiwać dostęp tylko do informacji z widocznego obszaru, co oznacza, że mogą działać tylko w ramach makroprzeglądu układu strony. Z drugiej strony zapytania kontenera to dokładniejsze narzędzie, które może obsługiwać dowolną liczbę układów lub układów w układach.

W tym przykładzie skrzynki odbiorczej panele boczne Główna skrzynka odbiorcza i Ulubione są kontenerami. E-maile w nich dostosowują układ siatki i wyświetlają lub ukrywają sygnaturę czasową e-maila w zależności od dostępnej przestrzeni. To dokładnie ten sam komponent na stronie, ale wyświetlany w różnych widokach

Ponieważ mamy zapytanie dotyczące kontenera, style tych komponentów są dynamiczne. Jeśli dostosujesz rozmiar i układ strony, komponenty dostosują się do przydzielonej im przestrzeni. Pasek boczny zmienia się w górny pasek z większą ilością miejsca i widzimy, że układ wygląda bardziej jak główna skrzynka odbiorcza. Gdy jest mniej miejsca, oba formaty wyświetlają się w zwięzłej postaci.

Więcej informacji o zapytaniach dotyczących kontenerów i tworzeniu komponentów logicznych znajdziesz w tym poście.

Określanie stylu zapytań

Obsługa przeglądarek

  • Chrome: 111.
  • Edge: 111.
  • Firefox: nieobsługiwane.
  • Safari: 18.

Źródło

Specyfikacja zapytania o kontener umożliwia też wysyłanie zapytań o wartości stylu kontenera nadrzędnego. Jest on obecnie częściowo zaimplementowany w Chrome 111, gdzie możesz używać właściwości niestandardowych CSS do stosowania stylów kontenera.

W tym przykładzie do nadania stylu tła karty i ikony wskaźnika użyto cech pogodowych zapisanych w wartościach właściwości niestandardowych, takich jak deszcz, słońce i chmury.

@container style(--sunny: true) {
 .weather-card {
   background: linear-gradient(-30deg, yellow, orange);
 }

 .weather-card:after {
   content: url(<data-uri-for-demo-brevity>);
   background: gold;
 }
}

Wersja demonstracyjna kart pogodowych.

To dopiero początek w przypadku zapytań dotyczących stylów. W przyszłości będziemy stosować zapytania logiczne, aby sprawdzać, czy istnieje wartość właściwości niestandardowej, i w ten sposób ograniczać powtarzanie kodu. Obecnie rozważamy zapytania zakresowe, które mają służyć do stosowania stylów na podstawie zakresu wartości. Umożliwiłoby to zastosowanie stylów pokazanych tutaj przy użyciu wartości procentowej dla prawdopodobieństwa opadów lub zachmurzenia.

Więcej informacji i demo znajdziesz w poście na blogu o zapytaniach dotyczących stylu.

:has()

Obsługa przeglądarek

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 121.
  • Safari: 15.4.

Źródło

Mówiąc o zaawansowanych, dynamicznych funkcjach, :has() selektor to jedna z najnowszych funkcji CSS, które działają w nowoczesnych przeglądarkach. Dzięki atrybucie :has() możesz stosować style, sprawdzając, czy element nadrzędny zawiera określone elementy podrzędne lub czy te elementy podrzędne są w określonym stanie. Oznacza to, że mamy teraz selektor nadrzędny.

W przykładzie zapytania o kontener możesz użyć :has(), aby jeszcze bardziej uatrakcyjnić komponenty. Element z gwiazdką ma szare tło, a element z zaznaczonym polem wyboru – niebieskie.

Zrzut ekranu przedstawiający wersję demonstracyjną

Interfejs API nie jest jednak ograniczony do wyboru rodzica. Możesz też nadać styl elementom podrzędnym w elemencie nadrzędnym. Na przykład tytuł jest pogrubiony, gdy element zawiera gwiazdkę. Można to zrobić za pomocą .item:has(.star) .title. Selektor :has() daje dostęp do elementów nadrzędnych, podrzędnych, a nawet elementów potomnych, dzięki czemu jest to naprawdę elastyczny interfejs API – codziennie pojawiają się nowe przypadki użycia.

Aby dowiedzieć się więcej i zobaczyć więcej demonstracji, przeczytaj ten post na blogu na temat :has().

Składnia n-tej

Obsługa przeglądarek

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 9.

Platforma internetowa ma teraz bardziej zaawansowany wybór n-tego elementu. Zaawansowana składnia elementu podrzędnego n-tyle powoduje utworzenie nowego słowa kluczowego („z”), co pozwala na użycie istniejącej składni mikro kodu An+B z bardziej precyzyjnym podzbiorem wyszukiwania.

Jeśli użyjesz zwykłego elementu n-tego potomka, np. :nth-child(2), w klasie specjalnej, przeglądarka wybierze element, do którego zastosowano klasę special, i jest on też drugim potomkiem. W przeciwieństwie do opcji :nth-child(2 of .special), która najpierw odfiltrowuje wszystkie elementy .special, a następnie wybiera z listy drugi element.

Więcej informacji o tej funkcji znajdziesz w artykule o składni „n-th-of”.

text-wrap: balance

Selekcja i zapytania o style to nie jedyne miejsca, w których możemy umieszczać logikę w naszych stylach. Innym jest typografia. Od wersji 114 przeglądarki Chrome możesz używać wyrównywania tekstu w nagłówkach, korzystając z właściwości text-wrap o wartości balance.

Wypróbuj wersję demonstracyjną

Aby wyrównać tekst, przeglądarka wykonuje wyszukiwanie binarne w celu znalezienia najmniejszej szerokości, która nie powoduje dodatkowych wierszy. Przeglądarka zatrzymuje się na jednym pikselu CSS (nie na pikselu wyświetlacza). Aby jeszcze bardziej zminimalizować liczbę kroków w wyszukiwaniu binarnym, przeglądarka zaczyna od 80% średniej szerokości linii.

Wypróbuj wersję demonstracyjną

Więcej informacji na ten temat znajdziesz w tym artykule.

initial-letter

Obsługa przeglądarek

  • Chrome: 110.
  • Edge: 110.
  • Firefox: nieobsługiwane.
  • Safari: 9.

Źródło

Inne dobre rozwiązanie w zakresie typografii w internecie to initial-letter. Ta właściwość CSS zapewnia większą kontrolę nad stylami wstawionych kropek.

Użyj pseudoelementu initial-letter w elemencie :first-letter, aby określić: Rozmiar listu na podstawie liczby wierszy. Przesunięcie blokowe litery, czyli „ujście” – miejsce, w którym litera zostanie umieszczona.

Więcej informacji o używaniu intial-letter znajdziesz tutaj.

Jednostki widocznego obszaru dynamicznego

Obsługa przeglądarek

  • Chrome: 108.
  • Edge: 108.
  • Firefox: 101.
  • Safari: 15.4

Jednym z częstych problemów, z jakimi mają obecnie do czynienia twórcy stron internetowych, jest dokładne i spójne rozmiary pełnego widocznego obszaru, zwłaszcza na urządzeniach mobilnych. Jako deweloper chcesz, aby element 100vh (100% wysokości widocznego obszaru) oznaczał „tak wysoki jak widoczny obszar”, ale jednostka vh nie uwzględnia m.in. zwijania pasków nawigacyjnych na urządzeniach mobilnych, więc czasem kończy się zbyt długo i powoduje przewijanie.

wyświetlanie zbyt wielu pasków przewijania,

Aby rozwiązać ten problem, wprowadziliśmy na platformie internetowej nowe wartości jednostek, w tym: – małe wartości wysokości i szerokości widoku (lub svhsvw), które odpowiadają najmniejszemu rozmiarowi aktywnego widoku. – Wysokość i szerokość widocznego obszaru w dużej wersji (lvhlvw), która odpowiada największemu rozmiarowi. – Dynamiczna wysokość i szerokość widocznego obszaru (dvhdvw).

Wartość dynamicznych jednostek widoku zmienia się, gdy dodatkowe dynamiczne paski narzędzi przeglądarki, takie jak adres u góry lub pasek kart u dołu, są widoczne lub niewidoczne.

Wizualizacja nowych jednostek w widoku

Więcej informacji o tych nowych jednostkach znajdziesz w artykule Duże, małe i dynamiczne jednostki widocznego obszaru.

Przestrzenie kolorów o szerokim zakresie

Obsługa przeglądarek

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 15.4.

Źródło

Kolejną ważną nowością na platformie internetowej są przestrzenie barw o szerokim zakresie. Zanim na platformie internetowej udostępniono kolory o szerszym zakresie, można było robić zdjęcia o żywych kolorach, które można było wyświetlić na nowoczesnych urządzeniach, ale nie można było dopasować koloru przycisku, tekstu ani tła do tych żywych wartości.

Pokazano serię obrazów przechodzących z szerokiej na wąską paletę barw, aby zilustrować żywe kolory i ich efekty.
Spróbuj

Teraz mamy na platformie internetowej wiele nowych przestrzeni kolorów, w tym REC2020, P3, XYZ, LAB, OKLAB, LCH i OKLCH. Poznaj nowe przestrzenie kolorów w internecie i inne funkcje w przewodniku po kolorach HD.

5 ułożonych na sobie trójkątów w różnych kolorach, które pomagają zilustrować związek i rozmiar każdej nowej przestrzeni barw.

W Narzędziach deweloperskich możesz od razu zobaczyć, jak rozszerzony został zakres kolorów. Biała linia wyznacza granicę między zakresem sRGB a szerszym zakresem kolorów.

Narzędzie DevTools wyświetlające linię gamutu w selektorze kolorów

Mnóstwo dodatkowych narzędzi do kolorów! Nie przegap też wszystkich świetnych ulepszeń gradientu. Jest nawet zupełnie nowe narzędzie stworzone przez Adama Argyle, które pozwala wypróbować nowy selektor kolorów i kreator gradientów. Znajdziesz je na stronie gradient.style.

color-mix()

Obsługa przeglądarek

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 16.2.

Źródło

Rozwijanie rozszerzonych przestrzeni kolorów to funkcja color-mix(). Ta funkcja umożliwia mieszanie 2 wartości kolorów w celu tworzenia nowych wartości na podstawie kanałów kolorów, które mają być mieszane. Przestrzeń barw, w której miksujesz kolory, wpływa na wyniki. Praca w przestrzeni kolorów bardziej zbliżonej do percepcji ludzkiego oka, takiej jak oklch, będzie obejmować inny zakres kolorów niż np. sRGB.

color-mix(in srgb, blue, white);
color-mix(in srgb-linear, blue, white);
color-mix(in lch, blue, white);
color-mix(in oklch, blue, white);
color-mix(in lab, blue, white);
color-mix(in oklab, blue, white);
color-mix(in xyz, blue, white);
7 przestrzeni kolorów (sRGB, linear-sRGB, lch, oklch, lab, oklab, xyz), z których każda ma inne wyniki. Wiele z nich jest różowych lub fioletowych, a nieliczne w rzeczywistości są nadal niebieskie.
Wypróbuj wersję demonstracyjną

Funkcja color-mix() umożliwia działanie, o które prosisz od dawna: możliwość zachowania wartości nieprzezroczystych kolorów i zwiększenia ich przezroczystości. Teraz możesz używać zmiennych kolorów marki podczas tworzenia wariantów tych kolorów o różnej przezroczystości. Aby to zrobić, należy połączyć kolor z przezroczystym. Połączenie koloru niebieskiego z 10% przezroczystości daje kolor nieprzezroczysty w 90%. Możesz zobaczyć, jak szybko można tworzyć systemy kolorów.

Możesz zobaczyć, jak to działa w Narzędziach deweloperskich w Chrome – teraz w panelu Style znajdziesz ikonę podglądu schematu Venna.

Zrzut ekranu z Narzędziami dla programistów z ikoną mieszania kolorów na diagramie Venna

Więcej przykładów i szczegółów znajdziesz w naszym poście na blogu o kombinacji kolorów. Możesz też wypróbować funkcję playground na potrzeby funkcji color-mix().

Podstawy CSS

Tworzenie nowych funkcji, które przynoszą użytkownikom wyraźne korzyści, to tylko jeden z elementów układanki. Wiele funkcji dodawanych do Chrome ma na celu ulepszenie środowiska programistów i stworzenie bardziej niezawodnej i uporządkowanej architektury CSS. Do tych funkcji należą zagnieżdżanie CSS, warstwy kaskadowe, style ograniczone, funkcje trygonometryczne i poszczególne właściwości transformacji.

Umieszczanie

Obsługa przeglądarek

  • Chrome: 120.
  • Edge: 120.
  • Firefox: 117.
  • Safari: 17.2.

Źródło

Wplatanie CSS, czyli jedna z najpopularniejszych funkcji w Sass, o którą od lat proszą programiści, wreszcie trafia na platformę internetową. Zagnieżdżanie pozwala deweloperom pisać w bardziej zwięzły sposób, w grupach, co zmniejsza nadmiar.

.card {}
.card:hover {}

/* can be done with nesting like */
.card {
  &:hover {

  }
}

Możesz też zagnieżdżać zapytania dotyczące multimediów, co oznacza, że możesz też zagnieżdżać zapytania dotyczące kontenera. W tym przykładzie karta zmienia się z orientacji pionowej na poziomą, jeśli ma wystarczającą szerokość w kontenerze:

.card {
  display: grid;
  gap: 1rem;

  @container (width >= 480px) {
    display: flex;
  }
}

Dostosowanie układu do wartości flex ma miejsce, gdy w kontenerze jest więcej niż 480px dostępnego miejsca. Gdy warunki zostaną spełnione, przeglądarka zastosuje nowy styl wyświetlania.

Więcej informacji i przykładów znajdziesz w naszym poście na temat zagnieżdżania reguł CSS.

Warstwy kaskadowe

Obsługa przeglądarek

  • Chrome: 99.
  • Edge: 99.
  • Firefox: 97.
  • Safari: 15.4

Źródło

Innym problemem programistów jest zapewnienie spójności, w której style sprawdzają się nad innymi, a jednym z rozwiązań tego problemu jest większa kontrola nad kaskadą CSS.

Warstwy kaskadowe rozwiązują ten problem, dając użytkownikom możliwość wyboru warstw o wyższym priorytecie niż inne, co oznacza większą kontrolę nad tym, kiedy są stosowane style.

Ilustracja z Cascade

Zrzut ekranu z projektu Codepen
Zobacz ten projekt na Codepen

Więcej informacji o używaniu warstw kaskadowych znajdziesz w tym artykule.

CSS o zakresie

Obsługa przeglądarek

  • Chrome: 118.
  • Edge: 118.
  • Firefox: za pomocą flagi.
  • Safari: 17.4.

Źródło

Style ograniczone do CSS umożliwiają deweloperom określanie granic, w których mają zastosowanie określone style, co sprowadza się do tworzenia natywnych nazw w CSS. Wcześniej deweloperzy używali skryptów innych firm do zmiany nazw klas lub określonych konwencji nazewnictwa, aby zapobiec kolizjom stylów. Wkrótce będzie można używać @scope.

Tutaj ograniczamy wartość elementu .title do .card. Dzięki temu element tytułu nie będzie się kolidował z innymi elementami .title na stronie, takimi jak tytuł posta na blogu czy inny nagłówek.

@scope (.card) {
  .title {
    font-weight: bold;
  }
}

W tym demonstracyjnym filmie możesz zobaczyć @scope z ograniczeniami zakresu oraz @layer:

Zrzut ekranu z kartą z demonstracji

Więcej informacji o właściwości @scope znajdziesz w specyfikacji css-cascade-6.

Funkcje trygonometryczne

Obsługa przeglądarek

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 108.
  • Safari: 15.4.

Źródło

Kolejną nowością w CSS są funkcje trygonometryczne dodawane do istniejących funkcji matematycznych CSS. Te funkcje działają obecnie stabilnie we wszystkich nowoczesnych przeglądarkach i umożliwiają tworzenie bardziej bezpłatnych układów na platformie internetowej. Doskonałym przykładem jest układ menu radialnego, który można teraz zaprojektować i animować za pomocą funkcji sin()cos().

W prezentacji poniżej kropki obracają się wokół centralnego punktu. Zamiast obracać każdą kropkę wokół jej środka, a potem przesuwać na zewnątrz, każda kropka jest przesuwana wzdłuż osi X i Y. Odległości na osiach X i Y są określane na podstawie wartości cos() i odpowiednio sin() elementu --angle.

Więcej informacji na ten temat znajdziesz w artykule o funkcjach trygonometrycznych.

Pojedyncze właściwości przekształcenia

Obsługa przeglądarek

  • Chrome: 104.
  • Edge: 104.
  • Firefox: 72.
  • Safari: 14.1.

Źródło

Ergonomia programistów rozwija się wraz z poszczególnymi funkcjami przekształcania. Od czasu ostatniej konferencji I/O poszczególne przekształcenia były stabilne we wszystkich nowoczesnych przeglądarkach.

Wcześniej do skalowania, obracania i przekształcania elementów interfejsu użytkownika służyły funkcje podrzędne, które można było stosować za pomocą funkcji transform. Wymagało to wielu powtórzeń i było szczególnie frustrujące, gdy trzeba było zastosować wiele przekształceń w różnych momentach animacji.

.target {
  transform: translateX(50%) rotate(30deg) scale(1.2);
}

.target:hover {
  transform: translateX(50%) rotate(30deg) scale(2); /* Only scale changed here, yet you have to repeat all other parts */
}

Teraz możesz stosować te wszystkie szczegóły w animacji CSS, oddzielając typy przekształceń i zastosowując je osobno.

.target {
  translate: 50% 0;
  rotate: 30deg;
  scale: 1.2;
}

.target:hover {
  scale: 2;
}

W tym przypadku zmiany przesunięcia, obrotu lub skali mogą występować jednocześnie z różną szybkością w różnych momentach animacji.

Więcej informacji znajdziesz w tym poście na temat poszczególnych funkcji przekształcania.

Komponenty z możliwością dostosowania

Aby mieć pewność, że spełniamy najważniejsze potrzeby programistów w ramach platformy internetowej, współpracujemy z grupą społeczności OpenUI i na początek zidentyfikowaliśmy 3 rozwiązania:

  1. Wbudowana funkcja wyskakującego okienka z modułami obsługi zdarzeń, deklaratywną strukturą DOM i dostępnymi domyślnymi ustawieniami.
  2. Interfejs API CSS powiązany ze sobą w celu umożliwienia pozycjonowania zakotwiczonych 2 elementów.
  3. Dostosowywalny komponent menu, który możesz wykorzystać, gdy chcesz nadać styl treści wewnątrz pola wyboru.

Wyskakujące okienko

Interfejs popover API zapewnia elementom wbudowane funkcje obsługi przeglądarek, takie jak:

  • Obsługa najwyższego poziomu, więc nie musisz zarządzać usługą z-index. Gdy otworzysz wyskakujące okienko lub okno dialogowe, ten element zostanie przeniesiony na specjalną warstwę u góry strony.
  • Łatwe zamykanie w popupach auto, dzięki czemu po kliknięciu poza elementem popup zostanie zamknięty, usunięty z drzewa ułatwień dostępu i odpowiednio zarządzi skupieniem.
  • Domyślna dostępność dla elementów łączących cel okna wyskakującego i samo okienko.

Oznacza to, że do tworzenia tej funkcji i śledzenia wszystkich tych stanów trzeba napisać mniej kodu JavaScript.

Przykład wyskakującego okienka

Struktura DOM dla wyskakujących okienek jest deklaratywna i można ją zapisać tak łatwo, jak nadasz elementowi wyskakującemu atrybuty id i popover. Następnie synchronizujesz ten identyfikator z elementem, który otwiera wyskakujące okienko, np. z przyciskiem z atrybutem popovertarget:

<div id="event-popup" popover>
  <!-- Popover content goes in here -–>
</div>

<button popovertarget="event-popup">Create New Event</button>

popover to skrót od popover=auto. Element z popover=auto powoduje przymusowe zamknięcie innych wyskakujących okienek po ich otwarciu, przejmuje fokus po otwarciu i może być zamknięty bez opuszczania strony. Z drugiej strony elementy popover=manual nie powodują przymusowego zamknięcia żadnego innego typu elementu, nie otrzymują natychmiastowego fokusa ani nie są automatycznie zamykane. Można je zamknąć za pomocą przełącznika lub innego działania związanego z zamknięciem.

Najnowszą dokumentację dotyczącą wyskakujących okienek znajdziesz obecnie na MDN.

Umieszczenie kotwicy

Popovers są też często stosowane w takich elementach jak okna i etykietki, które zwykle muszą być zakotwiczone w konkretnych elementach. Weźmy na przykład to zdarzenie. Gdy klikniesz wydarzenie w kalendarzu, obok niego pojawi się okno dialogowe. Element kalendarza jest kotwicą, a wyskakujące okienko to okno, które zawiera szczegóły wydarzenia.

Korzystając z funkcji anchor(), możesz utworzyć wyśrodkowaną etykietkę, wykorzystując szerokość kotwicy, aby umieścić ją w 50% położenia reklamy na osi X. Następnie użyj istniejących wartości pozycjonowania, by zastosować pozostałe style miejsc docelowych.

Co się jednak stanie, jeśli powiadomienie nie mieści się w widoku w zależności od tego, jak je umieścisz?

wyskakujące okienko z okienkiem

Aby rozwiązać ten problem, interfejs API pozycjonowania kotwic zawiera pozycje zastępcze, które możesz dostosować. W tym przykładzie tworzymy pozycję zastępczą o nazwie „góra, a potem dół”. Najpierw przeglądarka spróbuje umieścić etykietkę narzędzia u góry, a jeśli nie mieści się ona w widocznym obszarze, umieści ją pod elementem kotwiczenia, czyli u dołu.

.center-tooltip {
  position-fallback: --top-then-bottom;
  translate: -50% 0;
}

@position-fallback --top-then-bottom {
  @try {
    bottom: calc(anchor(top) + 0.5rem);
    left: anchor(center);
  }

  @try {
    top: calc(anchor(bottom) + 0.5rem);
    left: anchor(center);
  }
}

Więcej informacji o pozycjonowaniu kotwic znajdziesz w tym poście na blogu.

<selectmenu>

Dzięki pozycjonowaniu wyskakujących okienek i kotwic możesz tworzyć w pełni konfigurowalne menu wyboru. Grupa społeczności OpenUI analizowała podstawową strukturę tych menu i szukała sposobów na umożliwienie dostosowywania zawartych w nich treści. Oto kilka przykładów wizualnych:

Przykłady menu wyboru

Aby utworzyć przykład po lewej stronie selectmenu, z kolorowymi kropkami odpowiadającymi kolorom, które będą widoczne w zdarzeniu w kalendarzu, możesz napisać go w ten sposób:

<selectmenu>
  <button slot="button" behavior="button">
    <span>Select event type</span>
    <span behavior="selected-value" slot="selected-value"></span>
    <span><img src="icon.svg"/></span>
  </button>
  <option value="meeting">
    <figure class="royalblue"></figure>
    <p>Meeting</p>
  </option>
  <option value="break">
    <figure class="gold"></figure>
     <p>Lunch/Break</p>
  </option>
  ...
</selectmenu>

Przejściowe właściwości dyskretne

Aby wszystko to płynnie się otwierało i zamykało, przeglądarka musi mieć możliwość animowania poszczególnych właściwości. Są to właściwości, które zwykle nie były animowane w przeszłości, takie jak animowanie do i z górnej warstwy oraz animacje do i z display: none.

W ramach działań mających na celu zapewnienie płynnego przejścia dla wyskakujących okienek, menu wyboru, a nawet istniejących elementów, takich jak okna czy komponenty niestandardowe, przeglądarki włączają nowe systemy hydrauliczne, które obsługują te animacje.

W tym demonstracyjnym przykładzie animacji wyskakujących okienek okna :popover-open odpowiadają otwartemu stanowi, @starting-style – nieotwartemu stanowi, a wartość transformacji – zamkniętemu stanowi. Aby wszystko działało w przypadku reklam displayowych, trzeba dodać ten parametr do właściwości transition w ten sposób:

.settings-popover {
  &:popover-open {
    /*   0. before-change   */
    @starting-style {
      transform: translateY(20px);
      opacity: 0;
    }

    /*   1. open (changed) state   */
    transform: translateY(0);
    opacity: 1;
  }

  /*   2. After-change state */
  transform: translateY(-50px);
  opacity: 0;

  /*  enumarate transitioning properties, including display */
  transition: transform 0.5s, opacity 0.5s, display 0.5s allow-discrete;
}

Interakcje

To prowadzi nas do interakcji, ostatniego przystanku w tej podróży po funkcjach interfejsu użytkownika w przeglądarce.

Omówiliśmy już animację pojedynczych właściwości, ale w Chrome pojawiły się też bardzo interesujące interfejsy API dotyczące animacji sterowanych przewijaniem i przechodów widoku.

Animacje przewijane

Obsługa przeglądarek

  • Chrome: 115.
  • Edge: 115.
  • Firefox: za pomocą flagi.
  • Safari: nieobsługiwane.

Źródło

Animacje sterowane przez przewijanie umożliwiają kontrolowanie odtwarzania animacji na podstawie pozycji przewijania kontenera. Oznacza to, że podczas przewijania w górę lub w dół animacja przesuwa się do przodu lub do tyłu. Dodatkowo w przypadku animacji przewijanych możesz sterować animacją na podstawie pozycji elementu w jego kontenerze przewijania. Dzięki temu możesz tworzyć ciekawe efekty, takie jak obraz tła z efektem paralaksy, paski postępu przewijania i obrazy, które ujawniają się w miarę pojawiania się na ekranie.

Ten interfejs API obsługuje zestaw klas JavaScript i właściwości CSS, które umożliwiają łatwe tworzenie deklaratywnych animacji zależnych od przewijania.

Aby sterować animacją CSS za pomocą przewijania, użyj nowych właściwości scroll-timeline, view-timeline i animation-timeline. Aby użyć interfejsu JavaScript Web Animations API, prześlij instancję ScrollTimeline lub ViewTimeline jako opcję timeline do Element.animate().

Te nowe interfejsy API współpracują z dotychczasowymi interfejsami API Web Animations i CSS Animations, co oznacza, że korzystają z ich zalet. Obejmuje to możliwość uruchamiania tych animacji poza wątkiem głównym. Tak, dobrze przeczytałeś: możesz teraz uzyskać płynne animacje, sterowane przez przewijanie, działające w wątku głównym, za pomocą kilku dodatkowych linii kodu. Co jest nie tak?

Szczegółowe informacje o tworzeniu animacji uruchamianych przez przewijanie znajdziesz w tym artykule.

Wyświetlanie przejść

Obsługa przeglądarek

  • Chrome: 111.
  • Edge: 111.
  • Firefox: nieobsługiwane.
  • Safari: 18.

Źródło

Interfejs ViewTransition API ułatwia zmianę DOM w jednym kroku, a także tworzenie animowanych przejść między 2 stanami. Możesz użyć prostego przejścia między widokami, ale możesz też kontrolować sposób przechodzenia poszczególnych części strony.

Przejścia widoku można stosować jako funkcję ulepszającą: weź swój kod, który aktualizuje DOM za pomocą dowolnej metody, i owiń go w interfejs API przejścia widoku z opcją awaryjnego wyświetlania w przeglądarkach, które nie obsługują tej funkcji.

function spaNavigate(data) {
  // Fallback for browsers that don't support this API:
  if (!document.startViewTransition) {
    updateTheDOMSomehow(data);
    return;
  }

  // With a transition:
  document.startViewTransition(() => updateTheDOMSomehow(data));
}

Wygląd przejścia jest kontrolowany za pomocą CSS.

@keyframes slide-from-right {
  from { opacity: 0; transform: translateX(75px); }
}

@keyframes slide-to-left {
  to { opacity: 0; transform: translateX(-75px); }
}

::view-transition-old(root) {
  animation: 350ms both slide-to-left ease;
}

::view-transition-new(root) {
  animation: 350ms both slide-from-right ease;
}

W tym cudownym prezentacji przygotowanym przez Maxi Ferreirę pokazujemy, że inne interakcje ze stroną, takie jak odtwarzanie filmu, nie przestają działać w trakcie przejścia z widoku.

Przechodzenie z widokiem danych działa obecnie w przypadku aplikacji jednostronicowych (SPA) z Chrome 111. Pracujemy nad obsługą aplikacji wielostronicowych. Więcej informacji znajdziesz w pełnym przewodniku po przejściach między widokami.

Podsumowanie

Najnowsze informacje o stronach docelowych w CSS i HTML znajdziesz na developer.chrome.com. Obejrzyj też filmy I/O, by zobaczyć więcej stron docelowych.