Stan CSS 2022

Funkcje stylizacji stron internetowych, które są dostępne obecnie i będą dostępne w przyszłości, omówione na konferencji Google IO 2022, a także kilka dodatkowych.

Rok 2022 zapowiada się jako jeden z najlepszych w historii CSS, zarówno pod względem funkcji, jak i współpracy przy wprowadzaniu funkcji do przeglądarki. Naszym celem jest wdrożenie 14 funkcji.

Omówienie

Ten post jest zapisem wystąpienia podczas konferencji Google IO 2022. Nie jest to szczegółowy przewodnik po poszczególnych funkcjach, ale wprowadzenie i krótki przegląd, który ma wzbudzić Twoje zainteresowanie i zapewnić szerokie spojrzenie na temat. Jeśli ten temat Cię zainteresuje, na końcu tej sekcji znajdziesz linki do dodatkowych informacji.

Spis treści

Aby przejść do interesujących Cię tematów, skorzystaj z poniższej listy:

Zgodność z przeglądarką

Głównym powodem, dla którego tak wiele funkcji usługi porównywania cen ma być udostępnianych w ramach współpracy, są działania prowadzone w ramach Interop 2022. Przed rozpoczęciem korzystania z narzędzia Interop warto przyjrzeć się wynikom platformy Compat 2021.

Compat 2021

Na podstawie opinii programistów uzyskanych w ankietach wyznaczyliśmy na rok 2021 następujące cele: stabilizacja obecnych funkcji, ulepszenie zestawu testów i zwiększenie liczby przeglądarek, które uzyskują wynik pozytywny w przypadku 5 funkcji:

  1. sticky pozycjonowanie
  2. aspect-ratio rozmiar
  3. Układ flex
  4. Układ grid
  5. transform pozycjonowanie i animacja

Wyniki testów wzrosły w całości, co wskazuje na większą stabilność i niezawodność. Gratulacje dla zespołów!

Interoperacyjność w 2022 r.

W tym roku przeglądarki spotkały się, aby omówić funkcje i priorytety, nad którymi zamierzają pracować, i zjednoczyć swoje wysiłki. Firma planowała udostępnić deweloperom następujące funkcje internetowe:

  1. @layer
  2. Przestrzenie kolorów i funkcje
  3. Ukrycie
  4. <dialog>
  5. Zgodność formularzy
  6. Przewijanie
  7. Podsiatka
  8. Typografia
  9. Jednostki widocznego obszaru
  10. Zgodność z internetem

To ekscytująca i ambitna lista, której realizacji nie mogę się doczekać.

Aktualności na 2022 r.

Jak można się było spodziewać, na stan usługi porównywania cen 2022 znacząco wpłynęły zmiany wprowadzone w 2022 r.

Kaskadowe warstwy

Obsługa przeglądarek

  • Chrome: 99.
  • Krawędź: 99.
  • Firefox: 97.
  • Safari: 15.4.

Źródło

Przed @layer kolejność wczytywania arkuszy stylów była bardzo ważna, ponieważ ostatnio wczytane style mogły zastąpić wcześniej wczytane style. Wymagało to starannego zarządzania arkuszami stylów wpisów, w których deweloperzy musieli najpierw wczytywać mniej ważne style, a później te ważniejsze. Istnieją całe metody, takie jak ITCSS, które pomagają deweloperom zarządzać tą ważnością.

Dzięki temu plik wejściowy może zdefiniować warstwy i ich kolejność z wyprzedzeniem. Następnie, gdy style są ładowane, wczytywane lub zdefiniowane, można je umieszczać w warstwie, co pozwala zachować znaczenie zastąpienia stylu, ale bez skrupulatnie zarządzanej administracji wczytywania.

Film pokazuje, jak zdefiniowane warstwy kaskadowe umożliwiają bardziej swobodny proces tworzenia i ładowania treści, przy jednoczesnym zachowaniu kaskady w razie potrzeby.

Narzędzia deweloperskie w Chrome pomagają zwizualizować, które style pochodzą z których warstw:

Zrzut ekranu przedstawiający pasek boczny Stylów w Narzędziach deweloperskich Chrome, na którym widać, jak style wyglądają w ramach nowych grup warstw.

Zasoby

Subgrid

Obsługa przeglądarek

  • Chrome: 117.
  • Edge: 117.
  • Firefox: 71.
  • Safari: 16.

Źródło

Przed wersją subgrid siatka wewnątrz innej siatki nie mogła się dopasować do komórek nadrzędnych ani linii siatki. Każdy układ siatki był unikalny. Wielu projektantów umieszcza jedną siatkę na całej stronie i stale wyrównuje w niej elementy, co nie jest możliwe w CSS.

Po subgrid element podrzędny siatki może przejąć kolumny lub wiersze elementu nadrzędnego i dopasować do nich siebie lub elementy podrzędne.

W tej prezentacji element <body> tworzy klasyczną siatkę złożoną z 3 kolumn: środkowa kolumna nazywa się main, a kolumny po lewej i prawej nadają nazwy fullbleed. Następnie każdy element w treści, <nav> i <main>, przyjmuje nazwane wiersze z treści, ustawiając grid-template-columns: subgrid.

​​body {
  display: grid;
  grid-template-columns:
    [fullbleed-start]
    auto [main-start] min(90%, 60ch) [main-end] auto
    [fullbleed-end]
  ;
}

body > * {
  display: grid;
  grid-template-columns: subgrid;
}

Wreszcie dzieci w wieku <nav> lub <main> mogą się wyrównać lub dopasować rozmiar za pomocą kolumn i linii fullbleed oraz main.

.main-content {
  grid-column: main;
}

.fullbleed {
  grid-column: fullbleed;
}

Narzędzie DevTools może pomóc Ci zobaczyć linie i subgridy (obecnie tylko w Firefox). Na tym obrazie siatka nadrzędna i siatki podrzędne są nałożone. Przypomina to sposób myślenia projektantów o układzie.

Zrzut ekranu pokazujący przykładową subkratkę. Narzędzia Narzędzia deweloperskie w Chrome służą do wyświetlania linii zdefiniowanych za pomocą CSS.

W panelu Elementy w narzędziach deweloperskich możesz zobaczyć, które elementy są siatkami i subgridami, co jest bardzo pomocne przy debugowaniu lub weryfikowaniu układu.

Zrzut ekranu panelu Elementy w Narzędziach dla programistów w Chrome z oznaczeniem, które elementy mają układ siatki lub siatki podrzędnej.
Zrzut ekranu z narzędzi Firefox Devtools

Zasoby

Zapytania dotyczące kontenerów

Obsługa przeglądarek

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

Źródło

Przed @container elementy strony internetowej mogły dostosowywać się tylko do rozmiaru całego widocznego obszaru. Jest to świetne rozwiązanie w przypadku układów makro, ale w przypadku układów mikro, których zewnętrzny kontener nie obejmuje całego widocznego obszaru, nie można odpowiednio dostosować układu.

Po @container elementy mogą dostosowywać się do rozmiaru lub stylu nadrzędnego kontenera. Jedynym zastrzeżeniem jest to, że kontenery muszą być zadeklarowane jako możliwe cele zapytań. Jest to niewielkie wymaganie, które przynosi duże korzyści.

