Menu

Jak wyśrodkować div w CSS: wszystkie metody z pomiarem

Wszystkie sposoby na wyśrodkowanie diva w poziomie, w pionie albo w obu kierunkach: flexbox, grid, margin auto, pozycja absolutna z transform, inset z margin auto i align-content. Każdy działa na żywo i mierzy własne wyśrodkowanie, a tabela podpowiada, kiedy którego użyć.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Krótka odpowiedź

Żeby wyśrodkować div w poziomie i w pionie wewnątrz rodzica, zamień rodzica w siatkę i wyśrodkuj jej zawartość:

.parent {
  display: grid;
  place-items: center;
  min-height: 200px; /* the parent needs room to center in */
}

To działa dla dziecka dowolnego rozmiaru i nie wymaga niczego na samym dziecku. Poniżej sześć metod obok siebie. Każde pudełko mierzy się po wyrenderowaniu i pokazuje, jak daleko jego środek jest od środka rodzica:

Wszystkie sześć pokazuje 0px w obu osiach (obramowanie sceny 1px jest równe z każdej strony, więc nie przesuwa środka). Zmień szerokość albo tekst pudełka i uruchom ponownie: metody, które nie zależą od stałego rozmiaru, zostają na 0.

Której metody użyć

MetodaWyśrodkowujeDziecko potrzebuje stałego rozmiaru?Najlepsza do
Grid place-items: centerObie osieNieWybór domyślny: jedno dziecko w pudełku
Flexbox justify-content + align-itemsObie osieNieRząd albo kolumna elementów wyśrodkowanych jako grupa
margin: auto w rodzicu flex albo gridObie osieNieWyśrodkowanie jednego elementu, gdy rodzeństwo jest ułożone inaczej
margin: 0 autoTylko w poziomiewidth albo max-widthKontenery strony, artykuły, formularze w zwykłym przepływie
Absolute + translate(-50%, -50%)Obie osieNieNakładki, znaczki i okna modalne nad inną treścią
Absolute + inset: 0; margin: autoObie osieTak, szerokość i wysokośćOkna dialogowe o stałym rozmiarze
align-content: center na blokuW pionieNieWyśrodkowanie w pionie bez zmiany display rodzica

Metoda 1: flexbox

Flexbox wyśrodkowuje w dwóch osiach za pomocą dwóch właściwości. justify-content obsługuje oś główną (w rzędzie poziomą), a align-items oś poprzeczną:

Przy kilku dzieciach flexbox wyśrodkowuje je jako grupę i trzyma je w rzędzie. Tu wygrywa z gridem, który ustawiłby trzy elementy jeden pod drugim w wyśrodkowanej kolumnie. Wszystkie wartości wyrównania omawia strona o justify-content.

Metoda 2: grid

place-items: center to skrót od align-items: center razem z justify-items: center. W kontenerze grid z jednym dzieckiem wyśrodkowuje je w obu kierunkach:

min-height zamiast height pozwala rodzicowi urosnąć, jeśli karta stanie się wyższa niż 180px, zamiast pozwolić karcie wystawać.

Metoda 3: margin: 0 auto (w poziomie)

Element blokowy o szerokości mniejszej niż kontener można wyśrodkować w poziomie automatycznymi marginesami bocznymi. Przeglądarka dzieli wolne miejsce po równo między obie strony:

Drugie pudełko wypełnia całą szerokość, więc nie ma wolnego miejsca i nic się nie przesuwa. To zwykły powód, dla którego margin: 0 auto "nie działa". Wyśrodkowuje też tylko w poziomie w zwykłym przepływie; pionowe marginesy auto stają się tam 0. Jednak w rodzicu flex albo grid margin: auto wyśrodkowuje w obu kierunkach, co pokazuje trzecie pudełko w porównaniu powyżej.

Metoda 4: pozycja absolutna i transform

Gdy element musi leżeć nad inną treścią (znaczek na zdjęciu, okno modalne nad stroną), ustaw go absolutnie na 50% i cofnij o połowę jego własnego rozmiaru:

top: 50%; left: 50% stawia lewy górny róg elementu w środku. Procenty w translate() odnoszą się do własnego rozmiaru elementu, więc -50% cofa go o połowę jego szerokości i wysokości, jakiekolwiek by one były. Rodzic musi być pozycjonowany (position: relative), bo inaczej element wyśrodkuje się na stronie. Pozycjonowanie omawia strona o position.

