Jak wyśrodkować element na stronie, czyli sposoby na centrowanie w CSS

Jak wyśrodkować element na stronie, czyli sposoby na centrowanie w CSS

W tym wpisie opowiem Ci pewną historię. Historię o dziewczynie imieniem Phoebi. Phoebi była świetną programistką. Pisała czysty, zrozumiały i łatwo rozszerzalny kod. Używała odpowiednich wzorców projektowych i przemyślanej architektury. Była uwielbiana przez wszystkich w zespole. Pewnego dnia dostała zadanie, żeby wyśrodkować element w CSSie i wszystko się dla niej zmieniło🤯

Jak wyśrodkować element na stronie - Phoebi z przyjaciół jest w szoku

Nie jest żadną tajemnicą, że pisanie CSSa potrafi być czasami frustrujące. Coś się nie wyświetla? A może nie wygląda tak, jak powinno? Przywitaj się z CSSem. Frontendowiec i CSS to związek pełen wzlotów i upadków, ale staramy się z tym pogodzić i wycisnąć z tej cytrynki, to co najlepsze. Dlatego w tym wpisie odpowiemy sobie na jedno z najczęstszych pytań każdego frontendowca. Czyli jak wyśrodkować element na stronie i jednocześnie nie osiwieć? 🤔
Family Guy udowadnia, że CSS potrafi być frustrujący

Wstępne informacje

Na początek zobrazujemy sobie nasz problem. Mamy 2 divy – zewnętrzny, który pełni rolę kontenera i wewnętrzny, który chcemy wyśrodkować. Domyślnie wygląda to tak:

 

Domyslne położenie diva na osi X i Y

 

See the Pen
Centering in CSS – default state
by frontowisko (@frontowisko)
on CodePen.

 

Jak wyśrodkować element w pionie i w poziomie?

Mówi się, że najprostsze rozwiązania są najlepsze, więc od nich zacznę. Mamy obecnie do dyspozycji 2 właściwości css – flex i grid, Dzięki nim możemy z łatwością wyśrodkować każdy element. W pionie, w poziomie, a nawet w obu osiach jednocześnie. Na tym ich zalety się nie kończą. Są to całkiem rozbudowane właściwości, ale o tym pogadamy sobie w innym wpisie.

Flexbox – justify-centent, align-items

Jak wyśrodkować element na stronie za pomocą flexboxa? Ustaw dla kontenera, czyli naszego rodzica display: flex, a następnie justify-content: center (poziomie) i align-items: center (pionowo). Dzięki tym trzem linijkom otrzymasz wyśrodkowany w obu osiach element. Yeeey! 🥳

See the Pen
Vertical centering in CSS – flexbox
by frontowisko (@frontowisko)
on CodePen.

Grid – place-content

Wykorzystanie właściwości place-content pozwala na jeszcze łatwiejsze wycentrowanie elementu. Pamiętaj tylko o tym, żeby dodać do rodzica właściwość display: grid.

See the Pen
Horizontal&vertical centering in CSS – grid method
by frontowisko (@frontowisko)
on CodePen.

 

Ale to nie wszystko… czyli starsze metody, aby wyśrodkować element w pionie i w poziomie

Zanim powstał flexbox czy display grid musieliśmy radzić sobie innymi sposobami. Możliwe, że natkniesz się na nie podczas pracy. Nie musisz z nich korzystać, ale warto wiedzieć, że istnieją. Dzięki temu nie będziesz musiała potem rozkminiać co autor miał na myśli. Ewentualnie potraktuj je jako ciekawostkę. 🤓

Position i transform

W pierwszej kolejności musisz zmienić pozycjonowanie rodzica na relative, a dziecka na absolute. Dzięki temu element dziecko nie „odleci” poza swój kontener (o tym dlaczego tak w ogóle mogłoby się stać, przeczytasz w naszym wpisie o pozycjonowaniu). Kolejny krok to „przesunięcie elementu” za pomocą left na osi X (w prawo) i top na osi Y (w dół). Przesunięcie spowoduje, że początek naszego wewnętrznego diva będzie znajdował się na środku rodzica, co możesz zaobserwować na screenie poniżej.

 

Wyśrodkowanie diva za pomocą position

 

Jednak my chcemy, żeby to był środek, a nie początek. Dlatego trzeba dodać jeszcze właściwość transform.

See the Pen
Vertical centering in CSS – position&transform method
by frontowisko (@frontowisko)
on CodePen.

 

Table