/* establish a container */
.day {
  container-type: inline-size;
  container-name: calendar-day;
}

Dzięki tym stylom kolumny Pon, Wto, Śro, Czw i Pią w poniższym filmie mogą być dostępne dla zapytań elementów zdarzenia.

Demo autorstwa Una Kravets

Oto kod CSS do zapytania o rozmiar kontenera calendar-day, a następnie do dostosowywania układu i rozmiarów czcionek:

@container calendar-day (max-width: 200px) {
  .date {
    display: block;
  }

  .date-num {
    font-size: 2.5rem;
    display: block;
  }
}

Oto kolejny przykład: jeden element książki dostosowuje się do dostępnej przestrzeni w kolumnie, do której został przeciągnięty:

Demonstracja autorstwa Max Böck

Una prawidłowo ocenił sytuację jako nową grupę responsywną. Podczas korzystania z narzędzia @container należy podejmować wiele ciekawych i istotnych decyzji projektowych.

Zasoby

accent-color

Obsługa przeglądarek

  • Chrome: 93.
  • Krawędź: 93.
  • Firefox: 92.
  • Safari: 15.4

Źródło

Przed accent-color, gdy potrzebny był formularz w kolorach pasujących do marki, mogły one skończyć się złożonymi bibliotekami lub rozwiązaniami CSS, którymi z czasem trudno było zarządzać. Chociaż masz do dyspozycji wszystkie opcje, w tym te dotyczące dostępności, wybór między używaniem wbudowanych komponentów a tworzeniem własnych staje się żmudny.

Po accent-color jeden wiersz kodu CSS powoduje, że wbudowane komponenty będą miały kolor marki. Oprócz zabarwienia przeglądarka inteligentnie dobiera kontrastowe kolory dla elementów pomocniczych komponentu i dostosowuje się do systemowych schematów kolorów (jasnych lub ciemnych).

/* tint everything */
:root {
  accent-color: hotpink;
}

/* tint one element */
progress {
  accent-color: indigo;
}

Jasne i ciemne akcenty elementów HTML obok siebie w celu porównania.

Aby dowiedzieć się więcej o accent-color, przeczytaj mój post na stronie web.dev, w którym omawiam wiele aspektów tej przydatnej właściwości CSS.

Zasoby

Poziom koloru 4 i 5

Przez ostatnie dziesięciolecia w internecie dominował profil sRGB, ale w rozszerzającym się świecie cyfrowych wyświetlaczy o wysokiej rozdzielczości i urządzeń mobilnych wyposażonych w ekrany OLED lub QLED profil sRGB nie wystarcza. Oczekuje się też, że strony dynamiczne będą dostosowywały się do preferencji użytkowników, a zarządzanie kolorami stało się coraz większym problemem dla projektantów, systemów projektowych i osób zajmujących się konserwacją kodu.

Jednak nie w 2022 roku – CSS oferuje szereg nowych funkcji i spacji kolorów: – kolory, które sięgają po możliwości kolorów ekranów HD. – przestrzenie kolorów pasujące do intencji, np. jednolita percepcja. – przestrzenie kolorów gradientów, które drastycznie zmieniają wyniki interpolacji. – Funkcje kolorów, które ułatwiają mieszanie i kontrastowanie oraz wybór przestrzeni roboczej.

Zanim pojawiły się te funkcje, systemy projektowania musiały wstępnie obliczyć odpowiednie kolory kontrastowe i zadbać o odpowiednio żywe palety, a wszystko to przy użyciu preprocesorów lub JavaScriptu.

Po zastosowaniu wszystkich tych funkcji kolorów przeglądarka i CSS mogą wykonać całą pracę dynamicznie i w samym czasie. Zamiast wysyłać do użytkowników wiele KB kodu CSS i JavaScriptu, aby umożliwić im tworzenie motywów i kolorów wizualizacji danych, kod CSS może przeprowadzić odpowiednie obliczenia i koordynację. CSS jest też lepiej przygotowany do sprawdzania obsługi przed użyciem lub do prawidłowego obsługiwania alternatywnych rozwiązań.

@media (dynamic-range: high) {
  .neon-pink {
    --neon-glow: color(display-p3 1 0 1);
  }
}

@supports (color: lab(0% 0 0)) {
  .neon-pink {
    --neon-glow: lab(150% 160 0);
  }
}

hwb()

Obsługa przeglądarek

  • Chrome: 101.
  • Edge: 101.
  • Firefox: 96.
  • Safari: 15.

Źródło

HWB to skrót od hue (barwa), whiteness (biel) i blackness (czerń). Jest to przyjazny dla użytkownika sposób na określenie koloru, ponieważ składa się tylko z odcienia i ilości bieli lub czerni, aby rozjaśnić lub przyciemnić. Artyści, którzy łączą kolory z białym lub czarnym, mogą docenić to rozszerzenie składni kolorów.

Użycie tej funkcji kolorów powoduje, że kolory pochodzą z przestrzeni kolorów sRGB, tak samo jak w przypadku HSL i RGB. Jeśli chodzi o nowości na rok 2022, nie da to nowych kolorów, ale może ułatwić niektóre zadania fanom składni i modelu psychicznego.

Zasoby

Przestrzenie kolorów

Sposób, w jaki kolory są reprezentowane, zależy od przestrzeni barw. Każda przestrzeń kolorów oferuje różne cechy i wady w pracy z kolorami. Niektóre z nich mogą umieścić wszystkie jasne kolory razem, inne mogą je ustawić w kolejności od jasności.

CSS 2022 ma oferować 10 nowych przestrzeni kolorów, z których każda ma unikalne funkcje, aby pomóc projektantom i programistom w wyświetlaniu, wybieraniu i mieszaniu kolorów. Wcześniej sRGB była jedyną opcją do pracy z kolorami, ale teraz CSS odblokowuje nowy potencjał i nową domyślną przestrzeń kolorów LCH.

color-mix()

Obsługa przeglądarek

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

Źródło

Przed color-mix() deweloperzy i projektanci potrzebowali preprocesorów, takich jak Sass, aby mieszać kolory przed ich wyświetleniem w przeglądarce. Większość funkcji mieszania kolorów nie udostępniała też opcji określenia, w której przestrzeni kolorów należy mieszać, co czasami prowadziło do dezorientacji.

Po color-mix() programiści i projektanci mogą mieszać kolory w przeglądarce i wszystkie inne style bez konieczności uruchamiania procesów kompilacji ani dodawania JavaScriptu. Dodatkowo mogą określić, w której przestrzeni kolorów ma nastąpić mieszanie, lub użyć domyślnej przestrzeni kolorów LCH.

Często używany jest jako podstawa koloru marki, na podstawie którego tworzone są jego warianty, np. jaśniejsze lub ciemniejsze kolory w przypadku stylów wyświetlanych po najechaniu kursorem. Oto jak to wygląda w przypadku color-mix():

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(var(--brand) 25%, black);
  --lighter: color-mix(var(--brand) 25%, white);
}

