@container i :has(): strona docelowa dwóch nowych, elastycznych interfejsów API w Chromium 105

Zapytania dotyczące kontenera i funkcja :has() to połączenie idealne dla responsywnych stron internetowych. Na szczęście obie te funkcje pojawią się razem w Chromium 105. To ogromna aktualizacja zawierająca 2 funkcje, o które proszono nas bardzo często.

Zapytania dotyczące kontenera: krótkie podsumowanie

Zapytania dotyczące kontenera umożliwiają deweloperom wysyłanie zapytań do selektora nadrzędnego w celu uzyskania informacji o jego rozmiarze i stylu. Dzięki temu element podrzędny może mieć własną logikę stylizacji w wersji responsywnej, niezależnie od tego, gdzie znajduje się na stronie internetowej.

Zamiast polegać na widocznym obszarze przy określaniu stylu (np. o dostępnej przestrzeni), deweloperzy mogą teraz wysyłać zapytania o rozmiar elementów na stronie. Ta funkcja oznacza, że komponent ma własną logikę stylizacji w ramach strony responsywnej. Dzięki temu komponent jest znacznie bardziej odporny, ponieważ logika stylizacji jest do niego dołączona niezależnie od tego, gdzie się pojawia na stronie.

Korzystanie z zapytań dotyczących kontenera

Aby tworzyć zapytania dotyczące kontenerów, musisz najpierw ustawić ograniczenie w elemencie nadrzędnym. Aby to zrobić, ustaw wartość container-type w kontenerze nadrzędnym. Możesz mieć kartę z obrazem i tekstem, który wygląda tak:

Jedna karta dwukolumnowa.

Aby utworzyć zapytanie kontenera, ustaw container-type w kontenerze karty:

.card-container {
  container-type: inline-size;
}

Ustawienie container-type na inline-size powoduje zapytanie o rozmiar wewnętrznego kierunku do elementu nadrzędnego. W przypadku języków łacińskich, takich jak angielski, będzie to szerokość karty, ponieważ tekst jest wyświetlany od lewej do prawej.

Teraz możemy użyć tego kontenera do zastosowania stylów do dowolnego z jego elementów potomnych za pomocą @container:

.card {
  display: grid;
  grid-template-columns: 1fr 1fr;
}

@container (max-width: 400px) {
  .card {
    grid-template-columns: 1fr;
  }
}

Selektor nadrzędny :has()

Pseudoklasa CSS :has() umożliwia deweloperom sprawdzenie, czy element nadrzędny zawiera elementy podrzędne z określonymi parametrami.

Na przykład p:has(span) wskazuje selektor akapitu (p), który zawiera element span. Korzystając z tego atrybutu, możesz stylizować treść akapitu nadrzędnego lub dowolne treści w nim. Przykładem przydatnego zastosowania jest użycie elementu figure:has(figcaption) do nadania stylu elementowi figure zawierającego podpis. Więcej informacji o :has() znajdziesz w tym artykule Jhey Tompkins.

Zapytania dotyczące kontenerów i :has()

Możesz połączyć nadrzędne możliwości wyboru elementu :has() z nadrzędnymi możliwościami zapytań dotyczących kontenerów, aby utworzyć naprawdę dynamiczne style wbudowane.

Rozwińmy pierwszy przykład, czyli kartę rakiety. Co zrobić, jeśli masz kartę bez obrazu? Możesz zwiększyć rozmiar tytułu i zmienić układ siatki na pojedynczą kolumnę, aby wyglądał lepiej bez obrazu.

Większy tekst na karcie bez obrazu, który wyświetla się w kolumnie.

W tym przykładzie karta z obrazem ma szablon siatki 2-kolumnowej, a karta bez obrazu ma układ 1-kolumnowy. Dodatkowo karta bez obrazu ma większy nagłówek. Aby napisać to za pomocą :has(), użyj tego kodu CSS.

.card:has(.visual) {
  grid-template-columns: 1fr 1fr;
}

Aby zastosować styl z dwoma kolumnami powyżej, poszukaj elementu z klasą visual. Inną przydatną funkcją CSS jest :not(). Jest to część specyfikacji :has(), ale istnieje od dłuższego czasu i ma lepszą obsługę w przeglądarkach. Możesz nawet połączyć elementy :has() i :not() w ten sposób:

.card:not(:has(.visual)) h1 {
  font-size: 4rem;
}

W powyższym kodzie piszesz selektor, który określa styl elementu h1 na karcie, która nie zawiera klasy visual. W ten sposób możesz bardzo wyraźnie dostosować rozmiar czcionki.

Podsumowanie

Powyższe demo pokazuje kombinację atrybutów :has(), :not()@container, ale zapytania dotyczące kontenera sprawdzają się najlepiej, gdy ten sam element jest używany w kilku miejscach. Dodajmy trochę stylizacji i wyświetlmy te karty w siatce obok siebie.

Teraz możesz zobaczyć prawdziwą moc nowoczesnego CSS. Potrafimy pisać przejrzyste style za pomocą stylów ukierunkowanych, które bazują na logice i tworzą naprawdę solidne komponenty. Ponieważ te 2 potężne funkcje pojawiają się w Chromium 105 i są coraz częściej obsługiwane w różnych przeglądarkach, to niesamowity czas dla programistów UI!