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.

Zanořování

Pravidla se dnes dají psát do sebe rovnou v CSS, bez preprocesoru a bez sestavování:

css
.card {
  padding: var(--space);

  & .title {
    font-size: 1.25rem;
  }

  &:hover {
    border-color: var(--color-action);
  }

  @media (min-width: 40rem) {
    display: flex;
  }
}

Znak & zastupuje vnější selektor, takže & .title je .card .title a &:hover je .card:hover. Celý rozdíl mezi nimi dělá jedna mezera a je to nejčastější překlep v zanořeném CSS:

css
.card {
  /* .card.is-active – tentýž prvek, který má obě třídy */
  &.is-active { border-color: var(--color-action); }

  /* .card .is-active – potomek uvnitř karty */
  & .is-active { font-weight: 700; }
}

U selektorů, které začínají jménem třídy nebo prvku, se & dá vynechat. Píšeme ho stejně, protože je pak na první pohled vidět, k čemu se pravidlo váže.

Pozor

Nativní zanořování neumí skládat jména. Zápis &__title uvnitř .card nedá .card__title – & je selektor, ne kus textu. Kdo píše třídy v BEM, tímhle způsobem zanoří jen selektory, ne názvy. Skládat jména umí SCSS a potkáme se s ním v bloku 1.5.

Kdy nezanořovat

Zanořování svádí k tomu, kopírovat do CSS strukturu HTML. Tři úrovně vypadají při psaní úhledně, jenže výsledkem je selektor .page .card .body .title, který je zbytečně specifický a nedá se rozumně přebít. Za měsíc pak nikdo netuší, proč se nadpis odmítá obarvit.

Osobně mám za rozumné pravidlo dvě úrovně zanoření a k tomu stavy prvku (&:hover, &[aria-current]), které úroveň nepřidávají. Cokoli hlubšího je většinou signál, že komponenta chce rozdělit na dvě.

Bonus

Zanořování má sourozence @scope, kterým se dá platnost pravidel omezit na kus stromu mezi dvěma prvky. Podívejte se na něj do dokumentace MDN a zjistěte, jaká je jeho podpora v prohlížečích.