Jak mogę wycentrować poziomo <div>
w innym <div>
za pomocą CSS?
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Jak mogę wycentrować poziomo <div>
w innym <div>
za pomocą CSS?
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Odpowiedzi:
Możesz zastosować ten CSS do wewnętrznej <div>
:
#inner {
width: 50%;
margin: 0 auto;
}
Oczywiście, nie trzeba ustawić width
się 50%
. Działa dowolna szerokość mniejsza niż zawierająca <div>
. To margin: 0 auto
właśnie robi faktyczne centrowanie.
Jeśli korzystasz z przeglądarki Internet Explorer 8 (i nowszych), może być lepsza opcja:
#inner {
display: table;
margin: 0 auto;
}
Sprawi, że wewnętrzny element wyśrodkuje się w poziomie i będzie działać bez ustawiania określonego width
.
Przykład działania tutaj:
#inner {
display: table;
margin: 0 auto;
border: 1px solid black;
}
#outer {
border: 1px solid red;
width:100%
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
margin-left: auto; margin-right: auto
Myślę, że lepiej umieścić .
margin:0 auto
: może być margin: <whatever_vertical_margin_you_need> auto
drugim marginesem poziomym.
Jeśli nie chcesz ustawiać stałej szerokości na wewnętrznej stronie, div
możesz zrobić coś takiego:
#outer {
width: 100%;
text-align: center;
}
#inner {
display: inline-block;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
To czyni wnętrze div
wewnętrznym elementem, który można wyśrodkować text-align
.
float: none;
i prawdopodobnie jest potrzebna tylko dlatego, że #inner odziedziczył float
jeden left
lub jeden right
z innego kodu CSS.
text-align
więc może chcesz ustawić wewnętrzne-tych text-align
do initial
lub inną wartością.
Najlepszym podejściem jest CSS 3 .
#outer {
width: 100%;
/* Firefox */
display: -moz-box;
-moz-box-pack: center;
-moz-box-align: center;
/* Safari and Chrome */
display: -webkit-box;
-webkit-box-pack: center;
-webkit-box-align: center;
/* W3C */
display: box;
box-pack: center;
box-align: center;
}
#inner {
width: 50%;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
W zależności od użyteczności możesz również korzystać z box-orient, box-flex, box-direction
właściwości.
Flex :
#outer {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
I to wyjaśnia, dlaczego model box jest najlepszym rozwiązaniem :
-webkit
flagi dla schematu flexbox ( display: -webkit-flex;
a -webkit-align-items: center;
i -webkit-justify-content: center;
)
Załóżmy, że div ma szerokość 200 pikseli:
.centered {
position: absolute;
left: 50%;
margin-left: -100px;
}
Upewnij się, że element nadrzędny jest ustawiony , tzn. Względny, stały, absolutny lub lepki.
Jeśli nie znasz szerokości div, możesz użyć transform:translateX(-50%);
zamiast ujemnego marginesu.
https://jsfiddle.net/gjvfxxdj/
Dzięki CSS calc () kod może być jeszcze prostszy:
.centered {
width: 200px;
position: absolute;
left: calc(50% - 100px);
}
Zasada jest nadal taka sama; umieść przedmiot na środku i zrekompensuj szerokość.
Stworzyłem ten przykład, aby pokazać, jak pionowo i poziomo align
.
Kod jest w zasadzie taki:
#outer {
position: relative;
}
i...
#inner {
margin: auto;
position: absolute;
left:0;
right: 0;
top: 0;
bottom: 0;
}
I pozostanie center
nawet w przypadku zmiany rozmiaru ekranu.
Niektóre plakaty wspominały o CSS 3 sposób korzystania z centrum display:box
.
Ta składnia jest nieaktualna i nie należy jej już używać. [Zobacz także ten post] .
Tak więc, dla kompletności, oto najnowszy sposób na wyśrodkowanie w CSS 3 za pomocą modułu elastycznego układu pól .
Więc jeśli masz proste znaczniki, takie jak:
<div class="box">
<div class="item1">A</div>
<div class="item2">B</div>
<div class="item3">C</div>
</div>
... a chcesz wyśrodkować swoje elementy w polu, oto czego potrzebujesz na elemencie nadrzędnym (.box):
.box {
display: flex;
flex-wrap: wrap; /* Optional. only if you want the items to wrap */
justify-content: center; /* For horizontal alignment */
align-items: center; /* For vertical alignment */
}
Jeśli potrzebujesz obsługi starszych przeglądarek, które używają starszej składni dla Flexbox, tutaj jest dobre miejsce do wyszukiwania.
flex-direction
wartości. Jeśli jest to „wiersz” (domyślnie) - justify-content: center;
oznacza to wyrównanie w poziomie (jak wspomniałem w odpowiedzi). Jeśli jest to „kolumna” - justify-content: center;
oznacza wyrównanie w pionie.
Jeśli nie chcesz ustawić stałej szerokości i nie chcesz dodatkowego marginesu, dodaj display: inline-block
do swojego elementu.
Możesz użyć:
#element {
display: table;
margin: 0 auto;
}
display: table;
. Co to robi?
Poziomo i pionowo. Działa z rozsądnie nowoczesnymi przeglądarkami (Firefox, Safari / WebKit, Chrome, Internet Explorer 10, Opera itp.)
.content {
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
<div class="content">This works with any content</div>
#outer {
width: 100%;
height: 100%;
display: box;
box-orient: horizontal;
box-pack: center;
box-align: center;
}
Ustaw width
i ustaw margin-left
i margin-right
na auto
. Dotyczy to jednak tylko poziomu . Jeśli chcesz na dwa sposoby, po prostu zrób to na dwa sposoby. Nie bój się eksperymentować; to nie tak, że coś zepsujesz.
Niedawno musiałem wyśrodkować „ukryty” div (tj. display:none;
), Który zawierał formularz, który musiał być wyśrodkowany na stronie. Napisałem następujący kod jQuery, aby wyświetlić ukryty div, a następnie zaktualizuj zawartość CSS do automatycznie wygenerowanej szerokości tabeli i zmień margines, aby go wyśrodkować. (Przełączanie wyświetlania jest uruchamiane przez kliknięcie łącza, ale ten kod nie był konieczny do wyświetlenia).
UWAGA: Udostępniam ten kod, ponieważ Google wprowadził mnie do tego rozwiązania przepełnienia stosu i wszystko działałoby, z wyjątkiem tego, że ukryte elementy nie mają żadnej szerokości i nie można ich zmienić / wyśrodkować, dopóki nie zostaną wyświetlone.
$(function(){
$('#inner').show().width($('#innerTable').width()).css('margin','0 auto');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inner" style="display:none;">
<form action="">
<table id="innerTable">
<tr><td>Name:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="submit"></td></tr>
</table>
</form>
</div>
Zwykle robię to za pomocą pozycji bezwzględnej:
#inner{
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
Zewnętrzny div nie potrzebuje żadnych dodatkowych właściwości, aby to zadziałało.
W przypadku przeglądarki Firefox i Chrome:
<div style="width:100%;">
<div style="width: 50%; margin: 0px auto;">Text</div>
</div>
W przypadku przeglądarki Internet Explorer, Firefox i Chrome:
<div style="width:100%; text-align:center;">
<div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>
Ta text-align:
właściwość jest opcjonalna dla współczesnych przeglądarek, ale jest niezbędna w trybie dziwactwa przeglądarki Internet Explorer do obsługi starszych przeglądarek.
Posługiwać się:
#outerDiv {
width: 500px;
}
#innerDiv {
width: 200px;
margin: 0 auto;
}
<div id="outerDiv">
<div id="innerDiv">Inner Content</div>
</div>
Innym rozwiązaniem tego problemu bez konieczności ustawiania szerokości jednego z elementów jest użycie transform
atrybutu CSS 3 .
#outer {
position: relative;
}
#inner {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
Sztuczka polega na tym, że translateX(-50%)
ustawia #inner
element o 50 procent na lewo od własnej szerokości. Możesz użyć tej samej sztuczki do wyrównania pionowego.
Oto skrzypce pokazujące wyrównanie w poziomie i pionie.
Więcej informacji znajduje się w sieci Mozilla Developer Network .
-webkit-transform: translate(-50%,0); -moz-transform: translate(-50%,0); -ms-transform: translate(-50%,0); -khtml-transform: translate(-50%,0); -o-transform: translate(-50%,0);
Chris Coyier, który napisał na swoim blogu doskonały post na temat „Centrowania w nieznanym”. Jest to zestaw wielu rozwiązań. Opublikowałem taki, który nie został zamieszczony w tym pytaniu. Ma większą obsługę przeglądarki niż rozwiązanie Flexbox i nie używasz tego, display: table;
co mogłoby popsuć inne rzeczy.
/* This parent can be any width and height */
.outer {
text-align: center;
}
/* The ghost, nudged to maintain perfect centering */
.outer:before {
content: '.';
display: inline-block;
height: 100%;
vertical-align: middle;
width: 0;
overflow: hidden;
}
/* The element to be centered, can
also be of any width and height */
.inner {
display: inline-block;
vertical-align: middle;
width: 300px;
}
Ostatnio znalazłem podejście:
#outer {
position: absolute;
left: 50%;
}
#inner {
position: relative;
left: -50%;
}
Oba elementy muszą mieć tę samą szerokość, aby działać poprawnie.
#inner
tylko: #inner { position:relative; left:50%; transform:translateX(-50%); }
. Działa to dla dowolnej szerokości.
Na przykład zobacz ten link i fragment poniżej:
div#outer {
height: 120px;
background-color: red;
}
div#inner {
width: 50%;
height: 100%;
background-color: green;
margin: 0 auto;
text-align: center; /* For text alignment to center horizontally. */
line-height: 120px; /* For text alignment to center vertically. */
}
<div id="outer" style="width:100%;">
<div id="inner">Foo foo</div>
</div>
Jeśli masz dużo dzieci pod rodzicem, treść CSS musi być taka jak w przykładzie na skrzypcach .
Wygląd treści HTML wygląda następująco:
<div id="outer" style="width:100%;">
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> Foo Text </div>
</div>
Następnie zobacz ten przykład na skrzypcach .
Z mojego doświadczenia wynika, że najlepszym sposobem na wyśrodkowanie pudełka w poziomie jest zastosowanie następujących właściwości:
text-align: center;
display: inline-block;
.container {
width: 100%;
height: 120px;
background: #CCC;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="container">
<div class="centered-content">
Center this!
</div>
</div>
Zobacz także to skrzypce !
Z mojego doświadczenia wynika, że najlepszym sposobem na wyśrodkowanie pudełka jest jedno i drugie wynika pionie, i poziomie jest użycie dodatkowego pojemnika i zastosowanie następujących właściwości:
display: table;
display: table-cell;
vertical-align: middle;
text-align: center;
display: inline-block;
.outer-container {
display: table;
width: 100%;
height: 120px;
background: #CCC;
}
.inner-container {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="outer-container">
<div class="inner-container">
<div class="centered-content">
Center this!
</div>
</div>
</div>
Zobacz także to skrzypce !
Najłatwiejszy sposób:
#outer {
width: 100%;
text-align: center;
}
#inner {
margin: auto;
width: 200px;
}
<div id="outer">
<div id="inner">Blabla</div>
</div>
#outer
nie potrzebuje żadnych, width:100%;
jak <div>
zawsze domyślnie width:100%
. i nie text-align:center
jest wcale konieczne.
Jeśli szerokość treści jest nieznana, możesz użyć następującej metody . Załóżmy, że mamy te dwa elementy:
.outer
-- pełna szerokość.inner
- brak ustawionej szerokości (ale można określić maksymalną szerokość)Załóżmy, że obliczona szerokość elementów wynosi odpowiednio 1000 pikseli i 300 pikseli. Postępować w następujący sposób:
.inner
środku.center-helper
.center-helper
blok wbudowany; staje się tego samego rozmiaru co.inner
co szerokość 300 pikseli..center-helper
50% w prawo w stosunku do jego rodzica; to pozostawia lewą stronę na 500 pikseli wrt. zewnętrzny..inner
50% w lewo względem jego rodzica; to umieszcza lewą stronę na -150 pikseli wrt. środkowy pomocnik, co oznacza, że jego lewa strona ma 500 - 150 = 350 pikseli wrt. zewnętrzny..outer
ukryte, aby zapobiec poziomemu paskowi przewijania.Próbny:
body {
font: medium sans-serif;
}
.outer {
overflow: hidden;
background-color: papayawhip;
}
.center-helper {
display: inline-block;
position: relative;
left: 50%;
background-color: burlywood;
}
.inner {
display: inline-block;
position: relative;
left: -50%;
background-color: wheat;
}
<div class="outer">
<div class="center-helper">
<div class="inner">
<h1>A div with no defined width</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Duis condimentum sem non turpis consectetur blandit.<br>
Donec dictum risus id orci ornare tempor.<br>
Proin pharetra augue a lorem elementum molestie.<br>
Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p>
</div>
</div>
</div>
Możesz zrobić coś takiego
#container {
display: table;
width: <width of your container>;
height: <height of your container>;
}
#inner {
width: <width of your center div>;
display: table-cell;
margin: 0 auto;
text-align: center;
vertical-align: middle;
}
Spowoduje to również wyrównanie w #inner
pionie. Jeśli nie chcesz, usuń właściwości display
i vertical-align
;
Oto, co chcesz w najkrótszy sposób.
#outer {
margin - top: 100 px;
height: 500 px; /* you can set whatever you want */
border: 1 px solid# ccc;
}
#inner {
border: 1 px solid# f00;
position: relative;
top: 50 % ;
transform: translateY(-50 % );
}
Stosowanie text-align: center
treści śródliniowej jest wyśrodkowane w polu liniowym. Ponieważ jednak wewnętrzny div ma domyślnie width: 100%
, musisz ustawić określoną szerokość lub użyć jednego z poniższych:
Używanie margin: 0 auto
to kolejna opcja i jest bardziej odpowiednia dla starszych przeglądarek. Działa razem z display: table
.
display: flex
zachowuje się jak element blokowy i określa jego zawartość zgodnie z modelem flexbox. Działa z justify-content: center
.
Uwaga: Flexbox jest kompatybilny z większością przeglądarek, ale nie ze wszystkimi. Zobacz tutaj pełną i aktualną listę kompatybilności przeglądarek.
transform: translate
pozwala modyfikować przestrzeń współrzędnych modelu formatowania wizualnego CSS. Za jego pomocą elementy mogą być tłumaczone, obracane, skalowane i pochylane. Do wyśrodkowania w poziomie wymaga position: absolute
i left: 50%
.
<center>
(Przestarzałe)Tag <center>
jest alternatywą HTML dla text-align: center
. Działa na starszych przeglądarkach i na większości nowych, ale nie jest uważane za dobrą praktykę, ponieważ ta funkcja jest przestarzała i została usunięta ze standardów sieciowych.
Możesz użyć display: flex
dla zewnętrznego div i aby wyśrodkować w poziomie, musisz dodaćjustify-content: center
#outer{
display: flex;
justify-content: center;
}
lub możesz odwiedzić w3schools - CSS Flex Property, aby uzyskać więcej pomysłów.
Flex ma ponad 97% obsługi przeglądarek i może być najlepszym sposobem rozwiązania tego rodzaju problemów w kilku liniach:
#outer {
display: flex;
justify-content: center;
}
Udało mi się znaleźć rozwiązanie, które może pasować do wszystkich sytuacji, ale używa JavaScript:
Oto struktura:
<div class="container">
<div class="content">Your content goes here!</div>
<div class="content">Your content goes here!</div>
<div class="content">Your content goes here!</div>
</div>
A oto fragment kodu JavaScript:
$(document).ready(function() {
$('.container .content').each( function() {
container = $(this).closest('.container');
content = $(this);
containerHeight = container.height();
contentHeight = content.height();
margin = (containerHeight - contentHeight) / 2;
content.css('margin-top', margin);
})
});
Jeśli chcesz używać go w sposób responsywny, możesz dodać następujące elementy:
$(window).resize(function() {
$('.container .content').each( function() {
container = $(this).closest('.container');
content = $(this);
containerHeight = container.height();
contentHeight = content.height();
margin = (containerHeight - contentHeight) / 2;
content.css('margin-top', margin);
})
});
Ta metoda działa również dobrze:
div.container {
display: flex;
justify-content: center; /* For horizontal alignment */
align-items: center; /* For vertical alignment */
}
Jeśli chodzi o wnętrze <div>
, jedynym warunkiem jest to, że jego height
i width
nie może być większy niż te z jego pojemnika.
Istnieje jedna opcja, którą znalazłem:
Wszyscy mówią, aby użyć:
margin: auto 0;
Ale jest inna opcja. Ustaw tę właściwość dla rodzica div. Działa idealnie w każdej chwili:
text-align: center;
I zobacz, dziecko idzie do centrum.
I wreszcie CSS dla Ciebie:
#outer{
text-align: center;
display: block; /* Or inline-block - base on your need */
}
#inner
{
position: relative;
margin: 0 auto; /* It is good to be */
}