Keywords

CSS Layouts versus tabellenbasierte Layouts

War es bis vor kurzem noch gebräuchlich, mehrspaltige Layouts oder auch mittig zentrierte Webseiten mit Hilfe von Tabellen zu realisieren (table-based Layouts), so bietet CSS mehrere Möglichkeiten, die diese eigentlich missbräuchliche Verwendung von Tabellen nicht mehr erforderlich machen. Das hat abgesehen davon, dass in den xhtml-Dateien keine Eigenschaften mehr vorhanden sind die das Aussehen der Seite betreffen, den Vorteil dass mehrere verschiedene CSS-Dateien auch voneinander gänzlich verschiedene Layouts für einunddiesselbe Webseite anbieten können - und der Benutzer bestimmt für sich, welches dieser Layouts er verwenden möchte.
Bei tabellen-basierten Layouts ist es z.B. nicht möglich gewesen, Navigationselemente einmal links vom Content und ein anderes Mal rechts vom Content auszurichten - dazu musste man die xhtml-Dateien ändern. Ein weiterer Nachteil bei tabellenbasierten Layouts war ihre Wartbarkeit - wollte man z.B. bei einer horizontalen Navigation noch einen neuen Punkt hinzufügen, so war meistens ein aufwändiges Abändern der Tabelle(n) notwendig - damit verbunden auch oft ein neues "Slicen" der Hintergrundbilder in Photoshop o.ä. und bei dynamischen Seiten ein Anpassen der Scripte.
CSS-basierte Layouts können in ihren Abmessungen nicht nur - wie bisher von Tabellenlayouts gewohnt - fixe Größen haben (iced layouts) sondern können sich auch entweder der Browserfenstergröße (liquid layout) oder der eingestellten Schriftgröße anpassen (elastic layout) .

Bei allen folgenden Layouttypen können Position und Ausrichtung rein durch entsprechende Regeln in der CSS-Datei festgelegt werden.

Anmerkung zu den verlinkten Beispiel-Dateien: Zusätzlich zu den absolut notwendigen CSS-Regeln wurden manchmal noch Farb-, Schrift- und Abstandsdefinitionen hinzugefügt, damit die Elemente im Webbrowser besser wahrgenommen und voneinander unterschieden werden können.

Zentrieren einer Seite

Die einfachste Form eines Seitenlayouts ist eine zentrierte Webseite mit einer fixen Breite. Dabei gibt es zwei Ansätze, die technisch beide in allen graphischen Webbrowsern, die CSS unterstützen, funktionieren.

Beide Beispiele gehen dabei von einer xhtml-Datei mit dem folgenden einfachen Aufbau aus:

[...]
<body>
    <div id="container">
       [...]
    </div>
</body>


Relatives Positionieren und negative margins
Um Inhalt im Browserfenster zentrieren zu können, muss man diesen in ein div-Element packen. Diesem Container muss man eine bestimmte Breite zuweisen. Indem man die Position des Containers dann auf relativ und die linke Ausrichtung auf 50%, wird der Container vorerst genau mit seinem linken Ursprungspunkt bei 50% des übergeordneten Elementes (in diesem Fall das html-Element) gesetzt, das ist genau die Hälfte des zur verfügung stehenden horizontalen Bildschirmplatzes. Jetzt soll der Container aber zentriert dargestellt werden - und dazu muss man ihn noch um die Hälfte seiner Breite (und deswegen muss man die Breite vorher explizit angeben) von seiner momentanen Position nach links verschieben: Man weist ihm einen negativen Wert für die Eigenschaft margin-left zu, genau die Hälfte seiner Breite - und der Container mit jeglichem Inhalt ist exakt zentriert.

#container {
    width: 700px;
    position: relative;
    left: 50%;
    margin-left: -350px; /* this has to be the exact half of the width */
}


