CSS: środkowy element w elemencie <div>

178

Aby wyśrodkować element HTML, mogę użyć CSS left: 50%;. Jednak powoduje to wyśrodkowanie elementu względem całego okna.

Mam element, który jest dzieckiem <div>elementu i chcę wyśrodkować dziecko względem tego rodzica <div>, a nie całego okna.

Nie chcę, <div>aby cała zawartość kontenera była wyśrodkowana, tylko jedno konkretne dziecko.

Randomblue
źródło

Odpowiedzi:

264

Ustaw text-align:center;na nadrzędny element DIV i margin:auto;podrzędny element DIV.

#parent {
    text-align:center;
    background-color:blue;
    height:400px;
    width:600px;
}
.block {
    height:100px;
    width:200px;
    text-align:left;
}
.center {
    margin:auto;
    background-color:green;
}
.left {
    margin:auto auto auto 0;
    background-color:red;
}
.right {
    margin:auto 0 auto auto;
    background-color:yellow;
}
<div id="parent">
    <div id="child1" class="block center">
        a block to align center and with text aligned left
    </div>
    <div id="child2" class="block left">
        a block to align left and with text aligned left
    </div>
    <div id="child3" class="block right">
        a block to align right and with text aligned left
    </div>
</div>

To dobre źródło informacji, aby wyśrodkować wszystko.
http://howtocenterincss.com/

pasine
źródło
3
Hum ... Nie chcę, aby cały element DIV nadrzędny miał wyśrodkowany tekst. Chociaż to rozwiązuje problem, tworzy kolejny!
Randomblue
3
możesz ustawić wyrównanie tekstu: do lewej; do elementu podrzędnego, aby tekst był poprawnie wyrównany.
pasine
Wydaje się, text-alignże @pasine nie działa na <i>elemencie. Dając mu klasę…
nclsvh
czy istnieje sposób, aby to wyśrodkować element zarówno w pionie, jak iw poziomie?
Gman Smith
@GmanSmith możesz użyć display: table-celllub flexboxdo tego. Spójrz na link, który dodałem.
pasine
57

W rzeczywistości jest to bardzo proste w przypadku skrzynek elastycznych CSS3 .

.flex-container{
  display: -webkit-box;  /* OLD - iOS 6-, Safari 3.1-6, BB7 */
  display: -ms-flexbox;  /* TWEENER - IE 10 */
  display: -webkit-flex; /* NEW - Safari 6.1+. iOS 7.1+, BB10 */
  display: flex;         /* NEW, Spec - Firefox, Chrome, Opera */
  
  justify-content: center;
  align-items: center;
  
  width: 400px;
  height: 200px;
  background-color: #3498db;
}

.inner-element{
  width: 100px;
  height: 100px;
  background-color: #f1c40f;
}
<div class="flex-container">
  <div class="inner-element"></div>
</div>

AKTUALIZACJA:

Wygląda na to, że nie czytałem edycji OP w czasie, gdy pisałem tę odpowiedź. Powyższy kod wyśrodkuje wszystkie elementy wewnętrzne (bez nakładania się między nimi), ale OP chce, aby wyśrodkowany był tylko określony element , a nie inne elementy wewnętrzne. Zatem druga metoda odpowiedzi @Warface jest bardziej odpowiednia, ale nadal wymaga wyśrodkowania w pionie:

.flex-container{
  position: relative;
  
  /* Other styling stuff */
  width: 400px;
  height: 200px;
  background-color: #3498db;
}

.inner-element{
  position: absolute;
  left: 50%;
  top: 50%;
  
  transform: translate(-50%,-50%);
  /* or 3d alternative if you will add animations (smoother transitions) */
  transform: translate3d(-50%,-50%,0);

  /* Other styling stuff */
  width: 100px;
  height: 100px;
  background-color: #f1c40f;
}
<div class="flex-container">
  <p>Other inner elements like this follows the normal flow.</p>
  <div class="inner-element"></div>
</div>

Gerard Reches
źródło
11

CSS

  body{
    text-align:center;
    }
    .divWrapper{
    width:960px //Change it the to width of the parent you want
    margin: 0 auto;
    text-align:left;
    }

HTML

<div class="divWrapper">Tada!!</div>

Powinno to wyśrodkować div

2016 - metoda HTML5 + CSS3

CSS

div#relative{
  position:relative;
}

div#thisDiv{
  position:absolute;
  left:50%;
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
}

HTML

<div id="relative">
  <div id="thisDiv">Bla bla bla</div>
</div>

Fiddledlidle

https://jsfiddle.net/1z7m83dx/

