
Są takie zagadnienia CSS, z którymi większość z front-end developerów prędzej czy później będzie musiała sobie poradzić. Mowa tu o np. wyśrodkowywaniu elementów na stronie. Do tego zadania doskonale nadaje się moduł Flexbox czy frameworki typu Bootstrap, jednak w dzisiejszym wpisie pochylam się nad rozwiązaniami, które nie wymagają ich użycia. Na początku jednak chciałbym zwrócić uwagę na jeden z najważniejszych konceptów w CSS, czyli na model pudełkowy i jego konsekwencje.
Spis treści
- Model pudełkowy
- Wyśrodkowanie elementu w poziomie
- Element blokowy
- Element liniowy
- Wyśrodkowanie elementu w pionie
- Element blokowy
- Element liniowy
- Wyśrodkowanie elementu w pionie i poziomie
- Element blokowy i liniowy
Model pudełkowy
Model pudełkowy to schemat, wg którego określane są wielkości części składowych elementu. Elementy prezentowane na stronie nie funkcjonują w próżni i każdy z nich generuje prostokątne pole – pudełko (box). Pudełko składa się z zawartości elementu (content), marginesu wewnętrznego, tj. paddingu, obramowania, czyli borderu oraz marginesu zewnętrznego zwanego margin. Każdy z elementów pudełka jest właściwością elementu, której można nadać pożądaną wartość.

Domyślnie model pudełkowy działa w taki sposób, że jeżeli dla pola o zadeklarowanej przez nas wysokości i szerokości 100px dodamy border
o szerokości 5px, to cały kwadrat będzie miał 110px wzdłuż i wszerz.
<style> .my-box { width: 100px; background-color: red; height: 100px; border: 5px solid black;
} .centered-item { margin: 0 auto; width: 150px; } </style> (...) <div class="my-box"></div>

Podobnie ustawienie padding
wpłynie na wymiary elementu, natomiast ustawienie margin
nie daje takiego efektu.
Opisane zachowanie jest konsekwencją właściwości CSS box-sizing
, która domyślnie przyjmuje wartość content-box
. Aby zmienić to zachowanie tak, żeby szerokość i wysokość elementów zawierały wartości paddingów i borderów należy ustawić właściwość box-sizing
na border-box
.
<style> .my-box { width: 100px; background-color: red; height: 100px; border: 5px solid black;
box-sizing: border-box;
padding: 10px; } .centered-item { margin: 0 auto; width: 150px; } </style> (...) <div class="my-box"></div>

Warto zwrócić uwagę, że narzędzia deweloperskie (uruchamiane klawiszem F12 w przeglądarce Chrome) w sekcji Elements pozwalają dokładnie sprawdzić jakie wymiary mają poszczególne składowe każdego pudelka,

Wyśrodkowanie elementu w poziomie
Element blokowy
Najprostszym sposobem na wyśrodkowanie elementu blokowego w poziomie jest ustawienie wartości jego prawego i lewego marginesu na wartość automatyczną, czyli auto
. Należy jednak pamiętać, że domyślna szerokość elementu blokowego to 100% elementu rodzica, a w takim układzie nie ma miejsca na marginesy. Należy zatem zmniejszyć szerokość elementu, który chce się wyśrodkować. Poniższy kod
<style> .yellow-container { background-color: yellow; width: 400px;
height: 50px; } .centered-item { margin: 0 auto; width: 150px; } </style> (...) <div class="yellow-container"> <p class="centered-item">Jestem wyśrodkowany</p> </div>
w przeglądarce wygeneruje poniższy efekt:

Element liniowy
Sposób zaprezentowany powyżej, tj. ustawienie marginesów, nie zadziała dla elementów liniowych. Dla osiągnięcia efektu wyśrodkowania elementu liniowego można posłużyć się właściwością text-align
ustawioną na wartość center
dla elemencie-rodzica.
<style> .green-container { background-color: green; width: 400px;
height: 50px;
text-align: center; } </style> (...) <div class="green-container"> <span>Jestem wyśrodkowany</span> </div>

Wyśrodkowanie elementu w pionie
Element blokowy
Wyśrodkowanie elementu w pionie wymaga nieco większych kombinacji. Efekt można uzyskać za pomocą deklaracji position: absolute
zastosowanej dla wyśrodkowywanego elementu. Takie ustawienie pozwala na pozycjonowanie elementu za pomocą właściwości top
, bottom
, left
oraz right
.
Należy pamiętać, że pozycjonowanie elementu-dziecka w taki sposób nie zadziała jeżeli element-rodzic ma właściwość position
ustawioną na static
. Tutaj uwaga: static
jest wartością domyślną właściwości position
, co oznacza, że nie trzeba jej deklarować wprost.
Poniższy kod
<style> .yellow-container { background-color: yellow; width: 400px;
height: 200px;
position: relative; } .centered-item { position: absolute; top: 50%;
transform: translateY(-50%);
background-color: blueviolet; height: 50px; width: 100%; } </style> (...) <div class="yellow-container"> <div class="centered-item"></div> </div>
pozwoli zobaczyć poniższy efekt:

W powyższym przykładzie zastosowałam pusty element <div>
, któremu nadałam wysokość i szerokość, aby bardziej uwydatnić pewne zjawisko zachodzące w omawianym przypadku. Wyśrodkowywany element jest z powodu deklaracji top: 50%
przenoszony do połowy elementu-rodzica. To oznacza, że górna krawędź elementu-dziecka znajdzie się dokładnie w połowie elementu-rodzica. Z tego powodu w kodzie dodana jest deklaracja transform: translateY(-50%)
, która przenosi element-dziecko o 50% do góry (znak -) w osi Y. Bez ustawienia właściwości transform
powyższy przykład prezentowałby się następująco:

Element liniowy
W przypadku środkowania w pionie dobra wiadomość jest taka, że sposób opisany dla elementu blokowego działa również dla elementu liniowego. Tak więc poniższy kod
<style> .green-container { background-color: green; width: 400px;
height: 50px;
position: relative; } .centered-item { position: absolute; top: 50%;
transform: translateY(-50%); } </style> (...) <div class="green-container"> <span class="centered-item">Jestem wyśrodkowany</span> </div>
wygeneruje poniższy widok:

Wyśrodkowanie elementu w pionie i poziomie
Element blokowy i liniowy
Najprościej osiągnąć ten efekt stosując rozwiązanie zaproponowane dla wyśrodkowania w poziomie, podając wartość właściwości left
i modyfikując nieco właściwość translate
:
<style>
.yellow-container {
background-color: yellow;
width: 400px;
height: 200px;
position: relative;
}
.centered-item {
position: absolute;
background-color: blueviolet;
height: 100px;
width: 200px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
</style>
(...)
<div class="yellow-container">
<div class="centered-item"></div>
</div>