Zentrieren mit auto margins
Die zweite Möglichkeit Inhalte im Browserfenster horizontal zu zentrieren ist die Verwendung von auto margins. In der Theorie funktioniert das sehr einfach indem man wieder eine Breite für den Container vergibt und für die Margins in vertikaler Richtung den Wert 0 und in horizontaler Richtung den Wert auf auto setzt (im folgenden Beispiel mit Shorthand-Syntax, man könnte margin-left und margin-right jeweils auch einzeln setzen).

#container {
    width: 700px;
    margin: 0 auto;
}

Leider hat Internet Explorer in Version 5 (und darunter) sowohl im Standard-Mode als auch in späteren Versionen (auch noch in Version 7.0) im Quirks-Mode die Eigenheit, keine auto margins zu kennen und stellt den container-div daher linksbündig dar. Dagegen kann man sich aber folgenden weiteren Bug in Internet Explorer zunutze machen: Statt bei einer Eigenschaft von text-align: center nur den Text mittig auszurichten, zentriert IE stattdessen alle Objekte. Indem man dem body-Objekt per CSS also diese Eigenschaft auf center setzt, zentriert auch der Internet Explorer im Quirks Mode alle Objekte (und damit den container) mittig, allerdings muss man für den Inhalt des containers diese Eigenschaft auf left setzen, sonst wird (weil vererbt) innerhalb des containers ebenfalls alles zentriert.
Für Netscape Navigator 6 und niedriger sollte man noch die Eigenschaft min-width für den body auf einen Wert größergleich der container-Breite setzen, falls das Browserfenster kleiner als die container-Breite wird - ansonsten "rutscht" der Inhalt des containers außerhalb des Browserfensters ohne die Möglichkeit, mittels Scrollleisten zu diesem zu scrollen.

body {
    text-align: center; /* hack for IE 5.x and quirks mode */
    min-width: 720px; /* needed for Netscape <= 6 with tiny screens */
}
#container {
    width: 700px;
    margin: 0 auto;
    text-align: left; /* hack for IE 5.x and quirks mode */
}


Welche dieser beiden Lösungsmöglichkeiten verwendet wird, bleibt dem Webdesigner überlassen - technisch funktioniert beides; negative margins haben den kleinen Vorteil, dass man nur ein einziges Element stylen muss - also auch keinen Browserbug ausnutzen muss - und sind deshalb häufiger zu finden als auto margins.

Beispiel: Zentrieren mit negativen margins
Beispiel: Zentrieren mit auto margins

Mehrspaltige Layouts

Es gibt verschiedene Arten CSS-basierte Layouts zu realisieren; der möglicherweise flexibelste und am einfachsten zu realisierende funktioniert mit der Verwendung von gefloateten div-Elementen, die jeweils die Seitenteile beinhalten. Der Vorteil dieser Technik liegt sowohl im leicht verständlichen Ansatz als auch in der Eigenschaft, aufgrund der hierarchischen Struktur sehr leicht editierbar zu sein. Diese Layouts lassen sich mit wenigen Handgriffen auch sehr gut an Browserfenstergröße oder eingestellte Schriftgröße anpassen, wie man weiter unten sehen wird.

Die folgenden mehrspaltigen Layoutformen basieren bis auf ein paar kleine (weiter unten angemerkte) Details auf der folgenden xhtml-Struktur und beinhalten einen Seitenheader, einen Contentbereich für den eigentlichen Inhalt, einen Navigationsbereich (durch eine Liste realisiert) und einen Seitenfooter.

[...]
<div id="container">
    <div id="header">
    </div>
    <div id="content">
    </div>
    <ul id="navigation">
       <li>...</li>
       <li>...</li>
    </ul>
    <div id="footer">
    </div>
</div>
[...]

Die verlinkten Beispiele wurden zum Teil um CSS-Regeln ergänzt, die nicht unbedingt notwendig sind, aber z.B. die Position und Größe der verschiedenen Objekte besser anschaubar machen indem borders und einige Abstände hinzugefügt wurden.

Zweispaltiges Layout