a jeśli chcesz zestawić te kolory w innej przestrzeni kolorów, np. srgb, zmień ją:

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(in srgb, var(--brand) 25%, black);
  --lighter: color-mix(in srgb, var(--brand) 25%, white);
}

Poniżej znajduje się demonstracja motywów przy użyciu color-mix(). Spróbuj zmienić kolor marki i obserwuj, jak zmienia się motyw:

W 2022 roku możesz łączyć ze sobą kolory w różnych przestrzeniach kolorów w arkuszach stylów.

Zasoby

color-contrast()

Obsługa przeglądarek

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

Źródło

Przed color-contrast() autorzy arkuszy stylów musieli znać dostępne kolory z wyprzedzeniem. Paleta często zawiera czarny lub biały tekst na próbce koloru, aby pokazać użytkownikowi systemu kolorów, jaki kolor tekstu będzie potrzebny do prawidłowego kontrastowania z próbką.

Zrzut ekranu z 3 palet Material Design, na którym widać 14 kolorów i odpowiednie białe lub czarne kolory kontrastowe tekstu.
Przykład z palety kolorów Material Design z 2014 r.

Po color-contrast() autorzy arkuszy stylów mogą całkowicie przenieść to zadanie do przeglądarki. Możesz nie tylko wdrożyć przeglądarkę do automatycznego wybierania koloru czarnego lub białego, a także utworzyć listę odpowiednich kolorów z systemu projektowania i umożliwić jej wybranie tego, który jako pierwszy przejmie odpowiedni współczynnik kontrastu.

Oto zrzut ekranu demo palety kolorów HWB, w którym kolory tekstu są wybierane automatycznie przez przeglądarkę na podstawie koloru próbki:

Zrzut ekranu pokazujący tryb ciemny, w którym każda paleta ma inny zestaw jasnego lub ciemnego tekstu, zgodnie z ustawami przeglądarki
Wypróbuj demo

Podstawowa składnia wygląda tak: funkcja otrzymuje kolor szary, a przeglądarka określa, czy czarny czy biały ma największy kontrast:

color: color-contrast(gray);

Funkcję można też dostosować, podając listę kolorów, z których zostanie wybrany najbardziej kontrastowy kolor z wybranego obszaru:

color: color-contrast(gray vs indigo, rebeccapurple, hotpink);

Na koniec, jeśli nie chcesz wybierać koloru o najwyższym kontraście z listy, możesz podać docelowy współczynnik kontrastu. Pierwszy kolor, który go spełni, zostanie wybrany:

color: color-contrast(
  var(--bg-blue-1)
  vs
  var(--text-lightest), var(--text-light), var(--text-subdued)
  to AA /* 4.5 could also be passed */
);

Tej funkcji można używać nie tylko do zmiany koloru tekstu, ale szacuję, że będzie to jej główne zastosowanie. Zastanów się, o ile łatwiej będzie mieć dostęp do łatwych i czytelnych interfejsów, gdy dobór odpowiednich kontrastujących kolorów zostanie wbudowany w sam język CSS.

Zasoby

Składnia kolorów względnych

Obsługa przeglądarek

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

Źródło

Przed wprowadzeniem względnej składni koloru, aby obliczyć kolor i wprowadzić poprawki, kanały kolorów trzeba było umieszczać osobno w właściwościach niestandardowych. To ograniczenie sprawiło, że HSL stała się główną funkcją kolorów do manipulowania kolorami, ponieważ odcień, nasycenie i jasność można było dostosować w prosty sposób za pomocą calc().

Dzięki względnej składni kolorów można dekonstruować, modyfikować i zwracać dowolny kolor w dowolnej przestrzeni w jednym wierszu kodu CSS. Nie ma już ograniczeń związanych z HSL – manipulacje można wykonywać w dowolnej przestrzeni barw, a do ułatwienia tego nie trzeba tworzyć tak wielu niestandardowych właściwości.

W tym przykładzie składni podano kod heksadecymalny koloru podstawowego i na jego podstawie utworzono 2 nowe kolory. Pierwszy kolor --absolute-change tworzy nowy kolor w modelu LCH na podstawie koloru bazowego, a następnie zastępuje jasność koloru bazowego wartością 75%, zachowując nasycenie (c) i odcień (h). Drugi kolor --relative-change tworzy nowy kolor w modelu LCH na podstawie koloru bazowego, ale tym razem zmniejsza nasycenie (c) o 20%.

.relative-color-syntax {
  --color: #0af;
  --absolute-change: lch(from var(--color) 75% c h);
  --relative-change: lch(from var(--color) l calc(c-20%) h);
}

Jest to podobne do mieszania kolorów, ale bardziej przypomina modyfikacje niż mieszanie. Możesz wybrać kolor z innego koloru, uzyskując dostęp do trzech wartości kanałów zgodnie z nazwami użytymi przez funkcję koloru, z możliwością dostosowania tych kanałów. Podsumowując, jest to bardzo fajna i potężna składnia do tworzenia kolorów.

W tej demonstracji użyliśmy względnej składni kolorów, by utworzyć jaśniejsze i ciemniejsze wersje koloru podstawowego, oraz color-contrast(), aby zapewnić odpowiedni kontrast etykiet:

Zrzut ekranu z 3 kolumnami, z których każda jest ciemniejsza lub jaśniejsza od środkowej.
Wypróbuj demo

Tej funkcji można też używać do generowania palety kolorów. Oto demonstracja, w której całe palety są generowane na podstawie podanego koloru podstawowego. Ten jeden zestaw kodu CSS obsługuje wszystkie różne palety, a każda paleta zapewnia inną bazę. Jako że używam LCH, spójrzcie, jak bardzo równomierne są palety — dzięki tej przestrzeni kolorów nie widać żadnych gorących ani martwych punktów.

:root {
  --_color-base: #339af0;

  --color-0:  lch(from var(--_color-base) 98% 10 h);
  --color-1:  lch(from var(--_color-base) 93% 20 h);
  --color-2:  lch(from var(--_color-base) 85% 40 h);
  --color-3:  lch(from var(--_color-base) 75% 46 h);
  --color-4:  lch(from var(--_color-base) 66% 51 h);
  --color-5:  lch(from var(--_color-base) 61% 52 h);
  --color-6:  lch(from var(--_color-base) 55% 57 h);
  --color-7:  lch(from var(--_color-base) 49% 58 h);
  --color-8:  lch(from var(--_color-base) 43% 55 h);
  --color-9:  lch(from var(--_color-base) 39% 52 h);
  --color-10: lch(from var(--_color-base) 32% 48 h);
  --color-11: lch(from var(--_color-base) 25% 45 h);
  --color-12: lch(from var(--_color-base) 17% 40 h);
  --color-13: lch(from var(--_color-base) 10% 30 h);
  --color-14: lch(from var(--_color-base) 5% 20 h);
  --color-15: lch(from var(--_color-base) 1% 5 h);
}
Zrzut ekranu przedstawiający 15 palet wygenerowanych dynamicznie przez CSS.
Wypróbuj demo