Warface
źródło
Ale skupia także całe ciało, prawda?
Randomblue
Cóż, to, co będzie w divWrapper, będzie wyśrodkowane, tak, ale możesz umieścić coś poza tym Div i nie będzie to wyśrodkowane, jeśli chcesz.
Warface
Dokładna szerokość (960 pikseli) nie jest odpowiednia dla większości scenariuszy.
QMaster
@QMaster Wiem, że ten post jest stary, powinienem zaktualizować go o moc HTML5
Warface
Tutaj jest dobre wyjaśnienie: w3.org/Style/Examples/007/center.en.html
Purplejacket
5

text-align:center; w nadrzędnym div Powinno załatwić sprawę

Kevin Bowersox
źródło
2
To nie jest tekst , który chciałbym wyrównać, to cały element (np. Przycisk).
Randomblue
1
jeśli jest w div, powinien być wyrównany do środka, może być trochę trudniejszy dla elementów blokowych.
Kevin Bowersox,
4

Aby wyśrodkować tylko określone dziecko:

.parent {
  height: 100px;
  background-color: gray;
  position: relative;
}

.child {
  background-color: white;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  width: 20px;
  height:20px;
  margin: auto;

}
<div class="parent">
   <span class="child">hi</span>
</div>  

LUB, możesz też użyć flex, ale to wyśrodkowałoby wszystkie dzieci

.parent {
  height: 100px;
  background-color: gray;
  display: flex;
  justify-content: center;
  align-items: center;
}

.child {
  background-color: white;  
}
<div class="parent">
   <span class="child">hi</span>
</div>

Ayan
źródło
4

Możesz użyć nazwy klasy flex bootstrap w ten sposób:

<div class="d-flex justify-content-center">
    // the elements you want to center
</div>

To zadziała nawet z wieloma elementami w środku.

Romi Erez
źródło
2

Czy div ma stałą szerokość, czy płynną szerokość? Tak czy inaczej, dla szerokości płynu możesz użyć:

#element { /* this is the child div */
margin-left:auto;
margin-right:auto;
/* Add remaining styling here */
}

Możesz też ustawić nadrzędny element DIV na, text-align:center;a podrzędny element DIV na text-align:left;.

I left:50%;tylko wtedy wyśrodkowuje go względem całej strony, gdy element div jest ustawiony na position:absolute;. Jeśli ustawisz div na left:50%;to, powinno to zrobić w odniesieniu do szerokości nadrzędnego div. W przypadku stałej szerokości wykonaj następujące czynności:

#parent {
width:500px;
}

#child {
left:50%;
margin-left:-100px;
width:200px;
}
Purag
źródło
2

po prostu daj rodzicowi div position: relative

stephenmurdoch
źródło
1

Jeśli chcesz używać CSS3:

position:absolute;
left:calc(50% - PutTheSizeOfTheHalfOfYourElementpx);

Możesz przeprowadzić dalsze wyszukiwania, aby dowiedzieć się, jak uzyskać procent pasujący do szerokości elementu.

user3178128
źródło
0

Przede wszystkim możesz to zrobić z left: 50%, aby wyśrodkować go względem nadrzędnego div, ale do tego musisz nauczyć się pozycjonowania CSS.

Jednym z wielu możliwych rozwiązań jest zrobienie czegoś takiego

    div.parent { text-align:center; }    //will center align every thing in this div as well as in the children element
    div.parent div { text-align:left;}   //to restore so every thing would start from left

jeśli twój element DIV, który ma być wyśrodkowany, jest ustawiony względnie, możesz to zrobić

    .mydiv { position:relative; margin:0 auto; } 
Ehtesham
źródło
Nie chcę, aby cały rodzic div miałtext-align:center;
Randomblue
dlaczego nie chcesz W każdym razie w takim przypadku możesz zastosować drugie podejście.
Ehtesham
0

left: 50% działa resekcyjnie do najbliższego rodzica z przypisaną statyczną szerokością. Spróbuj width: 500px lub coś w nadrzędnym div. Alternatywnie, ustaw zawartość, której potrzebujesz, aby była wyśrodkowana: zablokuj i ustaw lewy i prawy margines na automatyczny.

Bardt
źródło
0

Jeśli element potomny jest wbudowany (np. Nie jest a div, tableitp.), Zawinąłbym go wewnątrz a divlub a pi sprawiłbym, że właściwość CSS wyrównania tekstu opakowania byłaby równa środkowi.

    <div id="container">
        This text is aligned to the left.<br>
        So is this text.<br>
        <div style="text-align: center">
            This <button>button</button> is centered.
        </div>
        This text is still aligned left.
    </div>