Der container-div wird - falls gewünscht - mittels einer der beiden oben Techniken mittig zentriert. Natürlich funktioniert das Layout links- wie auch rechtsbündig im Webbrowser ausgerichtet. Die CSS-Regeln werden hierfür nicht noch einmal extra aufgelistet.

Das zweispaltige Layout erreicht man jetzt einfach indem die Navigationsliste nach links und der Contentbereich nach rechts gefloated wird.

#content {
    width: 500px;
    float: right;
}
#navigation {
    width: 180px;
    float: left;
}

Die Breite von Navigation und Content zusammen mit einem eventuell vergebenen padding bzw. margin darf dabei die Breite des übergeordneten Objektes, des container-divs nicht übersteigen, sonst wird dasjenige Element, das in der xhtml-Datei zuerst kommt, in einer Zeile dargestellt und das andere Element darunter. Dieser Effekt kann auch auftreten, wenn die Breiten (inklusive borders, margins und paddings) insgesamt sehr knapp kalkuliert sind. Es gibt zusätzlich noch ein paar Bugs (vor allem im Internet Explorer, z.B. der "3 px Text-Jog"-Bug) die bei sehr knapp bemessenen Abmessungen insgesamt eine größere Breite als die des Containers ergeben - und das Layout würde umbrechen weil es sich in einer einzigen Zeile nicht mehr ausgeht:

wrong floating

Aus diesem Grund sollte man nach Möglichkeit stets einen div nach links und den anderen nach rechts floaten und dazwischen für genug "Sicherheitsabstand" sorgen. Falls die Navigation als Liste realisiert ist (ul, ol) empfiehlt  es sich, das Standard-padding der Liste auf 0 zu setzen, da dieses auch einer zu hohen Gesamtbreite resultieren kann.

floats

Eine Problematik trennt uns jetzt noch vom fertigen Layout: Sobald die beiden Bereiche gefloated werden, werden sie aus dem Dokument-Flow herausgenommen. Der Footer rutscht ganz nach oben (hinter die gefloateten Elemente) unten anschließend an den header.

Zweispaltiges Layout voerst ohne clearing

Um dies zu verhindern muss das vorhergehende floating "gecleared" werden. Damit wird der Footer unterhalb der gefloateten Elemente dargestellt.

#footer {
    clear: both;
}

Mit der Anweisung clear:both werden linke und rechte floats gecleared; man kann bei Gebrauch auch nur einen dieser beiden Floats clearen, indem man clear:left bzw. right anwendet.

Zweispaltiges Layout mit clearing

Grundsätzlich ist das Layout damit schon fertig, man kann jetzt noch mit padding und margin den Inhalt des Contents und der Navigation etwas vom Rand fernhalten - dies ist in den verlinkten Beispieldateien bereits erfolgt.

Möchte man die Anordnung von Navigation (links) und Content (rechts) vertauschen, so braucht man nur die float-Eigenschaft der beiden CSS-Regeln auszutauschen; ggf. müssen auch die margins/paddings etwas angepasst werden - verglichen mit tabellenbasierten Layouts ist dies sehr wenig Aufwand.

Drei- und mehrspaltiges Layout

Das dreispaltige Layout ähnelt dem zweispaltigen sehr stark, nur dass hier ein zusätzlicher div-container eingeführt wird, in den die zweite und dritte Spalte wiederum untergeordnet nach links und nach rechts gefloated wird. Dabei ist allerdings wieder darauf zu achten, dass einerseits die zweite und dritte Spalte gemeinsam inklusive border und margins (und padding des übergeordneten Containers) insgesamt nicht mehr als dessen Breite ergeben - und wie auch beim zweispaltigen Layout dessen Breite plus erster Spalte inkl. borders und margins nicht breiter als die Breite des übergeordneten Elementes. Das klingt jetzt möglicherweise etwas kompliziert, wird aber aus der folgenden Graphik sehr schnell verständlich:

3column float layout


Der dazugehörige html- und CSS-Code würde wie folgt aussehen:

