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ć
| Metoda | Wyśrodkowuje | Dziecko potrzebuje stałego rozmiaru? | Najlepsza do |
|---|---|---|---|
Grid place-items: center | Obie osie | Nie | Wybór domyślny: jedno dziecko w pudełku |
Flexbox justify-content + align-items | Obie osie | Nie | Rząd albo kolumna elementów wyśrodkowanych jako grupa |
margin: auto w rodzicu flex albo grid | Obie osie | Nie | Wyśrodkowanie jednego elementu, gdy rodzeństwo jest ułożone inaczej |
margin: 0 auto | Tylko w poziomie | width albo max-width | Kontenery strony, artykuły, formularze w zwykłym przepływie |
Absolute + translate(-50%, -50%) | Obie osie | Nie | Nakładki, znaczki i okna modalne nad inną treścią |
Absolute + inset: 0; margin: auto | Obie osie | Tak, szerokość i wysokość | Okna dialogowe o stałym rozmiarze |
align-content: center na bloku | W pionie | Nie | Wyś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 autona bloku o pełnej szerokości. Najpierw nadaj muwidthalbomax-width.margin: autodo 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: centerna dziecku. Właściwości wyrównania ustawia się na rodzicu (kontenerze flex albo grid), z wyjątkiemmargin: autoialign-self.text-align: centerdo 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.