Lekce 1.3

Moderní nativní CSS

Vlastní vlastnosti a zanořování bez preprocesoru, dotazy na velikost rodiče a specificita, kterou máme pod kontrolou.

Dotazy na velikost rodiče

Media query se ptá okna. Jenže to bývá špatná otázka: karta v postranním sloupci má úzko i na velkém monitoru, zatímco tatáž karta v hlavním obsahu má místa dost. Podle šířky okna se přitom obě chovají stejně.

Jedno okno prohlížeče, v něm úzký postranní sloupec a široký hlavní obsah. V každém je stejná karta: v úzkém sloupci má obrázek nad textem, v hlavním obsahu vedle textu.

Container query se ptá rodiče. Nejdřív se ale musí říct, který prvek se má měřit:

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

Hodnota inline-size znamená „měř mi šířku“. Na tu se pak dá ptát stejným zápisem, jaký známe z media query:

css
.card {
  display: grid;
  gap: var(--space);
}

@container (min-width: 24rem) {
  .card {
    grid-template-columns: 150px 1fr;
  }
}

Karta si teď o svém rozvržení rozhoduje sama a je jedno, kam ji na stránce vložíme. Přesně to od znovupoužitelné komponenty chceme – a přesně tenhle způsob uvažování budeme potřebovat, až se v modulu 04 pustíme do Reactu.

Pojmenované kontejnery

Když je kontejnerů nad prvkem víc, dá se vybrat, kterého se ptáme:

css
.sidebar {
  container: sidebar / inline-size;
}

@container sidebar (min-width: 20rem) {
  .card { ... }
}
Pozor

Ptát se dá jen na rodiče, nikdy na sebe. Prvek, který je sám kontejnerem, se ve svém @container neuvidí, takže se kolem karty musí udělat obal. Není to schválnost: kdyby karta reagovala na vlastní šířku, kterou zároveň mění, vznikla by nekonečná smyčka.

Bonus

Spolu s dotazy přibyly i jednotky odvozené od kontejneru. cqw je procento jeho šířky, podobně jako vw je procento šířky okna. Zkuste jimi napsat velikost nadpisu v kartě a porovnejte výsledek s clamp() z minulé lekce.