9    Cascading Style Sheets (CSS)

Die Elemente von Websites werden mithilfe von CSS einheitlich formatiert und positioniert. JavaScript ermöglicht zusätzliche Veränderungen und Bewegungseffekte, bis hin zur Animation.

CSS ist die Abkürzung für Cascading Style Sheets. Man könnte dies übersetzen mit: Einander ergänzende Formatierungsvorlagen. Häufig wird nur der Begriff Style Sheets verwendet, ohne Cascading. Style Sheets geben uns die Möglichkeit:

Umfangreiche Websites mit vielen einzelnen Internetseiten nutzen normalerweise zentrale Formatierungen. Sie geben der Website ein einheitliches Aussehen, sparen Code und sind auf einfache Art und Weise für die gesamte Website änderbar.

Sie können Style Sheets mithilfe von JavaScript dynamisch verändern. Dies ergibt besonders im Bereich der Positionierung von Elementen interessante Möglichkeiten, bis hin zu Animationen, siehe Abschnitt 9.4, »Animation«.

In diesem Buch erläutere ich nur einen kleinen Teil der vielen CSS-Eigenschaften. In Abschnitt 9.3.3, »Name der Eigenschaften für CSS und JavaScript«, finden Sie eine Tabelle mit weiteren CSS-Eigenschaften, den zugehörigen JavaScript-Eigenschaften und einem Hinweis auf die jeweilige Beispieldatei. Die Beispieldateien finden Sie als Bonus zusammen mit den anderen Beispieldateien im Downloadpaket zum Buch.

9.1    Aufbau und Regeln

In diesem Abschnitt werde ich den Aufbau von Style Sheets, die Kombination verschiedener Style Sheets und einige Regeln für die Arbeit mit Style Sheets erläutern.

9.1.1    Orte und Selektoren

Style Sheets können Sie an verschiedenen Orten definieren:

Style Sheets werden bestimmten Teilen eines Dokuments mithilfe von Selektoren zugeordnet:

Nachfolgend werde ich die verschiedenen Orte und Selektoren anhand eines Beispiels erläutern. Style Sheets können aus mehreren CSS-Eigenschaften bestehen. Im vorliegenden Beispiel wird zunächst nur eine CSS-Eigenschaft genutzt: text-decoration mit dem Wert overline. Sie führt zu einer Überstreichung (nicht Unterstreichung!) des betreffenden Elements, siehe Abbildung 9.1.

Zunächst der erste Teil der Datei:

<!DOCTYPE html><html><head><meta charset="utf-8">
<title>CSS, Orte und Selektoren</title>
<link rel="stylesheet" href="css_extern.css">
<style>
      /* HTML-Selektor für alle Absätze */
p {text-decoration:overline}

/* Klassenselektor für Markierungen, die diese Klasse nutzen */
.ueber {text-decoration:overline}

/* ID-Selektor für das Element mit dieser ID */
#idOben {text-decoration:overline}
   </style>
</head>
...

Listing 9.1    Datei »css_angaben.htm«, Teil 1 von 3

Orte und Selektoren für Style Sheets

Abbildung 9.1    Orte und Selektoren für Style Sheets

Mithilfe der Angabe <link rel="stylesheet" ... > werden externe Style Sheets aus einer externen Datei eingebunden. Diese externe Datei kann von vielen Dateien eingebunden werden. Den Inhalt der externen Datei erläutere ich etwas weiter unten in diesem Absatz.

Die Style Sheets aus dem style-Container, der im Kopf der Datei eingebettet ist, gelten nur für die aktuelle Datei css-angaben.htm. Sie können erläuternde Kommentare zu den Style Sheets notieren, wie in JavaScript zwischen /* und */.

In HTML vor Version 5 war es notwendig, die link-Markierung bzw. den style-Container wie folgt zu schreiben:

<link rel="stylesheet" type="text/css" ...>
<style type="text/css">

Die CSS-Eigenschaft selbst besteht aus Eigenschaft und Wert, getrennt durch einen Doppelpunkt. Falls es mehrere CSS-Eigenschaften gibt, dann werden sie durch ein Semikolon voneinander getrennt. Das gesamte Style Sheet steht in geschweiften Klammern.

Selektoren ordnen die Style Sheets zu:

Es folgt der Inhalt der externen Datei:

/* HTML-Selektor für alle fett gedruckten Elemente */
b {text-decoration:overline}

Listing 9.2    Datei »css_extern.css«