W przeciwnym razie, jeśli element jest blokiem ( display: blocknp. A divlub a p) o stałej szerokości, ustawiłbym jego właściwości CSS left i right na auto.

    <div id="container">
        This text is aligned to the left.<br>
        So is this text.<br>
        <div style="margin: 0 auto; width: 200px; background: red; color: white;">
            My parent is centered.
        </div>
        This text is still aligned left.
    </div>

Możesz oczywiście dodać text-align: center do elementu wrapper, aby również wyśrodkować jego zawartość.

Nie będę zawracać sobie głowy pozycjonowaniem, ponieważ IMHO nie jest sposobem na rozwiązanie problemu z PO, ale koniecznie sprawdź ten link , bardzo pomocny.

Spyros
źródło
0

Utwórz nowy element div, aby element był wyśrodkowany, a następnie dodaj klasę specjalnie do wyśrodkowania tego elementu w ten sposób

<div id="myNewElement">
    <div class="centered">
        <input type="button" value="My Centered Button"/>
    </div>
</div>

CSS

.centered{
    text-align:center;
}
Squeeky91
źródło
0

Znalazłem inne rozwiązanie

<style type="text/css">
    .container {
        width:600px; //set how much you want
        overflow: hidden; 
        position: relative;
     }
     .containerSecond{
        position: absolute; 
        top:0px; 
        left:-500%; 
        width:1100%;
     }
     .content{
        width: 800px; //your content size 
        margin:0 auto;
     }           
</style>

iw ciele

<div class="container">
   <div class="containerSecond">
       <div class="content"></div>
   </div>
</div>

Spowoduje to wyśrodkowanie elementu div zawartości, gdy kontener będzie większy lub mniejszy. W tym przypadku zawartość powinna być większa niż 1100% kontenera, aby nie była wyśrodkowana, ale w takim przypadku możesz zrobić z kontenera Drugi większy i zadziała

Ruben
źródło
0

Przypisz text-align: center;do rodzica i display: inline-block;do div.

koulikoff
źródło
0

na przykład mam element div artykułu, który znajduje się wewnątrz elementu div z główną zawartością. Wewnątrz artykułu znajduje się obraz, a pod nim znajduje się przycisk, styl w następujący sposób:

.article {

width: whatever;
text-align: center; 
float: whatever (in case you got more articles in a row); 
margin: give it whatever margin you want;

} .article {

}

/ * w artykule chcę wyśrodkować obraz * /

.article img {

float: none;
margin: 0 auto;
padding: give it a padded ridge if you want;

}

/ * Teraz pod tym obrazem w tym samym elemencie artykułu powinien znajdować się przycisk jak czytaj więcej Oczywiście musisz pracować z em lub%, gdy znajduje się w responsywnym projekcie * /

.button {

background: #whatever color:
padding: 4.3567%; /*Instead of fixed width*/
text-align: cente;
font: whatever;
max-width: 41.4166%;
float: none;
margin: 0 auto; /* You could make the zero into any margin you want on the top and bottom of this button.. Just notice the float: none property.. this wil solve most your issues, also check if maybe position and displaay might mess up your code..*/

}

Powodzenia

Hylke
źródło
0

Jeśli chcesz wyśrodkować elementy wewnątrz div i nie przejmujesz się wielkością podziału, możesz użyć mocy Flex. Wolę używać flexu i nie używam dokładnego rozmiaru elementów.

<div class="outer flex">
    <div class="inner">
        This is the inner Content
    </div>
</div>

Jak widać, Zewnętrzny element div jest kontenerem Flex, a wewnętrzny musi być elementem Flex, który został określony flex: 1 1 auto;za pomocą dla lepszego zrozumienia. Możesz zobaczyć tę prostą próbkę.http://jsfiddle.net/QMaster/hC223/

Mam nadzieję, że to pomoże.

QMaster
źródło
0

mój chciałby magii.

html, body {
 height: 100%;
}

.flex-container{
  display: -ms-flexbox;
  display: -webkit-box;
  display: flex;
  -ms-flex-align: center;
  -ms-flex-pack: center;
  -webkit-box-align: center;
  align-items: center;
  -webkit-box-pack: center;
  justify-content: center;
}


<div class="flex-container">
  <div>Content</div>
</div>
Azizi Musa
źródło
0
<html>
<head>
</head>
<style>
  .out{
    width:200px;
    height:200px;
    background-color:yellow;
  }
   .in{
    width:100px;
    height:100px;
    background-color:green;
    margin-top:50%;
    margin-left:50%;
    transform:translate(-50%,50%);
  }
</style>
  <body>
     <div class="out">
     <div class="in">

     </div>
     </div> 
  </body>
</html>
SooRaj Patil
źródło
Kod jest zawsze dobry, ale pomaga również dodać kilka komentarzy / kontekstów dotyczących tego, jak odnosi się do pierwotnego pytania.
Craigcaulfield