CSS Grid

10. August 2017, von Lukas
CSS Grid

 
Es gibt verschiedene Möglichkeiten Layouts mit CSS umzusetzen. In den Urzeiten nutzte man häufig Tabellen, dann lange Zeit Floats. Mit Flexbox oder Column-Layouts sind zwei recht neue Konzepte dazugekommen – und jetzt steht Grid in den Startlöchern. Was das genau ist und wofür man es verwenden kann, das sehen wir uns jetzt mal genauer an.

Was ist Grid?

Laut W3C definiert Grid “a two-dimensional grid-based layout system, optimized for user interface design”. Da sind wir auch gleich beim entscheidenden Unterschied zwischen Grid und Flexbox: Flexbox ist eigentlich darauf ausgelegt, Elemente innerhalb einer Zeile oder einer Spalte zu positionieren, nicht beides. Für Spalten und Reihen ist Grid der Spezialist. Grid ist also ein zweidimensionales Layoutsystem, das speziell für User-Interface Designs (also bspw. Webapps oder Single-Page-Applications) viele Vorteile bringt. Mit Grid können Layoutbereiche recht einfach definiert werden, denen dann Inhalte zugeordnet werden können. Damit trennt es das Design/Layout logisch vom Aufbau des HTML-Dokuments, anders als es bei Floats oder Flexbox der Fall ist – der Aufbau im HTML-Dokument soll aber bitte trotzdem semantisch sinnvoll aufgebaut sein, da man sonst die Accessibility gefährdet.

Die Basics – Wie funktionierts?

Ich werde hier nur kurz die Grundlagen zeigen, unten gibt’s aber weiterführende Links, falls man tiefer eintauchen möchte 😉 Die Funktionsweise erinnert etwas an Flexbox – die Grundeinstellungen des Gridlayouts werden in einem Eltern-Element / Wrapper definiert, Feinjustierungen dann in den zu positionierenden Kind-Elementen.

Es gibt verschiedene Arten, wie man ein Grid aufsetzen kann. Sehen wir uns die Möglichkeiten anhand eines recht einfachen Layouts an: Ein Header, der die gesamte Breite einnimmt, darunter links der Content-Bereich, rechts daneben zwei Sidebars (untereinander) und ganz unten – wieder in voller Breite – der Footer.

Das gewünschte Layout

Das gewünschte Layout für unseren CSS Grid-Test


Grundsätzlich werden definierte Grid-Elemente der Reihe nach befüllt, das heißt, das erste Kind-Element des Grid-Wrappers füllt das erste Grid-Element, das zweite Kind-Element das zweite Grid-Element, bis die erste Reihe vollständig befüllt ist. Dann die zweite Reihe usw.
Da Grid ein zweidimensionales System ist, das mithilfe von Reihen und Spalten definiert wird, müssen wir zuerst eruieren, wie viele Reihen/Zeilen und wie viele Spalten es gibt.

In unserem Fall haben wir es mit 4 Zeilen zu tun:

  • 1. Zeile: Header
  • 2. Zeile: Content und Sidebar-1
  • 3. Zeile: Content und Sidebar-2
  • 4. Zeile: Footer

Da der Content-Bereich ⅔ der Breite einnehmen soll, benötigen wir 3 Spalten für unser Layout:

  • 1. und 2. Spalte: Header, Content und Footer
  • 3. Spalte: Header, Sidebar-1, Sidebar-2 und Footer

Dass sich der Content über zwei Zeilen erstreckt und Header/Footer die gesamte Breite benötigen, stört uns nicht – das regeln wir schon noch.

Die visuelle Definition

Für den Einstieg recht praktisch ist die visuelle Definition: Man definiert das Grid mit den Namen der einzelnen Bereiche, der Aufbau erinnert an eine 2-dimensionale Matrix, oder eine recht einfache Darstellung einer Tabelle. Dies wird der Eigenschaft  grid-template-areas zugwiesen. Ebenfalls muss natürlich display:grid gesetzt sein.

display:grid;
grid-template-areas:
”header   header   header
 content  content  sidebar-1
 content  content  sidebar-2
 footer   footer   footer”;

Nun ist das Grid grundsätzlich definiert und die HTML-Container können diesen Bereichen zugewiesen werden:

zb:

#header{grid-area: header;}
#content{grid-area: content;}
...

Und schon ist das Layout fertig.

Zu beachten ist hier, dass die natürliche Reihenfolge nicht eingehalten werden muss. Der Header könnte das letzte Wrapper-Kind sein und würde trotzdem richtig angezeigt werden. Das kann aber Folgen für die Accessibility haben.


Hier sind wir aber noch recht eingeschränkt. Wenn eine Spalte ⅔ der Breite haben soll, müssen wir ihr 2 Spalten zuordnen. Das ist etwas redundant. Deshalb sehen wir uns die deklarative Definition an, die uns mehr Möglichkeiten bietet.

Die deklarative Definition

Die deklarative Definition kann als Erweiterung zur visuellen Definition verwendet werden, um exakt die Breiten und Höhen der Reihen und Spalten zu definieren. Sie kann aber auch ohne visuelle Definition verwendet werden. Man vergibt direkt bei der Definition die gewünschten Höhen und Breiten, wir benötigen deshalb nicht zwei Spalten, um den Content-Bereich auf ⅔ der Gesamtbreite auszudehnen. Bei dieser Methode brauchen wir also nur insgesamt 2 Spalten. Die Zeilen werden so definiert:

grid-template-rows:

    auto /* so hoch, wie der Inhalt es braucht*/
    1fr  /* 1 Fraction: vorhandener Platz wird aufgeteilt*/
    1fr  /* diese Zeile wird also auf den vorhandenen Platz */
         /* gleich viel Platz einnehmen, wie die Zeile darüber */
    auto;

Die Spalten so:

grid-template-columns:

    2fr  /* 2 Teile für diese Spalte */
    1fr; /* 1 Teile für diese Spalte */
         /* ⇒ wir erhalten eine ⅔- zu ⅓- Teilung des vorhandenen Platzes*/

Das Ergebnis ist recht vergleichbar mit dem der vorherigen Methode:


Wie gesagt, die beiden Definitionen erweitern sich gegenseitig; Hier gibt es unser Beispiel mit Area-Namen und deklarativ beschriebenen Grid-Elementen:

Weiteres

Das ist für ein paar Zeilen CSS schon recht imposant, es gibt natürlich noch viel mehr Möglichkeiten. Positionierung über Grid-Linien (inkl. Namen), Überlappungen von Elementen, Sortierung, Subgrids und vieles mehr…

Eine besondere Stärke spielen Grid-Layouts bei Responsive-Layouts aus: Es ist wirklich einfach und kompakt, das gesamte Grid mithilfe von Media-Queries, je nach Bildschirmgröße, zu verändern.

Ihr habt jetzt Blut geleckt? Hier gibt’s gute weiterführende Infos:

https://css-tricks.com/things-ive-learned-css-grid-layout/
https://blog.kulturbanause.de/2013/12/css-grid-layout-module/#chapter10
https://css-tricks.com/snippets/css/complete-guide-grid/
https://gridbyexample.com/patterns/header-twocol-footer/
und natürlich hier: https://www.w3.org/TR/css-grid-1/
 

Lukas Kindermann

Meine Rolle bei Liechtenecker: Omnom-Fanboy Wenn es weder IT noch Digitalisierung gäbe, wäre mein Beruf: Handwerker Mein Herz schlägt für: Sachen machen und Erdäpfel essen
Keine Kommentare vorhanden.
Kommentar verfassen
Name
Mail
Web
Captcha
Erfolgreich!
Fehler!
Meetup #10
Inspiration – Blogbeitrag

Meetup #10 – eine Chronologie

4. Dezember 2019, von Lukas

Letzte Woche fand unser inzwischen zehntes Meetup statt. Hier gibt es nun eine kleine Zusammenfassung für all diejenigen, die nicht dabei sein konnten.

Jetzt lesen
Liechtenecker Leseliste mit Günter Lischka
Arbeitskultur – Podcasts

Folge #56 mit Günter Lischka

20. Dezember 2019

In Folge 56 erlaubt Günter Lischka, verantwortlich für das Privatkundengeschäft beim Telekomanbieter Drei Österreich, Einblicke in die Einführung eines neuen Managementstils anhand von OKRs (Objectives and Key Results). Das Prinzip der OKRs [...]

Jetzt anhören
Close