Die externe Datei enthält einen Kommentar und ein Style Sheet mit einem HTML-Selektor. Dieser HTML-Selektor hat zur Folge, dass die Inhalte aller b-Container in allen Dateien überstrichen werden, die diese externe Datei einbinden.

Es folgt der zweite Teil der Datei css_angaben.htm:

...
<body>
<p>Der erste Absatz</p>
<p>Eine Liste:</p>
<ul>
<li>Erster <span class="ueber">Eintrag</span></li>
<li>Zweiter Eintrag</li>
<li class="ueber">Dritter Eintrag</li>
</ul>

<table>
<tr>
<td>Erste Zelle</td>
<td id="idOben">Zweite Zelle</td>
<td>Dritte <span style="text-decoration:overline">Zelle</span></td>
<td><b>Vierte</b> Zelle</td>
</tr>
</table>
...

Listing 9.3    Datei »css_angaben.htm«, Teil 2 von 3

Die beiden Absätze werden aufgrund des HTML-Selektors im Kopf der Datei überstrichen. Innerhalb der Liste gibt es zwei Elemente, denen die Klasse ueber zugewiesen wird: das span-Element im ersten Listeneintrag und der gesamte dritte Listeneintrag. Die Zuweisung erfolgt mithilfe des Attributs class.

Die zweite Zelle der Tabelle besitzt die ID idOben. Innerhalb der dritten Zelle erfolgt eine Inline-Angabe, mithilfe des Attributs style. Hier werden keine geschweiften Klammern benötigt. Mehrere Angaben würden Sie mit Semikolon voneinander trennen. In der vierten Zelle gibt es einen fett gedruckten Bereich, der gemäß dem externen Style Sheet überstrichen wird.

Ein node-Objekt bietet in aktuellen Browsern auch die Methode getElementsByClassName(). Diese liefert eine Liste aller Elemente, die die betreffende(n) CSS-Klasse(n) nutzen. In Abbildung 9.2 sehen Sie Namen und Inhalt der Elemente, die die Klasse ueber verwenden.

Auswertung von »getElementsByClassName()«

Abbildung 9.2    Auswertung von »getElementsByClassName()«

Es folgt der dritte Teil der Datei css_angaben.htm:

...
<script>
      var ueberListe = document.getElementsByClassName("ueber");
var aus = "";
for(let i=0; i<ueberListe.length; i++)
aus += ueberListe[i].nodeName + " "
+ ueberListe[i].firstChild.nodeValue + "\n";
alert(aus);
   </script>
</body></html>

Listing 9.4    Datei »css_angaben.htm«, Teil 3 von 3

Zwei Hinweise

9.1.2    Kombinationen

Selektoren und Klassen können miteinander kombiniert werden. Einige Beispiele dafür sehen Sie in diesem Abschnitt. Im Dokument wird neben der Überstreichung die CSS-Eigenschaft font-weight (Schriftgewicht) mit dem Wert bold für Fettdruck genutzt. Außerdem kommt die CSS-Eigenschaft font-style (Schriftstil) mit dem Wert italic für Kursivdruck zum Einsatz.

Zunächst der erste Teil des Dokuments:

<!DOCTYPE html><html><head><meta charset="utf-8">
<title>CSS, Kombinationen</title>
<style>
      p.ueber  {text-decoration:overline; font-weight:bold}
.schraeg {font-style:italic}
li b {text-decoration:overline}
div,td {text-decoration:overline}
   </style>
</head>
...

Listing 9.5    Datei »css_kombinationen.htm«, erster Teil

Bei der Angabe p.ueber handelt es sich um einen verbundenen Selektor. Dabei müssen die beiden unterschiedlichen Selektoren zutreffen, also hier der HTML-Selektor und der Klassenselektor. Es werden nur die Absätze überstrichen und fett gedruckt, denen die Klasse ueber zugeordnet ist. Es werden mehrere CSS-Eigenschaften aufgelistet, durch Semikolon voneinander getrennt.

Es folgt ein einfacher Klassenselektor: die Klasse schraeg.

Bei der Angabe li b (ohne Punkt dazwischen) handelt es sich um einen verschachtelten Selektor. Dabei müssen ebenfalls die beiden Selektoren zutreffen, allerdings in geschachtelter Form. Es werden nur die Teile des Dokuments überstrichen, die sich innerhalb eines b-Containers befinden, der wiederum innerhalb eines li-Containers steht.