Mam nadzieję, że wiesz już, jak przestrzenie kolorów i różne funkcje kolorów mogą być wykorzystywane do różnych celów, zależnie od ich mocnych i słabych stron.

Zasoby

Przestrzeń kolorów gradientu

Przed przestrzenią kolorów gradientowych domyślną przestrzenią kolorów była sRGB. Efekt sRGB jest zwykle niezawodny, ale ma pewne wady, takie jak szara martwa strefa.

4 gradienty w siatce, od błękitnego po głęboki róż. LCH i LAB mają bardziej stabilną żywotność, gdzie sRGB jest nieco mniej nasycone.

Po zastosowaniu przestrzeni kolorów gradientu poinformuj przeglądarkę, której przestrzeni kolorów ma używać na potrzeby interpolacji kolorów. Dzięki temu programiści i projektanci mogą wybrać gradient, który im odpowiada. Domyślna przestrzeń kolorów również zmienia się na LCH zamiast sRGB.

Dodanie składni następuje za kierunkiem gradientu, używa nowej składni in i jest opcjonalne:

background-image: linear-gradient(
  to right in hsl,
  black, white
);

background-image: linear-gradient(
  to right in lch,
  black, white
);

Oto podstawowy i podstawowy gradient od czarnego do białego. Sprawdź zakres wyników w każdej przestrzeni barw. Niektóre osiągają ciemną czerń wcześniej niż inne, inne bledną na biało zbyt późno.

11 przestrzeni kolorów pokazujących porównanie czerni i białej.

W tym przykładzie kolor czarny zmienia się na niebieski, ponieważ jest to znany problem z przestrzenią dla gradientów. Większość przestrzeni barwnych przechodzi w fiolet podczas interpolacji kolorów lub, jak lubię to nazywać, gdy kolory przemieszczają się w swojej przestrzeni barwnej z punktu A do punktu B. Ponieważ gradient będzie przebiegał prostą linią od punktu A do punktu B, kształt przestrzeni barw znacznie zmienia punkty, przez które przechodzi ścieżka.

11 przestrzeni kolorów pokazujących porównanie koloru niebieskiego z czarnym.

Aby uzyskać więcej szczegółowych informacji, przykładów i komentarzy, przeczytaj ten wątek na Twitterze.

Zasoby

inert

Obsługa przeglądarek

  • Chrome: 102.
  • Edge: 102.
  • Firefox: 112.
  • Safari: 15.5.

Źródło

Przed inert dobrą praktyką było kierowanie uwagi użytkownika na obszary strony lub aplikacji, które wymagały natychmiastowej uwagi. Ta strategia kierowania fokusu stała się znana jako „focus trapping”, ponieważ deweloperzy umieszczali fokus w interaktywnym obszarze, nasłuchywali zdarzeń zmiany fokusu i jeśli fokus opuszczał interaktywny obszar, był on przywracany. Użytkownicy klawiatur lub czytników ekranu są kierowani z powrotem do obszaru interaktywnego, aby przed przejściem dalej mieć pewność, że zadanie zostało ukończone.

Po inert nie jest wymagane przechwytywanie, ponieważ możesz zamrozić lub zabezpieczyć całe sekcje strony lub aplikacji. Kliknięcia i próby zmiany fokusa są po prostu niedostępne, gdy te części dokumentu są nieaktywne. Można też traktować to jak strażników zamiast pułapki, gdzie inert nie zależy na tym, abyś został w jakimś miejscu, ale aby inne miejsca były niedostępne.

Dobrym przykładem jest funkcja JavaScript alert():

Witryna jest wyświetlana jako interaktywna, a następnie wywoływana jest funkcja alert(), po czym strona przestaje być aktywna.

W poprzednim filmie widać, że strona była dostępna za pomocą myszy i klawiatury, dopóki nie została wywołana funkcja alert(). Po wyświetleniu okna dialogowego alertu reszta strony była zablokowana lub inert. Zaznaczenie jest umieszczone w dialogu alertu i nie może się przenieść w inne miejsce. Gdy użytkownik wykona polecenie funkcji alertu, strona znów stanie się interaktywna. inertumożliwia programistom łatwe tworzenie takich samych przejrzystych treści.

Oto mały przykład kodu, który pokazuje, jak to działa:

<body>
  <div class="modal">
    <h2>Modal Title</h2>
    <p>...<p>
    <button>Save</button>
    <button>Discard</button>
  </div>
  <main inert>
    <!-- cannot be keyboard focused or clicked -->
  </main>
</body>

Dialog jest świetnym przykładem, ale inert jest też przydatna w przypadku takich elementów jak wysuwane menu boczne. Gdy użytkownik otworzy menu boczne, mysz lub klawiatura nie powinny wpływać na działanie strony znajdującej się za tym menu. Takie działanie może być dla użytkowników nieco kłopotliwe. Zamiast tego, gdy wyświetla się menu boczne, spraw, aby strona była nieaktywna. Użytkownicy będą musieli zamknąć menu boczne lub się po nim poruszać, a nie będą mogli się zgubić gdzieś na stronie z otwartym menu.

Zasoby

Czcionki COLRv1

Przed czcionkami COLRv1 w internecie były dostępne czcionki OT-SVG, które również były otwartym formatem czcionek z gradientami oraz wbudowanymi kolorami i efektami. Mogłyby one jednak bardzo się powiększyć i chociaż pozwalały na edytowanie tekstu, nie miały dużego zakresu możliwości dostosowywania.

Po czcionkach COLRv1 strony internetowe mają mniejszy rozmiar, są skalowalne i przeskalowane wektorowo, przesuwne, z gradientem i w trybie mieszania. Czcionki te przyjmują parametry umożliwiające dostosowanie czcionki do konkretnego przypadku użycia lub dopasowanie do marki.

Wizualizacja porównawcza i wykres słupkowy pokazujący, że czcionki COLRv1 są ostrzejsze i mniejsze.
Zdjęcie pochodzi ze strony https://developer.chrome.com/blog/colrv1-fonts/

Oto przykład z artykułu na blogu dla programistów Chrome o emoji. Pewnie już wiesz, że po zwiększeniu rozmiaru czcionki emotikona zachowuje się nieostry. Jest to obraz, a nie grafika wektorowa. Często w aplikacjach, gdy używany jest emotikon, zostaje on zastąpiony zasobem o wyższej jakości. Dzięki czcionkom COLRv1 emotikony są wektorowe i piękne:

Czcionki ikon mogą robić niesamowite rzeczy w tym formacie, oferując niestandardowe palety dwutonowe i nie tylko. Wczytywanie czcionki COLRv1 przebiega tak samo jak w przypadku każdego innego pliku czcionki:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

Dostosowanie czcionki COLRv1 odbywa się za pomocą @font-palette-values, specjalnej reguły at-rule w CSS, która umożliwia grupowanie i nazywanie zestawu opcji dostosowywania w pakiecie na potrzeby późniejszego wykorzystania. Zwróć uwagę, że niestandardową nazwę podajesz tak samo jak niestandardową właściwość, czyli zaczynającą się od --:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

W przypadku --colorized jako aliasu dostosowań ostatnim krokiem jest zastosowanie palety do elementu, który używa kolorowej rodziny czcionek:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

