====== 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 */
}
}
}