alinear verticalmente en medio en <div>

126

Quiero mantener la altura de #abc divat 50pxy text para alinear verticalmente en el medio de 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>

Más enfermo
fuente

Respuestas:

183

Puedes usar line-height: 50px;, no necesitarás vertical-align: middle;allí.

Manifestación


Lo anterior fallará si tiene varias líneas, por lo que en ese caso puede ajustar su texto usando spany luego usar display: table-cell;y, display: table;junto con vertical-align: middle;, no olvide usar width: 100%;para#abc

Manifestación

#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;
}

Otra solución en la que puedo pensar aquí es usar la transformpropiedad con translateY()donde Yobviamente significa Y Eje. Es bastante sencillo ... Todo lo que necesita hacer es establecer la posición de los elementos absolutey luego la posición 50%desde el topeje y traducirlo desde su eje con negativo-50%

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

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

Manifestación

Tenga en cuenta que esto no será compatible con los navegadores más antiguos, por ejemplo, IE8, pero puede hacer IE9 y otras versiones más antiguas de Chrome y Firefox usando los prefijos -ms, -mozy -webkitrespectivamente.

Para obtener más información sobre transform, puede consultar aquí .

Señor extranjero
fuente
He necesitado conocer esta solución simple de altura de línea durante toda mi vida profesional y solo supe de ella ahora. Gracias señor Alien.
Nathan Beach
94

Es simple: dale al padre esto:

display: table;

y déle al niño div (s) esto:

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

¡Eso es!

.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>

Burak Çanga
fuente
66
Esto es malo, ya que está usando la tabla como un truco, puede funcionar para la mayoría de los casos, pero cuando desea cambiar el ancho de la 'tabla', entonces no funcionará correctamente (que ahora tengo el problema con esta solución )
Kevin Simple
No necesitaba agregar el display:table;al padre para que funcione.
VincentPerrin.com
Quizás esto sea un truco ... pero FUNCIONA, y la mayoría de las otras soluciones funcionan solo en casos específicos y a menudo no son utilizables en nuestro caso.
Jerry
Ventaja de esta solución: funciona con todo tipo de contenido (no solo para texto y no solo una sola línea ...)
Jerry
77

Antigua pregunta, pero hoy en día CSS3 hace que la alineación vertical sea realmente simple .

Simplemente agregue al #abcsiguiente CSS:

display:flex;
align-items:center;

Demo simple

Pregunta de demostración original actualizada

Ejemplo simple:

.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>

Jaqen H'ghar
fuente
3
Sugeriría también: display: grid; alinear elementos: centro; Funciona mejor cuando tienes más de un objeto para alinear verticalmente juntos
Leonardo Daga
¿Qué navegadores son compatibles CSS3 ?
Kiquenet
@Kiquenet, 92% del mercado global caniuse.com/#search=align-items
Daniel Kucal
Perfekt! Simple y fácil ... solo agregue al contenedor
Ujjwal Singh
47

Encontré esta solución por Sebastian Ekström. Es rápido, sucio y funciona muy bien. Incluso si no conoce la altura de los padres:

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

Lee el artículo completo aquí .

Scott
fuente
3
Esto podría desenfocar las cosas porque el resultado de las transformaciones puede llevar a que las cosas se coloquen en ubicaciones de medio píxel.
Kevin Wheeler
1
Hay una actualización en la publicación dirigida a ese problema. En padre transform-style: preserve-3d;:!
Andry
8

Puede usar la altura de línea tan grande como la altura del div. Pero para mí la mejor solución es esta ->position:relative; top:50%; transform:translate(0,50%);

Andris
fuente
4

¿Qué hay de agregar 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;
}

Violín, altura de línea

O paddingen #abc. Este es el resultado con relleno

Actualizar

Agregue en su css:

#abc img{
   vertical-align: middle;
}

El resultado . Espero que esto sea lo que buscas.

Aldi Unanto
fuente
no funciona como quiero que funcione, cuando cambias la altura o la altura de la línea, algo no está bien. ya recibí una respuesta, gracias de todos modos
Enfermo
2

Prueba esto:

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

Otro método para centrar 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;
}
Amigo
fuente
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>

Fouzia Khan
fuente
¡Explícalo por favor!
Szabolcs Páll
1

Use la propiedad CSS translateY para centrar verticalmente su texto en su contenedor

<style>
.centertext{

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

}
</style>

Y luego aplíquelo a su DIV que contiene

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

Ajuste el porcentaje de traducción para satisfacer sus necesidades. Espero que esto ayude

Hondaman900
fuente
1

Este código es para alineación vertical central y horizontal central sin especificar altura fija:

.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%);
}

nilesh pawar
fuente