CSS pozwala nam sprawić, aby niektóre tagi HTML zachowywały się tak jak elementy tabeli. Wystarczy wykorzystać właściwość display: table-cell, żeby „zamienić naszego rodzica w tabelę”. Samo centrowanie uzyskasz, dzięki text-align: center i vertical-align: middle. Aby zmiany zadziałały, element wewnętrzny musi być wyświetlany jako inline-block.

See the Pen
Horizontal&vertical centering in CSS – table method
by frontowisko (@frontowisko)
on CodePen.

 

Jak wyśrodkować element w poziomie?

 

Flexbox – justify-content

Analogicznie do opisywane wcześniej rozwiązania z fleboxem nadajemy kontenerowi display: flex i nadajemy mu justify-content: center. Dzięki temu zmieniamy położenie tylko w osi X.

See the Pen
Horizontal centering in CSS – flexbox
by frontowisko (@frontowisko)
on CodePen.

 

Grid – justify-content

Podobnie jak w przykładzie z centrowaniem w pionie i w poziomie kontener musi posiadać właściwość display: grid. Potem wystarczy tylko dodać justify-content do wewnętrznego elementu. Dzięki temu uzyskasz wyśrodkowanie w poziomie.

See the Pen
Horizontal centering in CSS – grid method
by frontowisko (@frontowisko)
on CodePen.

 

Position i transform

Wiesz już jak wyśrodkować element w pionie i w poziomie dzięki kombinacji position i transform. Jeśli chcesz centrować w poziomie, przesuń element tylko względem osi X.

See the Pen
Horizontal centering in CSS – position&transform method
by frontowisko (@frontowisko)
on CodePen.

 

Text-center

Trochę inaczej niż w pozostałych przykładach, text-align: center centruje jedynie tekst w elemencie. Sam div dziecko nie zmienia swojego położenia.

See the Pen
Horizontal centering in CSS – text-center method
by frontowisko (@frontowisko)
on CodePen.

 

Margin

Centrować możesz też za pomocą margin: 0 auto. Pamiętaj tylko, że to rozwiązanie zadziała jedynie dla elementów blokowych. Ustawienie auto sprawia, że CSS bierze dostępną w poziomie przestrzeń między rodzicem i dzieckiem, po czym nakłada ją jako margines z obu stron po równo.
*Możesz skorzystać z tej metody dla elementu liniowego (np. zdjęcia) tylko, jeśli nadasz mu w stylach CSS właściwość display: block.

See the Pen
Horizontal centering in CSS – text-center method
by frontowisko (@frontowisko)
on CodePen.

 

Jak wyśrodkować element w pionie?

 

Flexbox – align-items

Pewnie już wiesz, co chce powiedzieć… Tak, nadanie właściwości display: flex i align-items: center do elementu rodzica spowoduje wyrównanie dziecka w pionie. 🙂

See the Pen
Vertical centering in CSS – flexbox
by frontowisko (@frontowisko)
on CodePen.

 

Grid – align-content

Grid podobnie jak flebox posiada właściwość align-items i uwaga niespodzianka – działają one w ten sam sposób! 🙂 Nadanie właściwości align-items: center na kontenerze z ustawionym display: grid daje upragniony rezultat. Div dziecko zostaje wyśrodkowany w pionie.

See the Pen
Vertical centering in CSS – grid method
by frontowisko (@frontowisko)
on CodePen.

 

Position i transform

Analogicznie do środkowania w pionie i w poziomie za pomocą position i transform. Jedyną różnicą jest przesunięcie w jednej osi – Y.

See the Pen
Vertical centering in CSS – position&transform method
by frontowisko (@frontowisko)
on CodePen.

 

Podsumowanie

Jak widać, sposobów na centrowanie jest cała masa i możemy w nich przebierać. Moim najczęstszym wyborem jest flexbox. Wydaje mi się dość intuicyjny i oprócz wyśrodkowania elementów pozwala na wiele innych sztuczek. Podobnie wygląda korzystanie z css grida, dlatego te 2 rozwiązania są w mojej ocenie najlepsze. Ale jak wiadomo – dla każdego coś dobrego, więc warto przetestować je w praktyce i samemu zdecydować. 😎

A Ty, z jakiej metody korzystasz najczęściej? A może jakiegoś rozwiązania brakuje? Jeśli znasz jakiś inny sposób na to jak wyśrodkować element na stronie koniecznie podziel się nim w komentarzu! 🙂

0 Komentarzy