O tym co to jest model pudełkowy i jak wyśrodkować element

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

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>

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *