Ga naar de inhoud

Moderne CSS ​

Drie dingen die je stylesheet leesbaar houden nu ze lang begint te worden.

Logical properties ​

In les 4 gebruikte je al margin-inline en padding-inline voor je container. Hier is waarom die bestaan.

Een opdracht: zet 1rem marge aan het begin van de zin.

css
margin-left: 1rem;

Dat klopt zolang de tekst van links naar rechts loopt. In het Arabisch en het Hebreeuws loopt ze van rechts naar links, en dan staat je marge aan het einde.

css
margin-inline-start: 1rem;

Deze versie redeneert vanaf het begin en het einde van de leesrichting, en volgt dus het dir attribuut van je document.

📖 inline volgt de leesrichting, block staat daar loodrecht op.

Van zowat elke richting bestaat een logische variant:

FysiekLogisch
margin-left, margin-rightmargin-inline-start, margin-inline-end
margin-top, margin-bottommargin-block-start, margin-block-end
padding-left en -right samenpadding-inline
widthinline-size
heightblock-size
top, left bij positioninginset-block-start, inset-inline-start

⚠️ Vanaf nu

Gebruik de logische varianten. In je labo's wordt erop gelet.

Custom properties ​

Je herhaalt dezelfde kleur op tien plaatsen in je stylesheet. Wil je ze aanpassen, dan moet je ze tien keer zoeken.

Een custom property is een waarde die je één keer bewaart onder een eigen naam.

💡 In de volksmond

een variabele

css
:root {
    --primary: oklch(0.45 0.18 264);
    --bg: oklch(0.99 0.003 325);
    --line-height: 1.6;
}

De naam begint altijd met twee streepjes. Je gebruikt hem met var():

css
body {
    background-color: var(--bg);
    color: var(--primary);
}

Scope en overerving ​

Een custom property geldt voor het element waar je hem zet, en voor alle kinderen, kleinkinderen en verder. Zet je hem op :root, dan geldt hij voor je hele document.

Je kan hem lager overschrijven:

css
:root {
    --primary: oklch(0.45 0.18 264);
}

footer {
    --primary: oklch(0.9 0.05 264);
}

Alles in de footer gebruikt vanaf dan de lichtere kleur, zonder dat je één var() hoeft aan te passen.

Fallback ​

var() neemt een tweede waarde mee voor het geval de eerste niet bestaat:

css
color: var(--accent, oklch(0.5 0 0));

Je startbestand

Zet je kleuren en je line-height vanaf nu in :root als custom properties.
Je startbestand groeit daarmee mee.

Nesting ​

Regels die bij elkaar horen stonden tot nu los van elkaar:

css
.parent { }
.parent .child { }

Je mag ze nu in elkaar schrijven:

css
.parent {
    .child { }
}

De combinators uit les 4 werken gewoon mee:

css
.parent {
    + .sibling { }
    > .direct-child { }
    descendant { }
}

Voor een combined selector gebruik je &, dat naar het huidige element verwijst:

css
/* zonder nesting */
/* de elementen met class parent EN class active, géén spatie */
.parent.active { }

/* met nesting */
.parent {
    /* leest als: .parent&.active, géén spatie */
    &.active { }
}

Een voorbeeld ​

Vier losse regels:

css
ul.square {
    margin: 0;
}

ul.square li {
    list-style-type: square;
}

ul.square li > a {
    color: var(--accent);
}

ul.square li > a.active {
    color: var(--primary);
}

Dezelfde regels, genest:

css
ul.square {
    margin: 0;

    li {
        list-style-type: square;

        > a {
            color: var(--accent);

            &.active {
                color: var(--primary);
            }
        }
    }
}

Oefening ​

Herschrijf de vier regels met nesting. Het resultaat op de pagina moet precies hetzelfde blijven.

Nest niet te diep

Drie niveaus is veel. Hoe dieper je nest, hoe hoger je specificity en hoe moeilijker het wordt om de regel later te overschrijven. Zie specificity.