2.7 Der Clou: Spaltentrenner, einfach und perfekt

Im vorigen Abschnitt ging es darum, wie das globale Verhalten von clear:both; vermieden werden kann. Doch es gibt durchaus Fälle, in denen genau dieses Verhalten erwünscht ist. Innerhalb von YAML wird es dazu genutzt, die statische Spalte #col3 immer zur längsten Spalte werden zu lassen — unabhängig vom Füllstand der einzelnen Spalten.

Was hat dies für Vorteile? Wenn die statische Spalte #col3 immer genauso lang ist, wie die längste der beiden float-Spalten #col1 und #col2, dann können wir sie dazu benutzen, um auf einfache Weise Spaltentrenner (vertikale Voll-, Strich oder Punktlinien) zwischen den Spalten zu erzeugen. Diese Spaltentrenner würden somit immer bis hinunter zum Footer reichen. Damit die möglich wird, dürfen #col1, #col2 und #col3 innerhalb von #main nicht ineinander geschachtelt sein.

Wie wird aber #col3 zur längsten Spalte? Dazu wird am Ende von #col3 wird ein unsichtbarer HR-Tag eingefügt. Unsichtbar wird er durch seine speziellen CSS-Eigenschaften. Eine davon ist clear:both;.

...
<!-- DER CLOU: Globales CLEAR mittels HR -->
<hr class="clear_columns" />
...

Da es sich bei #col3 um ein statisches DIV handelt, ist die Wirkungsweise von clear:both; diesmal wirklich global, d.h. beendet alle Fließumgebungen im Layout - unsere float-Spalten #col1 und #col2. An dieser Stelle nutze ich also den in der Beispieldatei gobal_clear.html gezeigten Effekt für mein Layout gezielt aus.

artikel/xhtml/global_clear.html

Hinweis: Und hier nun die Antwort auf die am Ende des Abschnitts 2.3: Markupfreies Clearing gestellte Frage: Nur die Clearfix-Methode ermöglicht diesen Trick. Selbstverständlich würden sich die einzelnen Spalten genauso gut mit der Overflow-Methode clearen lassen. Der Nachteil dabei: Bei der Anwendung der Overflow-Methode in der CSS-Klasse .clearfix wäre der HR-Tag in #col3 nutzlos.

Den genauen Grund kann ich nicht erklären, die Auswirkungen hingegen schon: Die float-Spalten #col1 und #col2 bleiben in diesem Fall vor der Eigenschaft clear:both; des HR-Tags verborgen. Die statische Spalte #col3 würde daher nicht mehr zwingen zur längsten Spalte werden. Damit wäre der große Vorteil dahin, sie zur Bereitstellung der Spaltentrenner oder Spaltenhintergründe zu nutzen wie es im Kapitel 4: Modifikationen noch gezeigt werden wird.

Ich sprach von einem unsichtbaren HR-Tag. Dies wird mit einer kleinen CSS-Spielerei erledigt (siehe css/main/base.css). Wie man sieht, ist es gar nicht so einfach, den HR-Tag browserübergreifend anwesend aber dennoch unsichtbar zu gestalten.

.clear_columns{
    content: ".";
    display: block;
    height: 0;
    line-height: 0;
    clear: both;
    float: left;
    visibility: hidden;
    border: 0;
    padding: 0;
    margin: -2em 0 0 0;
}

Geschafft: Jetzt ist es möglich, die CSS-Eigenschaft border von #col3 als Spaltentrenner einzusetzen und ohne Grafikeinsatz, vertikale Linien zwischen den Spalten oder auch einfarbige Spaltenhintergründe für #col1 und #col2 zu definieren, die bis zum Footer reichen. Als Beispiel könnten wir Punkt-Linien erzeugen:

#col3 {
    border-left: 2px #eee dotted;
    border-right: 2px #eee dotted;
}

Sie wollen einen Beweis, dass es funktioniert? Bitte schön: Jede Spalte darf einmal die längste sein.

artikel/xhtml/spaltentrenner-test.html

Hinweis: Im Internet Explorer kann unter ganz bestimmten Bedingungen zu einer fehlerhaften Darstellung des linken Spaltentrenners kommen. Detailiertere Informationen dazu finden Sie im Abschnitt 5.3: Bekannte Probleme & Hinweise.

Damit sind der strukturelle Aufbau des XHTML-Quelltextes und die Funktionsweise des besonderen HR-Tags von YAML besprochen. Der erste Grundbaustein steht. Allerdings fehlen noch zwei wichtige CSS-Bausteine. Sie werden im Kapitel 2: CSS-Struktur ausführlich erläutert.

»»» Abschnitt 2.8: Skiplink Navigation