The CSS Podcast – 005: Inheritance
Angenommen, Sie haben gerade CSS-Code geschrieben, um Elemente wie eine Schaltfläche aussehen zu lassen.
<a href="http://example.com" class="my-button">I am a button link</a>
.my-button {
display: inline-block;
padding: 1rem 2rem;
text-decoration: none;
background: pink;
font: inherit;
text-align: center;
}
Fügen Sie dann einem Artikel ein Linkelement mit dem class
-Wert .my-button
hinzu. Es gibt jedoch ein Problem: Der Text hat nicht die gewünschte Farbe. Wie kam es dazu?
Einige CSS-Eigenschaften werden übernommen, wenn Sie keinen Wert für sie angeben.
In diesem Fall wurde die color
übernommen:
article a {
color: maroon;
}
In dieser Lektion erfahren Sie, warum das so ist und wie Vererbung eine leistungsstarke Funktion ist, mit der Sie weniger CSS schreiben können.
Übernahmevorgang
Sehen wir uns an, wie Vererbung funktioniert, anhand dieses HTML-Snippets:
<html>
<body>
<article>
<p>Lorem ipsum dolor sit amet.</p>
</article>
</body>
</html>
Das Stammelement (<html>
) erbt nichts, da es das erste Element im Dokument ist.
Wenn Sie dem HTML-Element CSS hinzufügen, wird es im Dokument kaskadiert.
html {
color: lightslategray;
}
Die Property color
wird standardmäßig von anderen Elementen übernommen.
Das html
-Element hat color: lightslategray
. Daher haben alle Elemente, die die Farbe übernehmen können, jetzt die Farbe lightslategray
.
body {
font-size: 1.2em;
}
p {
font-style: italic;
}
Nur das <p>
hat kursiven Text, da es das am tiefsten verschachtelte Element ist.
Die Vererbung erfolgt nur nach unten, nicht zurück zu übergeordneten Elementen.
Welche Properties werden standardmäßig übernommen?
Nicht alle CSS-Eigenschaften werden standardmäßig übernommen, aber viele. Hier ist die vollständige Liste der standardmäßig übernommenen Eigenschaften, die aus der W3-Referenz aller CSS-Eigenschaften übernommen wurde:
- Azimut
- border-collapse
- border-spacing
- caption-side
- Farbe
- cursor
- direction
- empty-cells
- font-family
- font-size
- font-style
- font-variant
- font-weight
- font
- letter-spacing
- line-height
- list-style-image
- list-style-position
- list-style-type
- list-style
- Waisen
- Zitate
- text-align
- text-indent
- text-transform
- Sichtbarkeit
- white-space
- Witwen
- word-spacing
Funktionsweise der Vererbung
Für jedes HTML-Element ist standardmäßig eine CSS-Eigenschaft mit einem Anfangswert definiert. Ein Anfangswert ist eine Eigenschaft, die nicht übernommen wird und als Standardwert angezeigt wird, wenn in der Kaskade kein Wert für dieses Element berechnet werden kann.
Eigenschaften, die übernommen werden können, werden nach unten vererbt. Untergeordnete Elemente erhalten einen berechneten Wert, der dem Wert des übergeordneten Elements entspricht.
Wenn also für ein übergeordnetes Element font-weight
auf bold
festgelegt ist, werden alle untergeordneten Elemente fett formatiert, es sei denn, für font-weight
ist ein anderer Wert festgelegt oder das User-Agent-Stylesheet enthält einen Wert für font-weight
für dieses Element.
Überschreibungen explizit erben und steuern
Die Vererbung kann sich auf Elemente auf unerwartete Weise auswirken. CSS bietet Tools, die dabei helfen können.
Das Keyword inherit
Mit dem Keyword inherit
können Sie festlegen, dass eine Property den berechneten Wert der übergeordneten Property erbt.
Sie können dieses Keyword beispielsweise verwenden, um Ausnahmen zu erstellen.
strong {
font-weight: 900;
}
Mit diesem CSS-Snippet wird für alle <strong>
-Elemente ein font-weight
von 900
festgelegt, anstelle des Standardwerts bold
, der dem Wert font-weight: 700
entspricht.
.my-component {
font-weight: 500;
}
Die Klasse .my-component
setzt font-weight
stattdessen auf 500
.
Wenn die <strong>
-Elemente in .my-component
auch font-weight: 500
sein sollen, fügen Sie Folgendes hinzu:
.my-component strong {
font-weight: inherit;
}
Die <strong>
-Elemente in .my-component
haben jetzt eine font-weight
von 500
.
Sie können diesen Wert auch explizit festlegen. Wenn Sie jedoch inherit
verwenden und sich das CSS von .my-component
in Zukunft ändert, ist sichergestellt, dass Ihre <strong>
automatisch auf dem neuesten Stand bleibt.
Das Keyword initial
Die Vererbung kann Probleme mit Ihren Elementen verursachen. initial
bietet Ihnen eine leistungsstarke Option zum Zurücksetzen.
Sie haben bereits gelernt, dass jede CSS-Eigenschaft einen Standardwert hat.
Mit dem Schlüsselwort initial
wird eine Property auf diesen ursprünglichen Standardwert zurückgesetzt.
aside strong {
font-weight: initial;
}
Mit diesem Snippet wird die Fettdruckschrift aus allen <strong>
-Elementen in einem <aside>
-Element entfernt und stattdessen die normale Schriftart verwendet, was der Standardwert ist.
Das Keyword unset
Das Attribut unset
verhält sich anders, wenn eine Property standardmäßig übernommen wird oder nicht.
Wenn eine Property standardmäßig übernommen wird, ist das Keyword unset
mit inherit
identisch.
Wenn die Property nicht standardmäßig übernommen wird, ist das Keyword unset
gleich initial
.
Es kann schwierig sein, sich zu merken, welche CSS-Eigenschaften standardmäßig übernommen werden. In diesem Zusammenhang kann unset
hilfreich sein.
Beispiel: color
wird standardmäßig übernommen, margin
jedoch nicht. Sie können also Folgendes schreiben:
/* Global color styles for paragraph in authored CSS */
p {
margin-top: 2em;
color: goldenrod;
}
/* The p needs to be reset in asides, so you can use unset */
aside p {
margin: unset;
color: unset;
}
Jetzt wird margin
entfernt und color
nimmt wieder den übernommenen berechneten Wert an.
Sie können den Wert unset
auch mit der Property all
verwenden.
Was passiert im obigen Beispiel, wenn die globalen p
-Stile einige zusätzliche Eigenschaften erhalten?
Es wird nur die Regel angewendet, die für margin
und color
festgelegt wurde.
/* Global color styles for paragraph in authored CSS */
p {
margin-top: 2em;
color: goldenrod;
padding: 2em;
border: 1px solid;
}
/* Not all properties are accounted for anymore */
aside p {
margin: unset;
color: unset;
}
Wenn Sie die aside p
-Regel stattdessen in all: unset
ändern, spielt es keine Rolle, welche globalen Stile in Zukunft auf p
angewendet werden. Sie werden immer zurückgesetzt.
aside p {
margin: unset;
color: unset;
all: unset;
}
Wissen testen
Ihr Wissen über Vererbung testen
Welche der folgenden Eigenschaften werden standardmäßig übernommen?
animation
font-size
color
text-align
line-height
Welcher Wert verhält sich wie inherit
, es sei denn, es gibt nichts zu übernehmen, und dann wie initial
?
reset
unset
superset