LU13b - CSS Nesting

Seit 2023 unterstützen alle modernen Browser natives CSS Nesting. Sie können Regeln direkt ineinander verschachteln, was den Code lesbarer und wartbarer macht.

Das Problem ohne Nesting

Ohne Nesting muss jede Regel den vollständigen Selektor wiederholen:

.card { border-radius: 1rem; }
.card img { width: 100%; }
.card:hover { outline: 2px solid gold; }
.card p { opacity: 0; }
.card p.open { opacity: 1; }

Die Lösung mit Nesting

Mit Nesting schreibt man alle zusammengehörenden Regeln in einen einzigen Block:

.card {
    border-radius: 1rem;
 
    img {
        width: 100%;             /* wird zu: .card img */
    }
 
    &:hover {
        outline: 2px solid gold; /* wird zu: .card:hover */
    }
 
    p {
        opacity: 0;              /* wird zu: .card p */
 
        &.open {
            opacity: 1;          /* wird zu: .card p.sichtbar */
        }
    }
}

Das & (Ampersand)

Das & verweist immer auf den übergeordneten Selektor. Es ist zwingend, wenn die verschachtelte Regel direkt am Elternselektor angehängt werden soll – zum Beispiel bei Pseudo-Klassen oder zusätzlichen Klassen:

Verschachtelung Kompiliert zu Wann nötig
.card { img { } } .card img Kindelement (kein & nötig)
.card { &:hover { } } .card:hover Pseudo-Klasse am Elternelement
.card { &.aktiv { } } .card.active Zusätzliche Klasse am Elternelement
p { &.offen { } } p.open Zusätzliche Klasse am Elternelement

Praktisches Beispiel aus dem Projekt

Im Holiday-Explorer-Projekt wird Nesting verwendet, um die Beschreibung einer Kachel im geschlossenen und geöffneten Zustand zu stylen:

.text-wrapper {
    margin-top: auto;
    padding: 1.5rem;
 
    p {
        height: 0;
        opacity: 0;
        transition: all 300ms ease-in; /* wird zu: .text-wrapper p */
 
        &.open {
            height: auto;
            opacity: 1;              /* wird zu: .text-wrapper p.open */
        }
    }
}