.spicy {
  font-family: "Bungee Spice";
  font-palette: --colorized;
}
Zrzut ekranu pokazujący czcionkę Bungee Spice z napisem DUNE.
czcionka Bungee Spice z niestandardowymi kolorami, źródło: https://developer.chrome.com/blog/colrv1-fonts/

Wraz z coraz większą dostępnością czcionek zmiennych i kolorowych typografia internetowa staje się coraz bardziej wszechstronna i twórcza.

Zasoby

Jednostki widocznego obszaru

Grafika pokazująca, że ekran urządzenia, okno przeglądarki i element iframe mają różne widoki.

Przed wprowadzeniem nowych wariantów widocznego obszaru w internecie dostępne były jednostki fizyczne, które ułatwiały dopasowywanie widocznych obszarów. Jedna z wartości określała wysokość, szerokość, najmniejszy rozmiar (vmin) i największą stronę (vmax). Sprawdzały się one w wielu przypadkach, ale komplikowały komplikacje w przypadku przeglądarek mobilnych.

Podczas wczytywania strony na urządzeniach mobilnych pojawia się pasek stanu z adresem URL, który zajmuje część widocznego obszaru. Po kilku sekundach i pewnym poziomie interakcji pasek stanu może się przesunąć, aby zapewnić użytkownikowi większy widok. Jednak gdy ten słupek się wysunie, wysokość widocznego obszaru zmieniła się, a wszystkie jednostki vh będą się przesuwać i zmieniać rozmiar wraz ze zmianą rozmiaru docelowego. W późniejszych latach jednostka vh musiała zdecydować, którego z 2 rozmiarów widocznego obszaru ma użyć, ponieważ powodowało to problemy z nieprzyjemnym rozmieszczeniem elementów na urządzeniach mobilnych. Ustaliliśmy, że vh będzie zawsze reprezentować największy widoczny obszar.

.original-viewport-units {
  height: 100vh;
  width: 100vw;
  --size: 100vmin;
  --size: 100vmax;
}

Po udostępnieniu nowych wariantów widocznego obszaru udostępniono małe, duże i dynamiczne jednostki widocznego obszaru z dodatkowymi logicznymi odpowiednikami fizycznych jednostek. Chodzi o to, aby dać programistom i projektantom możliwość wyboru jednostki, której chcą używać w danym scenariuszu. Może niewielkie przesunięcie układu, gdy pasek stanu zniknie, nie będzie miało większego znaczenia, więc można bez obaw używać dvh (dynamiczna wysokość widoku).

Grafika przedstawiająca 3 telefony pokazujące DVH, LVH i SVH. Przykładowy telefon DVH ma 2 pionowe linie – jedną między u dołu paska wyszukiwania a dołem widocznego obszaru, a drugą między obszarem wyszukiwania (pod paskiem stanu systemowego) u dołu widocznego obszaru. Pokazuję, jak DVH może mieć jedną z tych długości. LVH jest wyświetlany na środku jedną linią między dolną częścią paska stanu urządzenia a przyciskiem w widoku telefonu. Ostatni przykład to jednostka SVH, która pokazuje linię od dołu paska wyszukiwania w przeglądarce do dołu widocznego obszaru

Oto pełna lista wszystkich nowych opcji jednostek widoku, które są dostępne w ramach nowych wariantów widoku:

Wysokość w jednostkach widocznego obszaru
​​.new-height-viewport-units {
  height: 100vh;
  height: 100dvh;
  height: 100svh;
  height: 100lvh;
  block-size: 100vb;
  block-size: 100dvb;
  block-size: 100svb;
  block-size: 100lvb;
}
Jednostki szerokości widocznego obszaru
.new-width-viewport-units {
  width: 100vw;
  width: 100dvw;
  width: 100svw;
  width: 100lvw;
  inline-size: 100vi;
  inline-size: 100dvi;
  inline-size: 100svi;
  inline-size: 100lvi;
}
Najmniejsze jednostki boczne widocznego obszaru
.new-min-viewport-units {
  --size: 100vmin;
  --size: 100dvmin;
  --size: 100svmin;
  --size: 100lvmin;
}
Największe jednostki boczne widocznego obszaru
.new-max-viewport-units {
  --size: 100vmax;
  --size: 100dvmax;
  --size: 100svmax;
  --size: 100lvmax;
}

Mamy nadzieję, że da to deweloperom i projektantom większą swobodę w tworzeniu projektów dostosowanych do widoku.

Zasoby

:has()

Obsługa przeglądarek

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

Źródło

Przed wersją :has() temat wzorca znajdował się zawsze na końcu. Na przykład podmiot tego selektora to element listy: ul > li. Selektory pseudo mogą zmieniać selektor, ale nie zmieniają tematu: ul > li:hover ani ul > li:not(.selected).

Po :has() temat znajdujący się wyżej w drzewie elementów może pozostać tematem podczas wyszukiwania dotyczącego dzieci: ul:has(> li). Łatwo zrozumieć, skąd :has() ma powszechną nazwę „selektor nadrzędny”, ponieważ w tym przypadku obiektem selektora jest teraz element nadrzędny.

Oto przykład podstawowej składni, w której klasa .parent pozostaje tematem, ale jest wybierana tylko wtedy, gdy element podrzędny ma klasę .child:

.parent:has(.child) {...}

Oto przykład, w którym element <section> jest tematem, ale selektor pasuje tylko wtedy, gdy jeden z elementów podrzędnych ma atrybuty :focus-visible:

section:has(*:focus-visible) {...}

Selektor :has() staje się fantastycznym narzędziem, gdy pojawiają się praktyczne przypadki użycia. Obecnie nie można na przykład wybierać tagów <a>, gdy otaczają one obrazy, co utrudnia tagowi kotwicy zmianę stylów w takim przypadku użycia. Możliwe jest to za pomocą :has(), ale:

a:has(> img) {...}

Wszystkie te przykłady to przypadki, w których element :has() wygląda jak element nadrzędny. Weź pod uwagę przypadek użycia obrazów w elementach <figure> i dostosowywanie stylów na obrazach, jeśli ilustracja ma atrybut <figcaption>. W tym przykładzie wybrane są ilustracje z tytułami, a potem obrazy w tym kontekście. Obiekt :has() jest używany i nie zmienia tematu, ponieważ celem kierowania są obrazy, a nie ilustracje:

figure:has(figcaption) img {...}

Kombinacji jest nieskończenie wiele. Połącz :has()zapytaniami dotyczącymi ilości i dostosuj układy siatki CSS na podstawie liczby elementów podrzędnych. Połącz :has() z interaktywnymi pseudostanami klasy i twórz aplikacje, które reagują na nowe kreatywne sposoby.

Sprawdzanie obsługi jest łatwe dzięki @supports i selector()funkcji, która sprawdza, czy przeglądarka rozumie składnię przed jej użyciem:

@supports (selector(:has(works))) {
  /* safe to use :has() */
}

Zasoby

Rok 2022 i kolejne

