Prosta sztuczka, ale zarazem genialna. Dawno nie robiliśmy CSSa, najwyższa pora do niego wrócić. Do dzieła.

Ok, tworzymy taki HTML:

<body>
    <div class="grid-container">
        blabla
    </div>
</body>

Pamiętamy, że domyślnie to div rozlewa się na całą szerokość strony, choć aby to zauważyć, potrzebujemy:

  • Jakąś treść (inaczej będzie mieć 0 wysokości), względnie ustawione na sztywno height
  • Background color (względnie możemy w devtoolsach podglądać)

Ok, zróbmy sobie reset stylów:

*, *::before, *::after {
    box-sizing: border-box;
  }

body {
    margin: 0;
    padding: 0;
  }

Od teraz tak będziemy resetować, po pierwsze uwzględniając pseudoelementy before i after, po drugie w wildcardzie trzymamy box sizing oraz czcionki, margin, padding i background trzymamy w body.

Zmienne CSS jakby były potrzebne – idą do root. Ok, to teraz zobaczmy, czy rzeczywiście ten block element jakim jest div rozleje się nam na całą szerokość:

.grid-container {
    background-color: tomato;
}

Rozlał. Ok, teraz na całą wysokość go bierzemy:

.grid-container {
    background-color: tomato;
    min-height: 100vh;
}

Ok, zróbmy display grid:

.grid-container {
    background-color: tomato;
    min-height: 100vh;
    display: grid;
}

Teraz pozmieniajmy mu tam coś:

<div class="grid-container">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>
    </div>

Dajmy im jakieś kolory:

.box1 {
    background-color: aqua;
}

.box2 {
    background-color: goldenrod;
}

.box3 {
    background-color: aliceblue;
}

Ok, nadajmy kolumny i wiersze:

.grid-container {
    background-color: tomato;
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 100px);
}

Teraz mamy mega rzecz. Ten cały grid jest stackowany w lewym górnym rogu (pozycja 0,0 dla top left) a z kolei tło rozlewa się na cały ekran. Div jest rozlany na cały ekran, zaś grid ma swoje wymiary.

I co może nam się wydawać nie do ogarnięcia, to to, że możemy w takiej sytuacji pomóc sobie tym, co użylibyśmy w flexboxie! Czyli justify-content:

.grid-container {
    background-color: tomato;
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 100px);
    justify-content: center;
}

Już siedzą w środku na linii lewo-prawo. Grid kontenery nie mają flex-direction więc dla nich jest to działanie jak dla flexboxa z row. Po prostu main axis przebiega od lewej do prawej.

W grid nie używamy flex-start ani flex-end, tylko start, end, center. Możemy nimi poruszać naszymi itemami w gridzie. Mało tego, mamy do dyspozycji align-content:

.grid-container {
    background-color: tomato;
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 100px);
    justify-content: center;
    align-content: center;
}

Teraz cały nasz grid siedzi w środku ekranu. Align content to jest ta własność, którą w flexbox manipulowaliśmy jak nam się wrapowało do kilku rzędów. Tutaj sterujemy rzędami w tym momencie.

Bo mamy sytuację taką – każdy rząd ma wysokość 100px tutaj, ale sam grid container ma wysokość 100vh. Mamy sporo tej wolnej przestrzeni, pytanie co z nią zrobić?

Domyślnie to grid został ustawiony w pozycji 0,0 i tyle. Justify content przesunęło nam wszystko na środek, tam się te 4 kolumny po 100px znajdują. Ok, zostają jeszcze rzędy. Nie cross axis, nie align items, tego tu nie ma. Rzędy.

Zróbmy tak to najlepiej zrozumiemy:

.grid-container {
    background-color: tomato;
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 100px);
    justify-content: center;
    align-content: space-between;
}

Swoją drogą zobaczmy, że wymiary diva to jest rozlanie wysokości i szerokości na cały ekran, ale nie pokrywa się to z wymiarami grida. On ma swoje a tymi tutaj właściwościami pomagamy sobie.

Wracamy na center, oto cały nasz patent:

*, *::before, *::after {
    box-sizing: border-box;
  }

body {
    margin: 0;
    padding: 0;
    background-color: tomato;
  }

.grid-container {
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 100px);
    justify-content: center;
    align-content: center;
    row-gap: 10px;
}

Background color do body, row gap dodałem jakby ktoś chciał odległości to ma. Zdejmijmy sobie justify content i align content, a nasz grid będzie w pozycji 0,0, zaś div będzie zajmował cały ekran, kolor z body to będzie tło ekranu.

Warto też zwrócić uwagę, że justify content będziemy potrzebować wtedy, gdy na osi lewo-prawo mamy jakąś wolną przestrzeń. Teraz nie będzie potrzebne:

.grid-container {
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 500px);
    grid-template-rows: repeat(4, 100px);
    /* justify-content: center; */
    align-content: center;
}

Nie ma co centrować, wręcz poza ekran nam się wylało. Podobnie teraz:

.grid-container {
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: repeat(4, 100px);
    /* justify-content: center; */
    align-content: center;
}

Teraz każda kolumna ma szerokość 1/4 ekranu, bo grid container zabiera cały width. A jak damy 1fr dla rzędów, do align content nie będzie miało żadnego wpływu:

.grid-container {
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 1fr);
    justify-content: center;
    /* align-content: center; */
}

Ale grid wycentrowany góra-dół nie będzie. Będzie przyklejony do góry. Aby grid był wycentrowany musimy mieć kolumny z wartością absolutną z wolnym miejscem plus align content center:

.grid-container {
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 100px);
    justify-content: center;
    align-content: center;
}

Dopiero teraz to wszystko w środku leży.

Oczywiście jak damy za dużą wartość to ten align content też nie będzie do niczego potrzebny:

.grid-container {
    min-height: 100vh;
    display: grid;
    grid-template-columns: repeat(4, 200px);
    grid-template-rows: repeat(4, 1000px);
    justify-content: center;
    /* align-content: center; */
}