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>

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


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>


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>


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


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


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.


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

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>


¡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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.