Nadal jest wiele rzeczy, które będą trudne do wykonania nawet po wprowadzeniu wszystkich tych wspaniałych funkcji w 2022 r. W następnej sekcji omawiamy niektóre z pozostałych problemów i rozwiązania, które są obecnie opracowywane. Te rozwiązania mają charakter eksperymentalny, chociaż mogą być określone lub dostępne za flagami w przeglądarkach.

Z następnych sekcji wynika, że wiele osób z wielu firm szuka rozwiązań dotyczących wymienionych problemów, a nie, że te rozwiązania zostaną udostępnione w 2023 r.

Luźno wpisane właściwości niestandardowe

Obsługa przeglądarek

  • Chrome: 85.
  • Edge: 85.
  • Firefox: 128.
  • Safari: 16.4.

Źródło

Właściwości niestandardowe CSS są niesamowite. Umożliwiają przechowywanie różnych danych w nazwanych zmiennych, które można następnie rozszerzać, obliczać, udostępniać itp. W fakcie są one tak elastyczne, że fajnie byłoby mieć takie, które są mniej elastyczne.

Wyobraź sobie sytuację, w której element box-shadow używa właściwości niestandardowych do swoich wartości:

box-shadow: var(--x) var(--y) var(--blur) var(--spread) var(--color);

Wszystko działa dobrze, dopóki nie zmienisz żadnej z właściwości na wartość, której CSS nie akceptuje, np. --x: red. Cały cień przestaje działać, jeśli brakuje jednej z zagnieżdżonych zmiennych lub jej typ wartości jest nieprawidłowy.

Właśnie w tym przypadku przydaje się @property: --x może stać się właściwością niestandardową z określonym typem, która nie jest już elastyczna i nieprecyzyjna, ale bezpieczna dzięki określonym granicom:

@property --x {
  syntax: '<length>';
  initial-value: 0px;
  inherits: false;
}

Teraz gdy box-shadow użyje var(--x), a później --x: red, red będzie ignorowany, ponieważ nie jest to <length>. Oznacza to, że cień nadal działa, mimo że jednej z jego właściwości niestandardowych przypisano nieprawidłową wartość. Zamiast zakończyć działanie, initial-value 0px.

Animacja

Oprócz bezpieczeństwa typów otwiera ona też wiele możliwości w zakresie animacji. Elastyczność składni CSS uniemożliwia animowanie niektórych elementów, takich jak gradienty. @property jest tu przydatna, ponieważ wpisana właściwość CSS może poinformować przeglądarkę o zamierzeniu programisty w ramach zbyt skomplikowanej interpolacji. Zasadniczo ogranicza ona możliwość animowania niektórych aspektów stylu, których wcześniej nie mogła.

Spójrzmy na ten przykład demonstracyjny, w którym gradient promieniowy tworzy część nakładki, tworząc efekt skupienia światła. Gdy użytkownik naciśnie klawisz alt/opt, JavaScript ustawia współrzędne X i Y myszy, a następnie zmieni rozmiar ogniskowej na mniejszą wartość, np. 25%, tworząc w miejscu, w którym znajduje się kursor myszy, okrąg skupienia światła:

Wypróbuj demo
.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );
}

Gradientów nie można jednak animować. Są zbyt elastyczne i zbyt złożone, by przeglądarka mogła „po prostu wywnioskować” sposób animacji. W przypadku @property można jednak wpisać i animować jedną właściwość w osobnym oknie, a przeglądarka może łatwo zrozumieć intencję.

Gry wideo, które wykorzystują ten efekt ostrości, zawsze animują okrąg, od dużego koła do otworu. Oto jak użyć w wersji demonstracyjnej @property, aby przeglądarka animowała maskę gradientu:

@property --focal-size {
  syntax: '<length-percentage>';
  initial-value: 100%;
  inherits: false;
}

.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );

  transition: --focal-size .3s ease;
}
Wypróbuj demo

Przeglądarka może teraz animować rozmiar gradientu, ponieważ zmniejszyliśmy powierzchnię modyfikacji do jednej właściwości i wpisaliśmy wartość, aby przeglądarka mogła inteligentnie interpolować długości.

@property może zrobić o wiele więcej, ale te małe ulepszenia mogą przynieść wiele korzyści.

Zasoby

Był w tym kraju: min-width lub max-width

Przed zakresami zapytań o multimedia zapytanie o multimedia w CSS używa wartości min-width i max-width do określania warunków nad i pod. Może on wyglądać tak:

@media (min-width: 320px) {
  
}

Po zakresach zapytań o media to samo zapytanie o media może wyglądać tak:

@media (width >= 320px) {
  
}

Zapytanie multimedialne CSS korzystające z ustawień min-widthmax-width może wyglądać tak:

@media (min-width: 320px) and (max-width: 1280px) {
  
}

Po zastosowaniu zakresów zapytań o multimedia to samo zapytanie o multimedia może wyglądać tak:

@media (320px <= width <= 1280px) {
  
}

W zależności od Twojego doświadczenia z kodowaniem jeden z nich będzie znacznie czytelniejszy od drugiego. Dzięki dodatkowym specyfikacjom deweloperzy będą mogli wybrać te, które preferują, lub nawet używać ich zamiennie.

Zasoby

Brak zmiennych zapytania o multimedia

Przed @custom-media zapytania o multimedia musiały się powtarzać lub polegać na preprocesorach, aby wygenerować prawidłowy wynik na podstawie statycznych zmiennych w czasie kompilacji.

Po @custom-media CSS umożliwia zastępowanie zapytań o media i odwoływanie się do nich tak samo jak do właściwości niestandardowych.

Bardzo ważne jest nazewnictwo: pozwala dopasować cel do składni, co ułatwia udostępnianie i używanie elementów w zespołach. Oto kilka niestandardowych zapytań dotyczących mediów, które są stosowane w różnych projektach:

@custom-media --OSdark  (prefers-color-scheme: dark);
@custom-media --OSlight (prefers-color-scheme: light);

@custom-media --pointer (hover) and (pointer: coarse);
@custom-media --mouse   (hover) and (pointer: fine);

@custom-media --xxs-and-above (width >= 240px);
@custom-media --xxs-and-below (width <= 240px);

Teraz, gdy są zdefiniowane, mogę użyć jednego z nich w ten sposób:

@media (--OSdark) {
  :root {
    
  }
}

Znajdź pełną listę niestandardowych zapytań o multimedia, których używam w bibliotece komponentów niestandardowych w usłudze porównywania cen Open Props.

Zasoby

Selektory zagnieżdżone są bardzo przydatne

Przed wersją @nest w arkuszu stylów było wiele powtórzeń. Było to szczególnie niewygodne, gdy selektory były długie i każdy z nich kierował na niewielkie różnice. Wygoda zagnieżdżania to jedna z najczęstszych przyczyn stosowania wstępnego procesora.

Po @nest powtórzenie zostaje usunięte. Niemal wszystkie funkcje zagnieżdżania obsługiwane przez preprocesor będą dostępne wbudowane w usługę porównywania cen.

article {
  color: darkgray;
}

article > a {
  color: var(--link-color);
}

/* with @nest becomes */

