033.2 Lektion 1
Zertifikat: |
Web Development Essentials |
---|---|
Version: |
1.0 |
Thema: |
033 Gestaltung der Inhalte mit CSS |
Lernziel: |
033.2 CSS-Selektoren und Stilanwendung |
Lektion: |
1 von 1 |
Einführung
Wenn wir eine CSS-Regel schreiben, müssen wir dem Browser mitteilen, für welche Elemente die Regel gilt. Dies geschieht durch die Angabe eines Selektors: ein Muster, das auf ein Element oder eine Gruppe von Elementen passt. Selektoren gibt es in vielen verschiedenen Formen, die auf dem Namen des Elements, dessen Attributen, dessen relativer Platzierung in der Dokumentstruktur oder einer Kombination dieser Merkmale basieren.
Seitenweite Stile
Einer der Vorteile von CSS ist, dass Sie keine individuellen Regeln für Elemente mit demselben Stil schreiben müssen. Ein Sternchen wendet die Regel auf alle Elemente auf der Webseite an, wie im folgenden Beispiel gezeigt:
* {
color: purple;
font-size: large;
}
Der Selektor *
ist nicht die einzige Methode, um eine Stilregel auf alle Elemente der Seite anzuwenden. Ein Selektor, der mit dem Tag-Namen eines Elements übereinstimmt, wird als Typselektor bezeichnet, so dass jeder HTML-Tag-Name wie body
, p
, table
, em
usw. als Selektor dienen kann. In CSS wird der Stil des übergeordneten Elements an seine untergeordneten Elemente vererbt. In der Praxis hat also der Selektor *
die gleiche Wirkung wie die Anwendung einer Regel auf das Element body
:
body {
color: purple;
font-size: large;
}
Darüber hinaus ermöglicht die Kaskadierungsfunktion von CSS eine Feinabstimmung der vererbten Eigenschaften eines Elements. Sie können eine allgemeine CSS-Regel schreiben, die für alle Elemente auf der Seite gilt, und dann Regeln für bestimmte Elemente oder Elementgruppen ergänzen.
Wenn dasselbe Element zwei oder mehr widersprüchlichen Regeln unterliegt, wendet der Browser die Regel des spezifischsten Selektors an. Nehmen Sie die folgenden CSS-Regeln als Beispiel:
body {
color: purple;
font-size: large;
}
li {
font-size: small;
}
Der Browser wendet die Stile color: purple
und font-size: large
auf alle Elemente innerhalb des Elements body
an. Gibt es jedoch li
-Elemente in der Seite, wird der Browser den Stil font-size: large
durch den Stil font-size: small
ersetzen, da der li
-Selektor eine engere Beziehung zum li
-Element hat als der body
-Selektor.
CSS schränkt die Anzahl gleichwertiger Selektoren in einem Stylesheet nicht ein, so dass Sie zwei oder mehr Regeln mit demselben Selektor schreiben können:
li {
font-size: small;
}
li {
font-size: x-small;
}
In diesem Fall sind beide Regeln gleichermaßen spezifisch für das Element li
. Der Browser kann jedoch keine widersprüchlichen Regeln anwenden und wählt daher jene, die in der CSS-Datei weiter unten steht. Um Verwirrung zu vermeiden, empfiehlt es sich, alle Eigenschaften, die denselben Selektor verwenden, in Gruppen zusammenzufassen.
Die Reihenfolge, in der die Regeln im Stylesheet erscheinen, wirkt sich darauf aus, wie sie im Dokument angewendet werden, aber Sie können dieses Verhalten durch eine important
-Regel außer Kraft setzen. Wollen Sie aus irgendeinem Grund die beiden getrennten li
-Regeln beibehalten, aber die Anwendung der ersten statt der zweiten Regel erzwingen, markieren Sie die erste Regel als important
:
li {
font-size: small !important;
}
li {
font-size: x-small;
}
Vorsicht bei mit !important
gekennzeichneten Regeln! Sie unterbrechen die natürliche Kaskadierung des Stylesheets und machen es schwieriger, Probleme innerhalb der CSS-Datei zu finden und zu korrigieren.
Restriktive Selektoren
Wir haben gesehen, dass wir bestimmte geerbte Eigenschaften mit Selektoren ändern, die bestimmten Tags entsprechen. In der Regel müssen wir jedoch unterschiedliche Stile für Elemente desselben Typs verwenden.
Sie integrieren Attribute von HTML-Tags in Selektoren, um die Menge der Elemente, auf die sie sich beziehen, einzuschränken. Eine HTML-Seite hat beispielsweise zwei Arten von ungeordneten Listen (<ul>
): eine dient oben auf der Seite als Menü zu den Abschnitten der Website, die anderen als herkömmliche Listen im Body:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>CSS Basics</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
<div id="content">
<p>The three rocky planets of the solar system are:</p>
<ul>
<li>Mercury</li>
<li>Venus</li>
<li>Earth</li>
<li>Mars</li>
</ul>
<p>The outer giant planets made most of gas are:</p>
<ul>
<li>Jupiter</li>
<li>Saturn</li>
<li>Uranus</li>
<li>Neptune</li>
</ul>
</div><!-- #content -->
<div id="footer">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
</div><!-- #footer -->
</body>
</html>
Standardmäßig hat jedes Listenelement einen schwarzen Kreis auf der linken Seite. Vielleicht möchten Sie die Kreise in der Menüliste entfernen, während Sie sie in anderen Liste belassen. Der Selektor li
verbietet sich, da dadurch auch die Kreise in den Listen im Body verschwinden. Sie müssen dem Browser mitteilen, dass er nur die Listenelemente der einen Liste ändert, nicht aber die der anderen.
Es gibt mehrere Möglichkeiten, Selektoren für bestimmte Elemente auf der Seite zu schreiben. Wie bereits erwähnt, gehen wir dazu zunächst über Attribute der Elemente. Für dieses Beispiel nutzen wir das Attribut id
, um nur die oberste Liste anzugeben.
Das Attribut id
weist dem entsprechenden Element einen eindeutigen Bezeichner zu, den wir als Selektorteil der CSS-Regel nutzen. Bevor Sie die CSS-Regel schreiben, bearbeiten Sie die HTML-Beispieldatei und fügen id="topmenu"
zum Element ul
für das obere Menü hinzu:
<ul id="topmenu">
<li>Home</li>
<li>Articles</li>
<li>About</li>
</ul>
Es gibt bereits ein link
-Element im head
-Abschnitt des HTML-Dokuments, das auf die Stylesheet-Datei style.css
im selben Verzeichnis verweist, so dass wir die folgenden CSS-Regeln hinzufügen:
ul#topmenu {
list-style-type: none
}
Das Hash-Zeichen bezeichnet in einem Selektor nach einem Element eine ID (ohne Leerzeichen). Der Tag-Name links von der Raute ist optional, da es kein anderes Element mit derselben ID geben wird. Sie könnten den Selektor auch einfach als #topmenu
angeben.
Auch wenn list-style-type
keine direkte Eigenschaft des ul
-Elements ist, werden die CSS-Eigenschaften des übergeordneten Elements an seine Kinder vererbt, so dass die untergeordneten li
-Elemente den dem ul
-Element zugewiesenen Stil erben.
Nicht alle Elemente haben eine ID, über die sie sich auswählen lassen. Tatsächlich werden nur von wenigen wichtigen Layoutelementen auf einer Seite IDs erwartet. Nehmen Sie z.B. die Listen von Planeten im Beispielcode: Obwohl es möglich wäre, jedem einzelnen sich wiederholenden Element eindeutige IDs zuzuweisen, ist diese Methode für längere Seiten mit vielen Inhalten nicht praktikabel. Stattdessen nutzen wir die ID des übergeordneten div
-Elements als Selektor, um die Eigenschaften seiner inneren Elemente zu ändern.
Das div
-Element hat jedoch keinen direkten Bezug zu HTML-Listen, so dass das Hinzufügen der Eigenschaft list-style-type
keine Auswirkungen auf seine Kinder hat. Um den schwarzen Kreis in den Listen innerhalb des div
-Elements in einen hohlen Kreis umzuwandeln, sollten wir einen Nachfahrenselektor verwenden:
#topmenu {
list-style-type: none
}
#content ul {
list-style-type: circle
}
Der Selektor #content ul
wird als Nachfahrenselektor (Descendant Selector) bezeichnet, weil er nur mit den ul
-Elementen übereinstimmt, die Kinder des Elements sind, dessen ID content
lautet. Wir können so viele Abstufungen wie nötig vornehmen. Zum Beispiel würde #content ul li
nur für die li
-Elemente gelten, die Nachkommen von ul
-Elementen sind, die wiederum Nachkommen des Elements sind, dessen ID content
ist. In diesem Beispiel hat der längere Selektor jedoch dieselbe Wirkung wie #content ul
, da die li
-Elemente die CSS-Eigenschaften erben, die für ihr übergeordnetes ul
gelten. Nachfahrenselektoren sind eine wichtige Technik, wenn das Seitenlayout komplexer wird.
Nehmen wir an, Sie möchten die Eigenschaft font-style
der Listenelemente in der Liste topmenu
und in der Liste im footer div ändern und die Schrift schräg (oblique) setzen. Sie können nicht einfach eine CSS-Regel mit ul
als Selektor schreiben, da dies auch die Listenelemente im content div verändern würde. Bisher haben wir CSS-Eigenschaften über jeweils nur einen Selektor geändert und können diese Methode auch für diese Aufgabe anwenden:
#topmenu {
font-style: oblique
}
#footer ul {
font-style: oblique
}
Getrennte Selektoren sind jedoch nicht die einzige Möglichkeit. Mit CSS können wir Selektoren, die einen oder mehrere Stile gemeinsam haben, in einer durch Kommata getrennten Selektorenliste zusammenfassen:
#topmenu, #footer ul {
font-style: oblique
}
Durch die Gruppierung von Selektoren entfällt der zusätzliche Aufwand für die Erstellung doppelter Stile. Außerdem möchten Sie die Eigenschaft möglicherweise in Zukunft erneut ändern und müssen sich dann nicht an all die verschiedenen Stellen erinnern.
Klassen
Wenn Sie sich nicht zu viele Gedanken über die Elementhierarchie machen wollen, fügen Sie der Gruppe von Elementen, die Sie anpassen möchten, einfach eine class
hinzu. Klassen sind ähnlich wie IDs, identifizieren aber eine Gruppe von Elementen mit den gleichen Merkmalen statt nur ein einzelnes Element auf der Seite.
Nehmen Sie zum Beispiel die HTML-Beispielseite, an der wir gerade arbeiten. Es ist unwahrscheinlich, dass wir in realen Seiten so einfache Strukturen vorfinden, daher wäre es praktischer, ein Element nur über Klassen oder eine Kombination aus Klassen und Abstammung auszuwählen. Um die Eigenschaft font-style: oblique
auf die Menülisten anzuwenden, müssen wir zunächst die Eigenschaft class
zu den Elementen in der HTML-Datei hinzufügen — zunächst im oberen Menü:
<ul id="topmenu" class="menu">
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
Und dann im Menü der Fußzeile:
<div id="footer">
<ul class="menu">
<li><a href="/">Home</a></li>
<li><a href="/articles">Articles</a></li>
<li><a href="/about">About</a></li>
</ul>
</div><!-- #footer -->
Damit können wir die Selektorgruppe #topmenu, #footer ul
durch den klassenbasierten Selektor .menu
ersetzen:
.menu {
font-style: oblique
}
Wie bei den ID-basierten Selektoren ist das Hinzufügen des Tag-Namens links vom Punkt bei klassenbasierten Selektoren optional. Im Gegensatz zu IDs kann dieselbe Klasse jedoch in mehr als einem Element verwendet werden, und sie müssen nicht einmal vom selben Typ sein. Wenn also verschiedene Elementtypen die Klasse menu
nutzen, würde der Selektor ul.menu
nur auf die ul
-Elemente der Klasse menu
passen. Stattdessen passt der Selektor .menu
auf jedes Element mit der Klasse menu
, unabhängig von dessen Typ.
Außerdem können Sie Elemente mit mehr als einer Klasse assoziieren. Um etwa zwischen dem oberen und dem unteren Menü zu unterscheiden, fügen wir jedem eine zusätzliche Klasse hinzu:
<ul id="topmenu" class="menu top">
Und im Menü der Fußzeile:
<ul class="menu footer">
Enthält das Attribut class
mehr als eine Klasse, müssen sie durch Leerzeichen getrennt werden. Zusätzlich zu der CSS-Regel, die die Elemente der Klasse menu
gemeinsam nutzen, können wir nun das obere und das untere Menü mit ihren entsprechenden Klassen ansprechen:
.menu {
font-style: oblique
}
.menu.top {
font-size: large
}
.menu.footer {
font-size: small
}
Beachten Sie, dass die Schreibweise .menu.top
sich von .menu .top
(mit einem Leerzeichen zwischen den Wörtern) unterscheidet. Der erste Selektor passt auf Elemente, die sowohl die Klassen menu
als auch top
haben, während der zweite auf Elemente passt, die die Klasse top
und ein übergeordnetes Element mit der Klasse menu
haben.
Spezielle Selektoren
CSS-Selektoren können auch dynamischen Zuständen von Elementen entsprechen. Diese Selektoren sind besonders nützlich für interaktive Elemente, wie z.B. Hyperlinks. Sie möchten vielleicht, dass Hyperlinks erscheinen, wenn der Mauszeiger darüber fährt, um die Aufmerksamkeit des Besuchers darauf zu lenken.
Zurück zu unserer Beispielseite: Wir entfernen die Unterstreichungen aus den Links im oberen Menü und zeigen nur dann eine Linie an, wenn der Mauszeiger über den entsprechenden Link bewegt wird. Dazu schreiben wir zunächst eine Regel, um die Unterstreichung aus den Links im oberen Menü zu entfernen:
.menu.top a {
text-decoration: none
}
Dann nutzen wir die Pseudoklasse :hover
für dieselben Elemente, um eine CSS-Regel zu erstellen, die nur gilt, wenn sich der Mauszeiger über dem entsprechenden Element befindet:
.menu.top a:hover {
text-decoration: underline
}
Der Pseudoklassenselektor :hover
akzeptiert alle CSS-Eigenschaften der herkömmlichen CSS-Regeln. Zu den weiteren Pseudoklassen gehören :visited
, das Hyperlinks entspricht, die bereits besucht wurden, und :focus
, das Formularelementen entspricht, die den Fokus haben.
Geführte Übungen
-
Einer HTML-Seite ist ein Stylesheet zugeordnet, das die beiden folgenden Regeln enthält:
p { color: green; } p { color: red; }
Welche Farbe wird der Browser auf den Text innerhalb der
p
-Elemente anwenden? -
Was ist der Unterschied zwischen den ID-Selektoren
div#main
und#main
? -
Welcher Selektor passt zu allen
p
-Elementen innerhalb einesdiv
mit dem ID-Attribut#main
? -
Was ist der Unterschied zwischen den Klassenselektoren
p.highlight
und.highlight
?
Offene Übungen
-
Schreiben Sie eine einzige CSS-Regel, die die Eigenschaft
font-style
inoblique
ändert. Die Regel soll nur aufa
-Elemente passen, die sich innerhalb von<div id="sidebar"></div>
oder<ul class="links"></ul>
befinden. -
Sie wollen den Stil der Elemente ändern, deren Attribut
class
aufarticle reference
gesetzt ist, wie in<p class="article reference">
. Der Selektor.article .reference
scheint ihr Aussehen jedoch nicht zu verändern. Warum passt der Selektor nicht wie erwartet zu den Elementen? -
Schreiben Sie eine CSS-Regel, um die Eigenschaft
color
aller besuchten Links auf der Seite inred
zu ändern.
Zusammenfassung
Diese Lektion behandelt CSS-Selektoren und wie der Browser entscheidet, welche Stile auf die einzelnen Elemente anzuwenden sind. Da CSS vom HTML-Markup getrennt ist, bietet es viele Selektoren, um einzelne Elemente oder Gruppen von Elementen auf der Seite anzupassen. In dieser Lektion werden die folgenden Konzepte und Verfahren behandelt:
-
Seitenweite Stile und Stilvererbung.
-
Elemente nach Typ gestalten.
-
Element-ID und Klasse als Selektor.
-
Zusammengesetzte Selektoren.
-
Pseudoklassen zur dynamischen Gestaltung von Elementen.
Lösungen zu den geführten Übungen
-
Einer HTML-Seite ist ein Stylesheet zugeordnet, das die beiden folgenden Regeln enthält:
p { color: green; } p { color: red; }
Welche Farbe wird der Browser auf den Text innerhalb der
p
-Elemente anwenden?Die Farbe
red
. Wenn zwei oder mehr gleichwertige Selektoren widersprüchliche Eigenschaften haben, wählt der Browser den letzten. -
Was ist der Unterschied zwischen den ID-Selektoren
div#main
und#main
?Der Selektor
div#main
passt auf eindiv
-Element mit der IDmain
, während der Selektor#main
auf das Element mit der IDmain
passt, unabhängig von dessen Typ. -
Welcher Selektor passt zu allen
p
-Elementen innerhalb einesdiv
mit dem ID-Attribut#main
?Der Selektor
#main p
oderdiv#main p
. -
Was ist der Unterschied zwischen den Klassenselektoren
p.highlight
und.highlight
?Der Selektor
p.highlight
passt nur auf die Elemente des Typsp
mit der Klassehighlight
, während der Selektor.highlight
auf alle Elemente der Klassehighlight
passt, unabhängig von deren Typ.
Lösungen zu den offenen Übungen
-
Schreiben Sie eine einzige CSS-Regel, die die Eigenschaft
font-style
inoblique
ändert. Die Regel soll nur aufa
-Elemente passen, die sich innerhalb von<div id="sidebar"></div>
oder<ul class="links"></ul>
befinden.#sidebar a, ul.links a { font-style: oblique }
-
Sie wollen den Stil der Elemente ändern, deren Attribut
class
aufarticle reference
gesetzt ist, wie in<p class="article reference">
. Der Selektor.article .reference
scheint ihr Aussehen jedoch nicht zu verändern. Warum passt der Selektor nicht wie erwartet zu den Elementen?Der Selektor
.article .reference
passt zu den Elementen der Klassereference
, die von Elementen der Klassearticle
abstammen. Um Elemente zu finden, die sowohl die Klassearticle
als auch die Klassereference
haben, sollte der Selektor.article.reference
lauten (ohne das Leerzeichen dazwischen). -
Schreiben Sie eine CSS-Regel, um die Eigenschaft
color
aller besuchten Links auf der Seite inred
zu ändern.a:visited { color: red; }