Wariant dla elementów o znanym rozmiarze: position: absolute; inset: 0; margin: auto; razem z width i height. Automatyczne marginesy dzielą miejsce ze wszystkich czterech stron.

Metoda 5: align-content na zwykłym bloku

align-content: center działa teraz także na zwykłych kontenerach blokowych, nie tylko flex i grid. Wyśrodkowuje zawartość w pionie bez zmiany sposobu układania dzieci:

.parent {
  min-height: 200px;
  align-content: center;   /* vertical centering, still display: block */
}
.child {
  max-width: 300px;
  margin-inline: auto;     /* horizontal centering */
}

Obsługują to obecne wersje Chrome, Firefoksa i Safari. Starsze przeglądarki to ignorują, więc jeśli musisz je wspierać, użyj grida.

Wyśrodkowanie na całym ekranie

Żeby wyśrodkować okno dialogowe w obszarze widoku bez względu na przewijanie, połącz stałą warstwę na cały ekran z gridem:

.overlay {
  position: fixed;
  inset: 0;                     /* covers the viewport */
  display: grid;
  place-items: center;
  background: rgb(0 0 0 / 50%);
}

Do wyśrodkowania w pionie zawartości całej strony użyj na rodzicu min-height: 100dvh zamiast 100vh: na telefonach 100vh obejmuje obszar za paskami narzędzi przeglądarki, więc "środek" wypada za nisko.

Wyśrodkowanie tekstu to inne zadanie

Wszystko powyżej wyśrodkowuje pudełko. Żeby wyśrodkować tekst w pudełku, użyj na nim text-align: center, jak pokazuje strona o wyśrodkowaniu tekstu w HTML. Często potrzebujesz obu: grida do wyśrodkowania karty i text-align do wyśrodkowania linii w niej.

Częste błędy

  • Rodzic bez wysokości. Wyśrodkowanie w pionie wymaga wolnego miejsca; rodzic, który kurczy się do zawartości, go nie ma.
  • margin: 0 auto na bloku o pełnej szerokości. Najpierw nadaj mu width albo max-width.
  • margin: auto do wyśrodkowania w pionie w zwykłym przepływie. Pionowe marginesy auto wynoszą tam 0; użyj flex albo grid.
  • Wyśrodkowanie absolutne bez pozycjonowanego rodzica. Element wyśrodkowuje się na stronie, a nie w pudełku.
  • align-items: center na dziecku. Właściwości wyrównania ustawia się na rodzicu (kontenerze flex albo grid), z wyjątkiem margin: auto i align-self.
  • text-align: center do wyśrodkowania bloku. Wyśrodkowuje treść liniową (tekst, obrazy, dzieci inline-block), a nie dziecko blokowe.

Najczęściej zadawane pytania

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

Zamień rodzica w siatkę i wyśrodkuj jej zawartość: .parent { display: grid; place-items: center; }. Wersja z flexboxem to display: flex; justify-content: center; align-items: center;. W obu przypadkach rodzic musi być wyższy niż div.

Jak wyśrodkować div tylko w poziomie?

Nadaj mu szerokość i automatyczne marginesy boczne: .box { width: 300px; margin: 0 auto; } (albo max-width dla responsywnego bloku). margin-inline: auto to to samo we właściwościach logicznych.

Dlaczego margin: 0 auto nie wyśrodkowuje mojego diva?

Div nie ma szerokości mniejszej niż kontener, więc nie ma wolnego miejsca do podziału (blok domyślnie wypełnia całą szerokość). Ustaw width albo max-width. Nie działa to też na elementach liniowych i nigdy nie wyśrodkowuje w pionie w zwykłym przepływie.

Dlaczego mój div nie wyśrodkowuje się w pionie?

Rodzic jest tylko tak wysoki jak jego zawartość, więc nie ma dodatkowego miejsca do wyśrodkowania. Nadaj rodzicowi wysokość (albo min-height), a potem użyj wyśrodkowania przez grid albo flexbox.

Jaki jest najprostszy sposób na wyśrodkowanie diva?

display: grid; place-items: center; na rodzicu: dwie deklaracje, obie osie, dziecko dowolnego rozmiaru. Użyj flexboxa, gdy rodzic układa w rzędzie także inne elementy.

Jak wyśrodkować tekst w divie?

Użyj text-align: center na divie dla tekstu i treści liniowej. Wyśrodkowanie samego diva i wyśrodkowanie tekstu w nim to dwa osobne zadania.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