chevron-left chevron-right

Piotr Nalepa Frontend, architecture and AI

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

This version
blog.piotrnalepa.pl/2013/07/07/css-jak-wysrodkowac-elementy-w-pionie-i-poziomie
Published
Author
, Staff Software Engineer
Category
CSS
Feedback
Write to me · Post on X

This post is 13 years old. Browsers and tools may have changed since then, so check the code against current documentation before you use it.

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.

Section 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:

Example 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.

Section 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:

Example 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

Section 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.

Example 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.

Example 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

Share
Feedback

About the author

Staff Software Engineer

I've been writing this blog since 2009 and building for the web professionally for 14 years. Today I lead the frontend of the Cosmos platform at Bishop Fox, where I've been since day one of the project. Before that I worked at OLX, KUDO, Auto1 and eZ Systems. Here I write about what I've learned in practice: JavaScript, TypeScript, React, CSS and frontend architecture. I've also spoken at conferences across Poland and Europe. Got a question or an idea for a post? Let me know!