<div id="container">
    <div id="header">
    </div>
    <div id="navigation">
    </div>
    <div id="content">
       <div id="main">
       </div>
        <div id="other">
        </div>
    </div>
    <div id="footer">
    </div>
</div>


#container {
    width: 700px;
    position: relative;
    left: 50%;
    margin-left: -350px;
}
#navigation {
    width: 180px;
    float: left;
}
#content {
    width: 500px;
    float: right;
}
#main {
    width: 300px;
    float: left;
}
#other {
    width: 180px;
    float:right;
}
#footer {
    clear: both;
}

Man kann jetzt beliebig vieler solcher div-Elemente verschachteln, allerdings wird man in der Realität für eine Webseite nie mehr als 4, maximal 5 Spalten brauchen; darunter werden die Spalten so dünn, dass man sie nicht mehr wirklich zur Darstellung von Text oder Bildern verwenden kann.

Beispiel: 3spaltiges Float-Layout

Flüssige 'liquid' Layouts

Liquid Layouts ähneln den fixen vorhergehenden Layouts, passen sich aber der verfügbaren Browserfenstergröße an. Bei sehr breiten Fenstern (= bei hohen Auflösungen) wird das Layout breiter dargestellt als bei niedrigen Auflösungen. Das hat den Vorteil, dass eine Webseite z.B. nicht auf eine Auflösung von 1024 x 768 optimiert wird, sondern auch auf kleinerer bzw. sehr viel größerer Bildschirmfläche gut aussieht und den zur Verfügung stehenden Platz optimal nützt.

Der Trick dahinter ist relativ einfach: anstelle von fixen Breitenangaben für die verschiedenen Spalten werden Prozentwerte verwendet. Diese beziehen sich immer auf die Breite des übergeordneten Objekts, wenn es kein solches gibt, dann auf das html-Element/die Browserfenstergöße. Gibt man dem container-div (der alle Spalten beinhaltet) eine Breite von 85 %, so ist er so breit wie 85 % des Browserfensters. Eine Navigationsspalte mit 25 % hat demnach 25 % von 85 % und hat folglich eine horizontale Ausdehnung von 21,25 % der ganzen Fensterbreite usw.

Die xhtml-Datei muss dazu nicht geändert werden, einzig die Angaben in der CSS-Datei müssen aktualisiert werden. Für zweispaltige Liquid-Layouts würden (Navigation in der linken und Content in der rechten Spalte) die CSS-Angaben wie folgt aussehen (Zentrieren des wrapper-containers wieder weggelassen):

#wrapper {
    width: 80%;
}
#content {
    width: 72%;
    float: right;
}
#nav {
    width: 25%;
    float: left;
}
#footer {
    clear: both;
}

Falls man verhindern will dass das Layout unter einer gewissen Untergrenze skaliert (z.B. um bei extrem kleinen Auflösungen sehr kurze Textzeilen zu verhindern) kann man eine Mindestbreite angeben als auch für extrem hohe Auflösungen eine Maximalbreite definieren. Dies erreicht man mit den folgenden beiden Angaben (von IE 6 und niedriger nicht unterstützt):

#wrapper {
    min-width: 700px;
    max-width: 1200px;
}

Eine Besonderheit ist allerdings zu beachten, wenn man paddings einsetzt: Internet Explorer 5 (und damit auch 6 und 7 im Quirks Mode) berechnen Paddingwerte in Prozent nicht relativ zur Breite des übergeordneten Elementes, sondern zum Objekt selbst. Wenn Sie also Padding in Prozentwerten angeben, kann es auf besagten Browsern/Modi zu unterschiedlichen Darstellungen im Vergleich zu Mozilla oder Opera kommen.

Zweispaltiges Liquid-Layout
Dreispaltiges Liquid-Layout

Elastische Layouts

