chevron-left chevron-right

Piotr Nalepa Frontend, architektura i AI

[CSS] Jak wyśrodkować elementy w pionie i poziomie?

Ta wersja
blog.piotrnalepa.pl/2013/07/07/css-jak-wysrodkowac-elementy-w-pionie-i-poziomie
Opublikowano
Autor
, Staff Software Engineer
Kategoria
CSS
Uwagi
Napisz do mnie · Napisz na X

Ten wpis ma 13 lat. Od tego czasu przeglądarki i narzędzia mogły się zmienić, więc zanim użyjesz kodu, sprawdź go z aktualną dokumentacją.

Często, tworząc strony internetowe, spotykamy się z problemem wyśrodkowania elementów w wybranym kontenerze. O lie wyśrodkowywanie elementów w poziomie jest relatywnie proste, to o tyle wyśrodkowywanie elementów w pionie potrafi przysporzyć sporo problemów.
Zamierzam przedstawić kilka użytecznych sposobów na wyśrodkowywanie elementów za pomocą CSS.

Sekcja 1Wyśrodkowywanie elementów o stałych wymiarach

Znając dokładne wymiary elementu, który zamierzamy wyśrodkować zarówno w pionie jak i w poziomie, bardzo ułatwia nam sprawę. Dzięki tej wiedzy możemy wykorzystać następujące reguły:

Przykład 1CSS
1
2
3
4
5
6
7
8
9
10
11
.container {
  position: relative;
}
.centered-element {
  width: 400px;
  height: 200px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -100px 0 0 -200px;
}

Jak widać, element możemy pozycjonować absolutnie względem rodzica ustawiając jego pozycję początkową na 50% wysokości oraz 50% szerokości rodzica, a następnie dodając ujemne marginesy: lewy i górny, będące połową szerokości i wysokości centrowanego elementu.

Sekcja 2Wyśrodkowywanie elementów o płynnych wymiarach

Kolejny przykład obejmuje centrowanie elementu posiadającego płynne wymiary, określone w procentach. Podanie wymiarów w procentach sprawia, że element określa swoje wymiary względem wymiarów rodzica. Na pewno to nie ułatwia wyśrodkowywania elementu tak bardzo jak w przypadku, gdy znane są stałe wymiary.

Aby okiełznać tak płynnie określany element możemy wykorzystać poniżej przedstawione reguły:

Przykład 2CSS
1
2
3
4
5
6
7
8
9
10
11
12
.container {
  position: relative;
}
.centered-element {
  width: 40%;
  height: 20%;
  position: absolute;
  top: 50%;
  left: 50%;
 
  transform: translate(-50%, -50%);
}

W powyższym kodzie, całą magię wykonuje właściwość transform, którego wartością jest funkcja wyliczająca przemieszczenie elementu względem pozycji początkowej. Jej użyteczność jest bardzo duża.

A jak wygląda wsparcie przeglądarek?
Wygląda całkiem nieźle, ale standardowo dla IE8 i niżej należy zastosować pewne javascriptowe hacki, które pozwolą na korzystanie z dobrodziejstw tej metody. Najlepszym rozwiązaniem będzie wykorzystanie biblioteki Modernizr

Sekcja 3Wyśrodkowywanie elementów o nieznanych wymiarach

Zdecydowanie najmniej przyjemnym przypadkiem, kiedy może zaistnieć potrzeba wyśrodkowania elementów względem rodzica, jest przypadek gdy nie znamy jakie wymiary będzie miał ybrany element, np. z względu na różną ilość tekstu jaka się tam pojawia w różnych sytuacjach.

W takiej sytuacji, nie obejdzie się bez wykorzystania odrobiy kodu HTML, który pozwoli nam na odpowiednią elastyczność w centrowaniu elementów.

Przykład 3HTML
1
2
3
4
5
<div class="container">
  <div class="centering-wrapper">
    <div class="centered-element">...</div>
  </div>
</div>

Do wykrozystania tej techniki potrzebny jest dodatkowy element, w powyższym przypadku: element o klasie centering-wrapper.

Przykład 4CSS
1
2
3
4
5
6
7
8
9
.centering-wrapper {
  display: table;
  width: 100%;
}
.centered-element {
  display: table-cell;
  text-align: center;
  vertical-align: middle;
}

Jak można zauważyć, w kodzie CSS wymuszamy zachowanie się elementu jako tabeli. To może być zaskakujące, ale przynosi oczekiwany skutek poprzez emulowanie zachowania tabeli. W tabelach, można łatwo wyśrodkowywać elementy, a tutaj wykorzystujemy tylko ich zachowanie bez potrzeby używania całej struktury kodu HTML i bez zmieniania semantyki kodu HTML.

Bardzo ważne jest to, aby centrowany element (nie mylić z jego opakowaniem - wrapper) miał wymuszone zachowanie jako komórki w tabeli, czyli dispay: table-cell, dzięki czemu właściwość vertical-align zadziała tak jak tego chcemy. Warto pamiętać, aby element centrowany nie posiadał żadnej właściwości float, bo wtedy zostanie on potraktowany jak element blokowy. Jeśli potrzebujemy mieć element ułożony do lewej czy prawej to warto stworzyć odpowiednią strukturę HTML wewnątrz elementu o klasie .centered-element.

źródło

Udostępnij
Uwagi

O autorze

Staff Software Engineer

Piszę na tym blogu od 2009 roku, a strony i aplikacje webowe tworzę zawodowo od 14 lat. Obecnie w Bishop Fox prowadzę frontend platformy Cosmos, od samego początku projektu. Wcześniej pracowałem m.in. w OLX, KUDO, Auto1 i eZ Systems. Piszę tu o tym, czego nauczyłem się w praktyce: o JavaScripcie, TypeScripcie, Reakcie, CSS-ie i architekturze frontendu. Występowałem też jako prelegent na konferencjach w Polsce i Europie. Masz pytanie albo pomysł na wpis? Daj znać!