padding bei table-header-group und table-footer-group

Mit display: table und Konsorten kann man bei bis zu vier Elementen die Reihenfolge der Darstellung auf dem Bildschirm beeinflussen.
Nehmen wir einmal folgende Situation: Wir haben vier Elemente, die bei großen Bildschirmen nebeneinander dargestellt werden sollen und bei kleinen Bildschirmen untereinander.

Anordnung große Screens
Anordnung kleiner Screen

Das Besondere dabei: Die Reihenfolge auf kleinen Screens soll anders sein als die Reihenfolge auf dem großen Screen (Eins, Zwei, Drei, Vier auf großen Screens, Vier, Drei, Zwei, Eins auf kleinen Screens).

Wie an verschiedenen Stellen (hier und hier) gezeigt, lässt sich das über display mit besonderen Werte realisieren:

  • Das Element, das zuoberst stehen soll, erhält display: table-caption;
  • Das Element, das an zweiter Stelle stehen soll, bekommt ein display: table-header-group;
  • Das Element, das zuunterst steht, erhält display: table-footer-group;
  • Damit ist das letzte Element, das nicht eigens platziert wird, an dritter Stelle.

Im Beispiel habe ich ein umfassendes Element mit vier Absätzen:

<div>
<p>Eins</p>
<p>Zwei</p>
<p>Drei</p>
<p>Vier</p>
</div>

Im CSS-Code stehen zuerst die Angaben für große Bildschirme – die Tabellendarstellung wird aktiviert und die einzelnen Absätze zu Tabellenzellen gemacht:

.container {
display: table;
width: 100%;
}
.container p {
display: table-cell;
}

Für kleine Bildschirme wird dann über die oben beschriebenen Angaben die Reihenfolge verändert:

@media screen and (max-width: 28em) {
p:nth-child(4) {
display: table-caption;
width: 100%;
}
p:nth-child(1) {
display: table-footer-group;
}
p:nth-child(3) {
display: table-header-group;
}
}

Als ich damit rumspielte, stieß ich auf folgendes Phänomen: Ich hatte für alle Elemente ein padding definiert, das sich jedoch bei display: table-header-group und display: table-footer-group nicht auswirkte.

problem_padding

Das ist allerdings kein Bug, sondern ein Feature. In der CSS 2.1-Spezifikation heißt es deutlich: Man kann padding auf alle Elemente anwenden bis auf table-row-group, table-header-group, table-footer-group, table-row, table-column-group und table-column (http://www.w3.org/TR/CSS2/box.html#padding-properties).

Die Lösung ist einfach: Benötigt man im Beispiellayout padding, so kann man dies an ein Kindelement zuweisen. Im Beispiel ist einfach ein span-Element innerhalb des p-Elemente ergänzt, und dieses erhält die folgenden Angaben:

p span {
display: block;
padding: 2em;
}

Das Beispiel gibt es online zum Ausprobieren bei: http://jsfiddle.net/fmaurice/uhW3S/

Vielleicht auch interessant: Man kann transform nutzen, um die Reihenfolge von Elementen umzukehren.

Kommentare? Gerne :-)

HTML: Folgender HTML-Code kann verwendet werden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>