Ostatnio rozwijam się we front-endzie, w szczególności kładę nacisk na techniki reponsive web design (choć więcej w tym pojęciu designu niż programowania). Podczas tworzenia CSS natrafiłem na pewną trudność.


TL;DR (streszczenie):

Jak wyśrodkować kontener grida w obszarze wyświetlania tak, żeby przy okazji jego elementy rozciągały się na całą jego szerokość?


Ustaliłem, że w aktualnie tworzonej przykładowej stronie będę używać grida (CSS Grid Layout). Postanowiłem, że kontenerem zrobię element <body>, żeby nie tworzyć bytów ponad potrzebę, to znaczy – zbyt wielu elemetów <div> w sobie (co prawda nie wiem, czy ustawienie akurat elementu <body> jako kontenera grida jest w porządku, ale przyjąłem, że wygląda w miarę sensownie).

I teraz: kiedy szerokość obszaru wyświetlania (tj. viewportu) jest średnia, powiedzmy, do 980px, to strona wygląda w porządku. Jednak potem elementy się tak rozchodzą, że zdecydowałem, że ustawię max-width dla <body> równą te 980px. Ale to powoduje kolejny problem: przy powiększaniu się obszaru wyświetlania cały element <body> zostaje mi po jego lewej stronie, a ja chciałbym, żeby był wyśrodkowany w obszarze wyświetlania. Próbowałem to zrobić przy pomocy właściwości justify-items, ale jeśli ustawię wartość center, to wtedy co prawda <body> zostaje wyśrodkowane, ale tracę domyślną wartość tej właściwości stretch – a przez to dzieci <body> nie mają jednakowej szerokości i wszystko wygląda, jakby wyszło z cyrku.

Moje pytanie: Jak zrobić tak, żeby nie tworzyć kolejnego kontenera w <body> (lub na zewnątrz), nie wykorzystywać też elementu <html> a żeby wyśrodkować treść strony przy obszarze wyświetlania większym niż max-width?

To jest mój kod (to tylko koncepcja, u mnie wygląda to trochę inaczej):
HTML:

<body>
  <div class="pierwszy">
    Pierwszy div
  </div>
  <div class="drugi">
    Drugi div
  </div>
  <div class="trzeci">
    Trzeci div
  </div>
</body>

CSS:

body {
  max-width: 300px;
  display: grid;
  grid-template-rows: auto 100px auto;
  grid-template-columns: auto;
}

.pierwszy {
  background: blue;
  grid-row: 1 / span 1;
  grid-column: 1 / span 1;
}

.drugi {
  background: green;
  grid-row: 2 / span 1;
  grid-column: 1 / span 1;
}

.trzeci {
  background: grey;
  grid-row: 3 / span 1;
  grid-column: 1 / span 1;
}

Gdyby ktoś potrzebował:
https://jsfiddle.net/zmyrhy1k/10/

Zdaję sobie sprawę, że rozwiązanie może być bardzo proste, jak również że nie istnieje (bo np. trzeba utworzyć dodatkowy kontener).