article {
  color: darkgray;

  & > a {
    color: var(--link-color);
  }
}

Najważniejsze w zagnieżdżaniu jest to, że oprócz tego, że w zagnieżdżonym selektorze article nie powtarza się, kontekst stylu pozostaje w jednym bloku stylów. Zamiast przełączać się z jednego selektora i jego stylów na inny selektor ze stylami (przykład 1), czytelnik może pozostać w kontekście artykułu i widzieć linki do niego. Relacja i intencja stylu są ze sobą połączone, więc article wygląda jak własne.

Własność można też traktować jako centralizację. Zamiast szukać odpowiednich stylów w całej arkuszu stylów, możesz znaleźć je wszystkie w kontekście. Funkcja ta działa w przypadku relacji rodzic–dziecko, ale także w przypadku relacji dziecko–rodzic.

Rozważ komponent podrzędny, który chce się dostosować, gdy znajduje się w innym kontekście nadrzędnym niż ten, który jest właścicielem stylu i zmienia komponent podrzędny:

/* parent owns this, adjusting children */
section:focus-within > article {
  border: 1px solid hotpink;
}

/* with @nest becomes */

/* article owns this, adjusting itself when inside a section:focus-within */
article {
  @nest section:focus-within > & {
     border: 1px solid hotpink;
  }
}

@nest pomaga w ogólnej organizacji, centralizacji i przypisaniu własności do stylu. Komponenty mogą grupować i posiadać własne style, zamiast rozmieszczać je w ramach innych bloków stylów. W tych przykładach może się wydawać, że jest to niewielka zmiana, ale może ona mieć bardzo duży wpływ na wygodę i czytelność.

Zasoby

Określanie zakresu stylów jest bardzo trudne

Obsługa przeglądarek

  • Chrome: 118.
  • Edge: 118.
  • Firefox: za flagą.
  • Safari: 17.4.

Źródło

Przed @scope istniało wiele strategii, ponieważ style w CSS są kaskadowe, dziedziczone i mają domyślnie zakres globalny. Te funkcje CSS są bardzo wygodne dla wielu rzeczy, ale w przypadku złożonych witryn i aplikacji, z potencjalnie wieloma różnymi stylami komponentów, globalna przestrzeń i charakter kaskady mogą sprawić, że style będą wypływać.

Po @scope style nie tylko mogą być ograniczone tylko do określonego kontekstu, np. klasy, ale też określać, gdzie się kończą style i nie są one kaskadowe ani dziedziczone.

W tym przykładzie zakres nazwy BEM może być odwrócony, aby odzwierciedlał rzeczywiste intencje. Selektor BEM próbuje określić zakres koloru elementu header w kontenerze .card przy użyciu konwencji nazewnictwa. Wymaga to, aby nagłówek zawierał tę nazwę klasy, co kończy realizację celu. W przypadku @scope nie trzeba stosować żadnych konwencji nazewnictwa, aby osiągnąć ten sam cel bez znaczników w elemencie nagłówka:

.card__header {
  color: var(--text);
}

/* with @scope becomes */

@scope (.card) {
  header {
    color: var(--text);
  }
}

Kolejny przykład: mniej odnosi się do komponentu i więcej informacji o globalnym zakresie CSS. Motywy ciemny i jasny muszą współistnieć w arkuszu stylów, a kolejność ma znaczenie przy określaniu zwycięskiego stylu. Zwykle oznacza to, że style motywu ciemnego znajdują się po stylu motywu jasnego. Dzięki temu jasny motyw jest domyślny, a ciemny jest stylem opcjonalnym. Unikaj problemów z kolejnością i zakresem za pomocą @scope:

​​@scope (.light-theme) {
  a { color: purple; }
}

@scope (.dark-theme) {
  a { color: plum; }
}

Aby dopełnić tę historię, @scope pozwala też określić, gdzie kończy się zakres stylu. Nie można tego zrobić za pomocą żadnej konwencji nazewnictwa ani preprocesora. Jest to coś specjalnego, co może zrobić tylko wbudowany w przeglądarkę element CSS. W tym przykładzie elementy img i .content są stosowane tylko wtedy, gdy element potomny elementu .media-block jest elementem siostrza lub nadrzędnym elementu .content:

@scope (.media-block) to (.content) {
  img {
    border-radius: 50%;
  }

  .content {
    padding: 1em;
  }
}

Zasoby

Brak sposobu na użycie usługi porównywania cen w przypadku układu typu masonry

Przed wprowadzeniem siatki CSS z siatką najlepszym sposobem na uzyskanie układu elementów betonowych był JavaScript, ponieważ każda metoda CSS wykorzystująca kolumny lub flexbox niedokładnie reprezentowała kolejność treści.

Po zastosowaniu układu typu masonry z siatką nie będą już potrzebne żadne biblioteki JavaScript, a kolejność treści będzie prawidłowa.

Zrzut ekranu pokazujący układ typu masonry z liczbami przesuwającymi się u góry, a potem schodzącymi w dół
Zdjęcie i prezentacja z Smashing Magazine
https://www.smashingmagazine.com/native-css-masonry-layout-css-grid/

Powyższe demo jest realizowane za pomocą tego kodu CSS:

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
}

Cieszymy się, że jest to rozważane jako brak strategii dotyczącej układu strony, ale możesz wypróbować ją już dziś w Firefoksie.

Zasoby

CSS nie pomaga użytkownikom w zmniejszaniu ilości danych

Obsługa przeglądarek

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

Źródło

Przed wprowadzeniem zapytania o multimedia prefers-reduced-data JavaScript i serwer mogły zmieniać swoje działanie w zależności od systemu operacyjnego użytkownika lub opcji „oszczędzania danych” w przeglądarce, ale nie mogło tego zrobić CSS.

Po wysłaniu zapytania o multimedia prefers-reduced-data usługa porównywania cen może dołączyć do funkcji zwiększających wygodę użytkowników i odegrać swoją rolę w zapisywaniu danych.

@media (prefers-reduced-data: reduce) {
  picture, video {
    display: none;
  }
}

Poprzedni kod CSS jest używany w tym komponencie przewijania multimediów, a oszczędności mogą być ogromne. W zależności od tego, jak duży jest odwiedzany widoczny obszar, tym większe oszczędności przy wczytywaniu strony. Zapisywanie trwa, gdy użytkownicy wchodzą w interakcję ze scrollerami multimediów. Wszystkie obrazy mają atrybuty loading="lazy", co w połączeniu z kodem CSS ukrywającym element całkowicie sprawia, że nie jest wysyłane żądanie sieciowe grafiki.

Zrzut ekranu interfejsu karuzeli seriali z wieloma miniaturami i tytułami.

W przypadku widocznego obszaru o średnim rozmiarze początkowo wczytano 40 żądań i 700 KB zasobów. Gdy użytkownik przewija wybrane multimedia, wczytywanych jest więcej żądań i zasobów. W przypadku zapytania o multimedia z zapytaniem o ograniczone dane CSS wczytano 10 żądań i 172 KB zasobów. To pół megabajta oszczędności, a użytkownik nawet nie przewinął żadnego z multimediów. W tym momencie nie wysłano żadnych dodatkowych żądań.

