The CSS Podcast – 005: Inheritance
Angenommen, Sie haben gerade CSS 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;
}
Anschließend fügen Sie einem Inhaltsartikel ein Link-Element mit dem class
-Wert .my-button
hinzu. Es gibt jedoch ein Problem: Der Text hat nicht die Farbe, die Sie erwartet haben. Wie kam es dazu?
Einige CSS-Eigenschaften werden übernommen, wenn Sie keinen Wert dafür angeben.
Im Fall dieser Schaltfläche wurde die color
aus diesem CSS übernommen:
article a {
color: maroon;
}
In dieser Lektion erfahren Sie, warum das passiert und wie Sie mit der Vererbung weniger CSS schreiben können.
Übernahmeablauf
Sehen Sie sich an, wie die Übernahme mit diesem HTML-Snippet funktioniert:
<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 abwärts kaskadiert.
html {
color: lightslategray;
}
Das Attribut color
wird standardmäßig von anderen Elementen übernommen.
Das html
-Element hat color: lightslategray
. Daher haben alle Elemente, die Farbe übernehmen können, jetzt die Farbe lightslategray
.
body {
font-size: 1.2em;
}
p {
font-style: italic;
}
Nur für <p>
wird der Text kursiv formatiert, 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 finden Sie die vollständige Liste der Attribute, die standardmäßig übernommen werden, aus der W3-Referenz aller CSS-Attribute:
- azimuth
- 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
- Orphans
- Zitate
- text-align
- text-indent
- text-transform
- Sichtbarkeit
- white-space
- Schlusszeilen
- word-spacing
Funktionsweise der Übernahme
Für jedes HTML-Element ist jede CSS-Eigenschaft standardmäßig mit einem Anfangswert definiert. Ein Anfangswert ist eine Eigenschaft, die nicht übernommen wird und als Standardwert angezeigt wird, wenn die Kaskade keinen Wert für dieses Element berechnen kann.
Eigenschaften, die vererbt werden können, werden abwärts kaskadiert. Untergeordnete Elemente erhalten einen berechneten Wert, der dem Wert des übergeordneten Elements entspricht.
Wenn für ein übergeordnetes Element font-weight
auf bold
festgelegt ist, werden alle untergeordneten Elemente fett formatiert, sofern für ihr font-weight
kein anderer Wert festgelegt ist oder das User-Agent-Stylesheet einen Wert für font-weight
für dieses Element enthält.
Explizite Vererbung und Steuerung der Vererbung
Die Vererbung kann sich unerwartet auf Elemente auswirken. Deshalb bietet CSS Tools, die dabei helfen.
Das Keyword inherit
Mit dem Keyword inherit
können Sie dafür sorgen, dass eine beliebige Property den berechneten Wert ihres übergeordneten Elements übernimmt.
Eine sinnvolle Verwendung dieses Schlüsselworts ist das Erstellen von Ausnahmen.
strong {
font-weight: 900;
}
Mit diesem CSS-Snippet wird für alle <strong>
-Elemente ein font-weight
von 900
festgelegt. Der Standardwert wäre bold
, was font-weight: 700
entspricht.
.my-component {
font-weight: 500;
}
Mit der Klasse .my-component
wird font-weight
stattdessen auf 500
festgelegt.
Damit die <strong>
-Elemente in .my-component
auch font-weight: 500
sind, fügen Sie Folgendes hinzu:
.my-component strong {
font-weight: inherit;
}
Die <strong>
-Elemente in .my-component
haben jetzt den font-weight
-Wert 500
.
Sie können diesen Wert explizit festlegen. Wenn Sie jedoch inherit
verwenden und sich das CSS von .my-component
in Zukunft ändert, wird Ihr <strong>
automatisch aktualisiert.
Das Keyword initial
Die Vererbung kann Probleme mit Ihren Elementen verursachen. Mit initial
haben Sie eine leistungsstarke Option zum Zurücksetzen.
Wie Sie bereits gelernt haben, hat jede Eigenschaft in CSS einen Standardwert.
Mit dem Schlüsselwort initial
wird eine Property auf den ursprünglichen Standardwert zurückgesetzt.
aside strong {
font-weight: initial;
}
Mit diesem Snippet wird die Schriftstärke „fett“ aus allen <strong>
-Elementen in einem <aside>
-Element entfernt und stattdessen die normale Schriftstärke verwendet, die der ursprüngliche Wert ist.
Das Keyword unset
Das Attribut unset
verhält sich unterschiedlich, je nachdem, ob ein Attribut standardmäßig übernommen wird oder nicht.
Wenn ein Attribut standardmäßig übernommen wird, ist das Keyword unset
dasselbe wie inherit
.
Wenn die Eigenschaft nicht standardmäßig übernommen wird, entspricht das Schlüsselwort unset
dem Wert initial
.
Es kann schwierig sein, sich zu merken, welche CSS-Eigenschaften standardmäßig übernommen werden. unset
kann in diesem Zusammenhang hilfreich sein.
color
wird beispielsweise 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;
}
margin
wird entfernt und color
wird wieder zum übernommenen berechneten Wert.
Sie können den Wert unset
auch mit der Property all
verwenden.
Was passiert, wenn die globalen p
-Stile einige zusätzliche Attribute erhalten?
Es gilt nur die Regel, 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 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;
}
Das Keyword revert
Wie Sie in der Lektion zum Kaskadenmodell gelernt haben, stammen Stile aus verschiedenen Quellen: User-Agent-Basisstile, Nutzerpräferenzstile und von Ihnen erstellte Stile. Mit dem Keyword revert
werden Stile rückgängig gemacht, die im selben Ursprung festgelegt sind, in dem das Keyword revert
verwendet wird.
Das ist nützlich, wenn Sie ein Design festgelegt haben, es aber in einigen Fällen nicht angewendet werden soll. Mit inherit
, initial
und unset
wird angegeben, wie der Wert eines Stils berechnet wird. Mit revert
wird nur angegeben, dass andere von Ihnen geschriebene Stile nicht angewendet werden.
p {
padding: 2em;
}
aside p {
padding: revert;
}
In diesem Snippet wird für <p>
-Elemente ein Innenabstand festgelegt. Wenn sich das <p>
-Element jedoch in einem <aside>
-Element befindet, wird überhaupt kein padding
angegeben. Stattdessen wird auf einen Stil für Nutzereinstellungen (falls einer festgelegt ist) oder auf die Basisstile des User-Agents zurückgegriffen.
Das Keyword revert-layer
Kaskadenebenen sind eine nützliche Möglichkeit, Ihre Stile zu organisieren und zu priorisieren. Das Schlüsselwort revert-layer
ähnelt revert
. Anstatt jedoch anzugeben, dass für eine Eigenschaft keine Ihrer Autorenstile angewendet werden sollen, werden nur die Stile in der aktuellen Ebene rückgängig gemacht.
Wenn Sie eine UI-Bibliothek eines Drittanbieters verwenden, ist es sinnvoll, sie in eine Ebene zu importieren und alle Überschreibungen in eine Ebene mit höherer Priorität einzufügen. Anschließend können Sie eine Überschreibung mit revert-layer
entfernen. Es werden dann die Standardeinstellungen der UI-Bibliothek verwendet.
Wenn in keinen anderen Layern ein Wert für die Eigenschaft angegeben ist, verhält sie sich wie revert
und verwendet einen Wert aus einem früheren Ursprung.
Wissen testen
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 verhält sich dann wie initial
?
reset
unset
superset