Sie können mehrere Selektoren nacheinander aufreihen, durch Komma voneinander getrennt. Die nachfolgenden Style Sheets werden für alle Selektoren verwendet. Sowohl die Inhalte von div-Containern als auch die Inhalte von Zellen werden überstrichen.

Es folgt der zweite Teil des Dokuments:

...
<body>
<p class="ueber">Der erste Absatz</p>
<p>Der <i class="ueber">zweite</i> Absatz</p>
<div>Eine weitere Zeile</div>
<p>Eine <b>Liste</b>:</p>
<ul>
<li>Erster <b>Eintrag</b></li>
<li>Zweiter Eintrag</li>
</ul>

<table>
<tr>
<td>Erste Zelle</td>
<td>Zweite Zelle</td>
</tr>
</table>
<p class="ueber schraeg">Der letzte Absatz</p>
</body></html>

Listing 9.6    Datei »css_kombinationen.htm«, zweiter Teil

Der erste Absatz wird überstrichen und fett gedruckt, weil ihm zusätzlich die Klasse ueber zugewiesen wird. Im zweiten Absatz wird nichts überstrichen oder fett gedruckt. Dem i-Container innerhalb dieses zweiten Absatzes wird zwar die Klasse ueber zugewiesen, aber nicht dem gesamten Absatz.

Es folgt ein überstrichener div-Container.

Im Absatz über der Liste trifft kein Selektor zu. Es gibt zwar einen b-Container, er steht aber nicht in einem li-Container. Anders sieht es aus beim zweiten Wort des ersten Listeneintrags: Hier haben wir einen b-Container innerhalb eines li-Containers.

Innerhalb der Tabelle gibt es zwei überstrichene td-Container.

Dem letzten Absatz werden zwei Klassen zugeordnet, durch Leerzeichen getrennt. Es werden also sowohl die Style Sheets der Klasse ueber als auch die Style Sheets der Klasse schraeg angewendet.

Das Ergebnis der Formatierungen sehen Sie in Abbildung 9.3.

Kombinationen von Selektoren

Abbildung 9.3    Kombinationen von Selektoren

9.1.3    Kaskadierung und Überlagerung

Dank der vielfältigen Möglichkeiten von CSS kommt es häufig vor, dass für ein bestimmtes Element im Dokument mehrere Style Sheets gelten. Dieses Verhalten ist erwünscht und erhöht die Flexibilität. So können neben zentralen Formatierungen für eine ganze Website auch lokale Formatierungen genutzt werden, ohne Widersprüche hervorzurufen.

Regeln für mehrere Style Sheets

Welche Regeln gelten beim Einsatz mehrerer Style Sheets?

Nachfolgend zeige ich dies an einem Beispiel:

<!DOCTYPE html><html><head><meta charset="utf-8">
<title>CSS, Regeln</title>
<link rel="stylesheet" href="css_extern.css">
<style>
      i {text-decoration:underline}
   </style>
</head>
<body>
<p>Der <i>erste</i> Absatz</p>
<p>Der <i style="text-decoration:line-through">zweite</i> Absatz</p>
<p>Der <i style="font-weight:bold">dritte</i> Absatz</p>
</body></html>

Listing 9.7    Datei »css_regeln.htm«

Zunächst werden die externen Style Sheets aus der Datei css_extern.css eingebunden, die Sie bereits aus Abschnitt 9.1.1, »Orte und Selektoren«, kennen. Dort wird definiert, dass kursive Bereiche überstrichen werden.

Eingebettet im Kopf des Dokuments wird dieselbe Eigenschaft für denselben Selektor definiert, aber mit einem anderen Wert überlagert. Damit gilt innerhalb dieses Dokuments, dass kursive Bereiche unterstrichen werden, wie Sie dies beim ersten Absatz sehen.

Innerhalb des zweiten Absatzes wird eine dritte Definition für dieselbe Eigenschaft, wiederum für einen kursiven Bereich, vorgenommen. Es kommt wieder zu einer Überlagerung, und dieser Bereich wird durchgestrichen. Die Inline-Angabe hat den Vorrang vor der eingebetteten Angabe.

Im dritten Absatz kommt es innerhalb des kursiven Bereichs zu einer Kaskadierung von Eigenschaften. Zur Unterstreichung kommt eine andere Eigenschaft hinzu: der Fettdruck.

Das Ergebnis sehen Sie in Abbildung 9.4.

Kaskadierung und Überlagerung

Abbildung 9.4    Kaskadierung und Überlagerung