Zrzut ekranu interfejsu karuzeli seriali i programów telewizyjnych bez miniatur i wielu tytułów.

Ta mniejsza ilość danych ma inne zalety niż tylko oszczędność danych. Widać więcej tytułów i nie ma żadnych rozpraszających grafik okładek, które mogłyby przyciągnąć uwagę. Wielu użytkowników korzysta z trybu oszczędzania danych, ponieważ płacą za każdy megabajt danych. Cieszymy się, że możemy pomóc w tej sprawie.

Zasoby

Funkcje przyciągania do krawędzi są zbyt ograniczone

Zanim pojawią się propozycje przyciągania przewijania, napisanie własnego kodu JavaScript do zarządzania karuzelą, suwakiem lub galerią może szybko się skomplikować wraz ze wszystkimi obserwatorami i zarządzaniem stanem. Jeśli nie zachowasz ostrożności, naturalne prędkości przewijania mogą zostać znormalizowane przez skrypt, przez co interakcja z użytkownikiem może wydawać się nieco nienaturalna i potencjalnie niewygodna.

Nowe interfejsy API

snapChanging()

To zdarzenie zostanie uruchomione, gdy tylko przeglądarka udostępni obiekt podrzędny. Dzięki temu interfejs użytkownika będzie odzwierciedlał brak elementu potomnego i nieokreślony stan suwaka, ponieważ jest on obecnie używany i będzie przesuwany w inne miejsce.

document.querySelector('.snap-carousel').addEventListener('snapchanging', event => {
  console.log('Snap is changing', event.snappedTargetsList);
});
snapChanged()

Gdy tylko przeglądarka przełączy się na nowy element podrzędny i przestanie się przewijać, to zdarzenie zostanie uruchomione. Dzięki temu wszystkie elementy interfejsu, które zależą od podrzędnego elementu podrzędnego, są aktualizowane i odzwierciedlają połączenie.

document.querySelector('.snap-carousel').addEventListener('snapchanged', event => {
  console.log('Snap changed', event.snappedTargetsList);
});
scroll-start

Przewijanie nie zawsze zaczyna się od początku. Weź pod uwagę komponenty przesuwane, w których przesuwanie w lewo lub w prawo wywołuje różne zdarzenia, oraz pasek wyszukiwania, który podczas wczytywania strony jest początkowo ukryty, dopóki nie przewiniesz do góry. Ta właściwość CSS pozwala deweloperom określić, że scroller powinien zaczynać się w konkretnym miejscu.

:root { --nav-height: 100px }

.snap-scroll-y {
  scroll-start-y: var(--nav-height);
}
:snap-target

Ten selektor arkusza CSS dopasuje elementy w kontenerze zrzutu przewijania, które są obecnie przyciągane przez przeglądarkę.

.card {
  --shadow-distance: 5px;
  box-shadow: 0 var(--shadow-distance) 5px hsl(0 0% 0% / 25%);
  transition: box-shadow 350ms ease;
}

.card:snapped {
  --shadow-distance: 30px;
}

Dzięki tym propozycjom skrótów do przewijania tworzenie suwaka, karuzeli lub galerii jest znacznie łatwiejsze, ponieważ przeglądarka oferuje teraz udogodnienia ułatwiające to zadanie, eliminując obserwatorów i kod sterujący przewijaniem na rzecz wbudowanych interfejsów API.

Funkcje CSS i JS są wciąż na wczesnym etapie rozwoju, ale wypatruj komponentów polyfill, które mogą pomóc w ich wdrożeniu i testowaniu.

Zasoby

Przełączanie się między znanymi stanami

Przed toggle() tylko stany wbudowane w przeglądarce mogły być już wykorzystywane do określania stylu i interakcji. Na przykład pole wyboru ma wartość :checked, która jest stanem przeglądarki zarządzanym wewnętrznie dla danych wejściowych, a którego kod CSS może używać do zmiany wyglądu elementu.

Po aktualizacji toggle() można tworzyć stany niestandardowe dla dowolnego elementu, aby można było zmieniać go za pomocą CSS i stosować do stylizacji. Umożliwia tworzenie grup, przełączanie się między kanałami i wiele innych funkcji.

W poniższym przykładzie taki sam efekt przekreślenia elementu listy w przypadku zakończenia, ale bez elementów pól wyboru:

<ul class='ingredients'>
   <li>1 banana
   <li>1 cup blueberries
  ...
</ul>

I odpowiednie style CSS toggle():

li {
  toggle-root: check self;
}

li:toggle(check) {
  text-decoration: line-through;
}

Jeśli znasz maszyny stanów, zauważysz, że toggle() ma z nimi wiele wspólnego. Ta funkcja pozwoli deweloperom tworzyć więcej stanów w CSS, co powinno zaowocować w jaśniejsze i bardziej semantyczne sposoby sterowania interakcją i stanem.

Zasoby

Dostosowywanie wybranych elementów

Przed <selectmenu> technologia CSS nie umożliwiała dostosowywania elementów <option> za pomocą sformatowanego kodu HTML ani wprowadzania istotnych zmian w sposobie wyświetlania listy opcji. Z tego powodu deweloperzy musieli wczytywać zewnętrzne biblioteki, które odtwarzały większość funkcji <select>. Zajęło to dużo czasu.

Po <selectmenu> deweloperzy mogą udostępniać bogaty kod HTML dla elementów opcji i stylizować je w dowolnym stopniu, zachowując jednocześnie zgodność z wymaganiami dotyczącymi ułatwień dostępu i zapewniając semantyczny kod HTML.

W tym przykładzie, pochodzącym ze <selectmenu> strony z informacjami, zostało utworzone nowe menu wyboru z kilkoma podstawowymi opcjami:

<selectmenu>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</selectmenu>

CSS może określać kierowanie na części elementu i określać ich styl:

.my-select-menu::part(button) {
  color: white;
  background-color: red;
  padding: 5px;
  border-radius: 5px;
}

.my-select-menu::part(listbox) {
  padding: 10px;
  margin-top: 5px;
  border: 1px solid red;
  border-radius: 5px;
}

Menu z wybranymi akcentami z czerwonymi akcentami.

Możesz wypróbować element <selectmenu> w Chromium w wersji Canary z włączoną flagą eksperymentów internetowych. W 2023 roku i później pojawią się opcje dostosowywania wybranych elementów menu.

Zasoby

Przypinanie jednego elementu do drugiego

Przed wersją anchor() strategie pozycjonowania bezwzględnego i względnego były dostępne dla programistów, aby elementy podrzędne mogły się przemieszczać w elemencie nadrzędnym.

Po anchor() deweloperzy mogą umieszczać elementy względem innych, niezależnie od tego, czy są to elementy podrzędne. Pozwala też programistom określić, na której krawędzi ma się znaleźć, i umożliwia określenie innych funkcji przy tworzeniu relacji pozycji między elementami.

Jeśli chcesz dowiedzieć się więcej, zapoznaj się z tym objaśnieniem, w którym znajdziesz kilka świetnych przykładów i fragmentów kodu.

Zasoby