allineamento verticale al centro in <div>


126

Voglio mantenere l'altezza di #abc divat 50pxe il testo per allinearlo verticalmente al centro del div.

body{
  padding: 0;
  margin: 0;
  margin: 0px auto;
}

#main{
  position: relative;
  background-color:blue;
  width:500px;
  height:500px;
}

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  vertical-align:middle;
}
<div id="main">
 <div id="abc">
     asdfasdfafasdfasdf
 </div>
</div>

Risposte:


183

Puoi usare line-height: 50px;, non avrai bisogno di vertical-align: middle;lì.

dimostrazione


Quanto sopra fallirà se hai più righe, quindi in questo caso puoi avvolgere il testo usando spane poi usare display: table-cell;e display: table;insieme a vertical-align: middle;, non dimenticare di usare width: 100%;per#abc

dimostrazione

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  display: table;
  width: 100%;
}

#abc span {
  vertical-align:middle;
  display: table-cell;
}

Un'altra soluzione a cui posso pensare qui è usare la transformproprietà con translateY()dove Yovviamente sta per asse Y. È abbastanza semplice ... Tutto quello che devi fare è impostare la posizione degli elementi su absolutee la posizione successiva 50%da tope traslare dal suo asse con negativo-50%

div {
  height: 100px;
  width: 100px;
  background-color: tomato;
  position: relative;
}

p {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

dimostrazione

Tieni presente che questo non sarà supportato sui browser meno recenti, ad esempio IE8, ma puoi creare IE9 e altre versioni precedenti del browser di Chrome e Firefox utilizzando rispettivamente i prefissi -ms, -moze -webkit.

Per maggiori informazioni in merito transform, puoi fare riferimento qui .


Avevo bisogno di conoscere questa semplice soluzione per l'altezza della linea per tutta la mia vita professionale e l'ho appresa solo ora. Grazie, signor Alien.
Nathan Beach

94

È semplice: dai al div genitore questo:

display: table;

e dai al bambino div / s questo:

display: table-cell;
vertical-align: middle;

Questo è tutto!

.parent{
    display: table;
}
.child{
    display: table-cell;
    vertical-align: middle;
    padding-left: 20px;
}
<div class="parent">
    <div class="child">
        Test
    </div>
    <div class="child">
        Test Test Test <br/> Test Test Test
    </div>
    <div class="child">
        Test Test Test <br/> Test Test Test <br/> Test Test Test
    </div>
<div>


6
questo non va bene in quanto utilizza la tabella come hack, potrebbe funzionare per la maggior parte dei casi, ma quando vuoi cambiare la larghezza della 'tabella', allora non funzionerà correttamente (cosa che sto riscontrando ora con questa soluzione )
Kevin Simple

Non ho bisogno di aggiungere il display:table;al genitore per farlo funzionare.
VincentPerrin.com

Forse questo è un trucco ... ma FUNZIONA, e la maggior parte delle altre soluzioni funzionano solo in casi specifici e spesso non sono utilizzabili nel nostro caso.
Jerry

Vantaggio di questa soluzione: funziona con tutti i tipi di contenuti (non solo per il testo, e non solo una singola riga ...)
Jerry

77

Vecchia domanda ma oggigiorno CSS3 rende l'allineamento verticale davvero semplice !

Basta aggiungere al #abcseguente css:

display:flex;
align-items:center;

Demo semplice

Domanda demo originale aggiornata

Semplice esempio:

.vertical-align-content {
  background-color:#f18c16;
  height:150px;
  display:flex;
  align-items:center;
  /* Uncomment next line to get horizontal align also */
  /* justify-content:center; */
}
<div class="vertical-align-content">
  Hodor!
</div>


3
Suggerirei anche: display: grid; allineamento-articoli: center; Funziona meglio quando hai più di un oggetto da allineare verticalmente insieme
Leonardo Daga

Quali browser supportano CSS3 ?
Kiquenet

@Kiquenet, 92% del mercato globale caniuse.com/#search=align-items
Daniel Kucal

Perfekt! Semplice e facile .. basta aggiungere al contenitore
Ujjwal Singh

47

Ho trovato questa soluzione di Sebastian Ekström. È veloce, sporco e funziona davvero bene. Anche se non conosci l'altezza del genitore:

.element {
  position: relative;
  top: 50%;
  -webkit-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  transform: translateY(-50%);
}

Leggi l'articolo completo qui .


3
Ciò potrebbe sfocare le cose perché il risultato delle trasformazioni può portare a posizionare le cose in posizioni di mezzo pixel.
Kevin Wheeler

1
C'è un aggiornamento sul post rivolto a quel problema. Sul genitore transform-style: preserve-3d;:!
Andry

8

Puoi usare Line height grande quanto l'altezza del div. Ma per me la soluzione migliore è questa ->position:relative; top:50%; transform:translate(0,50%);


4

Che ne dici di aggiungere line-height?

#abc{
  font:Verdana, Geneva, sans-serif;
  font-size:18px;
  text-align:left;
  background-color:#0F0;
  height:50px;
  vertical-align:middle;
  line-height: 45px;
}

Fiddle, line-height

O paddingsu #abc. Questo è il risultato con l'imbottitura

Aggiornare

Aggiungi nel tuo css:

#abc img{
   vertical-align: middle;
}

Il risultato . Spero che questo sia quello che stai cercando.


non funziona nel modo in cui voglio che funzioni, quando cambi l'altezza o l'altezza della linea, qualcosa non va. ho già ricevuto una risposta, grazie comunque
Sickest

2

Prova questo:

.main_div{
    display: table;
    width: 100%;
}
.cells {
    display: table-cell;
    vertical-align: middle;
}

Un altro metodo per centrare un div:

<div id="parent">
    <div id="child">Content here</div>
</div>

#parent {position: relative;}

#child {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    width: 50px;
    height: 100px;
    margin: auto;
}

2

 div {
    height:200px;
    text-align: center;
    padding: 2px;
    border: 1px solid #000;
    background-color: green;
}

.text-align-center {
    display: flex;
    align-items: center;
    justify-content: center;
}
<div class="text-align-center"> Align center</div>


Spiegalo per favore!
Szabolcs Páll

1

Usa la proprietà translateY CSS per centrare verticalmente il testo nel suo contenitore

<style>
.centertext{

    position: relative;
    top: 50%;
    transform: translateY(40%);

}
</style>

E poi applicalo al tuo DIV contenente

  <div class="centertext">
        <font style="color:white; font-size:20px;">   Your Text Here </font>
  </div>

Regola la percentuale di traduzione in base alle tue esigenze. Spero che questo ti aiuti


1

Questo codice è per l'allineamento verticale centrale e orizzontale senza specificare l'altezza fissa:

.parent-class-name {
  position: relative;
}

.className {
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  margin: 0 auto;
  transform: translateY(-50%);
  -moz-transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.