Elastische Layouts sind von der Struktur her genauso aufgebaut wie die weiter oben erklärten Layouts mit Fixbreite als auch die Liquid Layouts. Allerdings passen sie sich weder an die verfügbare Bildschirmbreite an noch haben sie immer eine genau definierte Breite in Pixeln, sondern skalieren relativ zur im Webbrowser eingestellten Textgröße. Das hat den Vorteil, dass Zeilenumbrüche, Texte, Eingabeelemente als auch Bilder immer proportional zueinander sind, auch wenn jemand die Textgröße seines Webbrowsers - um besser lesen zu können - erhöht oder aus irgendeinem Grund sehr klein eingestellt hat.

Die meisten Webbrowser haben eine default-Schriftgröße von 16 px; d.h. 10 px entspräche 62,5 % dieser 16 px.
Indem man mit folgender CSS-Anweisung die Standardschriftgröße für diese eine Webseite auf 62,5 % setzt, kann man ab sofort alle Breiten- und Höhenangaben in Xem, also in Einheit Schriftgröße machen.

body {
    font-size: 62.5%;
}

Möchte man z.B. den container-div auf 700 Pixel Breite bei Normaltextgröße setzen, gibt man für ihn jetzt keine 700 px an, sondern 70 em ( = 70 x 10 px):

#container {
    width: 70em;
}

Indem man alle weiteren Breitenangaben in Einheiten Schriftgröße konvertiert, bekommt man ein Layout das auf den ersten Blick wie ein Fixbreitenlayout aussieht.

body {
    font-size: 62.5%;
}
#wrapper {
    width: 70em;
}
#content {
    width: 50em;
    float: right;
}
#nav {
    width: 18em;
    float: left;
}
#footer {
    clear: both;
}

Verändert man aber die Textgröße (Internet Explorer: Page > Text Size > ....; Mozilla Firefox: View > Text Size > ... ) so skaliert das ganze Layout proportional mit allen Schriftgrößen und Abmessungen. Wichtig dabei ist zu beachten, dass das Tastaturkürzel Strg++ bzw. Strg+- in Mozilla die Textgröße verändert, in Internet Explorer (7) aber nur den Zoomfaktor für die Ansicht verändert.
textsize in internet explorertextsize in mozilla firefox

Ein Nachteil der elastischen Layouts besteht dann, wenn ein Benutzer die Textgröße seines Browsers auf einen sehr hohen Wert stellt und der container-div sehr viel größer als das Browserfenster wird - dann ist das Layout nicht mehr klar und einfach erfassbar.

Die folgende Gif-Animation zeigt das Mitskalieren eines zweispaltigen Layouts beim schrittweisen Vergrößern der Browserschriftgröße:
resizing window

Die Erweiterung auf drei- und mehrspaltige Layouts funktioniert wieder genauso wie bisher durch das Einfügen eines weiteren div-containers, der untergeordnet die zweite und dritte Spalte beinhaltet.

Zweispaltiges Elastic Layout
Dreispaltiges Elastic Layout

Hybrides Layout

Kombiniert man Elastic Layouts und Liquid Layouts, wird dies "Elastic-Liquid Hybrid" genannt: Dabei skaliert das Layout bis zu einem bestimmten Prozentwert entsprechend der Textgröße, darüber hinaus aber nicht mehr (Angaben für das Hybrid-Layout in Fett):

body {
    text-align: center;
    font-size: 62.5%;
    max-width: 98%;
}
#wrapper {
    width: 70em;
    max-width: 98%;
    margin: 0 auto;
    text-align: left;
}
#content {
    width: 52em;
    max-width: 75%;
    float: right;
}
#main {
    float: left;
    width: 32em;
    max-width: 66%;
}
#other {
    float: right;
    width: 18em;
    max-width: 32%;
}
#nav {
    width: 18em;
    max-width: 23%;
    float: left;
}
#footer {
    clear: both;
}

Diese Layoutart funktioniert nur in Browsern zufriedenstellend, die die CSS-Eigenschaft max-width beherrschen. Dafür wird hier das Layout gewiss nie größer als das verfügbare Browserfenster (IE > 6, Mozilla Firefox, Opera >=6, Netscape >= 6).

Dreispaltiges Hybrid-Layout

Module, die für die Durchführung vorausgesetzt werden