Texto central de CSS (horizontal y verticalmente) dentro de un bloque div


862

Tengo un divconjunto para display:block( 90px heighty width), y tengo algo de texto dentro.

Necesito que el texto esté alineado en el centro tanto vertical como horizontalmente.

Lo intenté text-align:center, pero no funciona en la parte horizontal, así que lo intenté vertical-align:middle, pero no funcionó.

¿Algunas ideas?


25
quieres decir text-align:centerque no hace la "parte vertical"?
nonopolaridad

2
Finalmente encontré una solución que funciona con tamaños relativos y sin alturas fijas: stackoverflow.com/a/16195362/1301331
cirrus

3
Es muy importante saber cómo centrar / intermediar los elementos. El siguiente documento ha dado una imagen muy clara. w3.org/Style/Examples/007/center.en.html
shibualexis

Aquí hay dos métodos simples para centrar objetos dentro de divs, verticalmente, horizontalmente o ambos (CSS puro): stackoverflow.com/a/31977476/3597276
Michael Benjamin

Respuestas:


1385

Si es una línea de texto y / o imagen, entonces es fácil de hacer. Solo usa:

text-align: center;
vertical-align: middle;
line-height: 90px;       /* The same as your div height */

Eso es. Si puede ser varias líneas, entonces es algo más complicado. Pero hay soluciones en http://pmob.co.uk/ . Busque "alineación vertical".

Como tienden a ser hacks o agregar divs complicados ... Usualmente uso una tabla con una sola celda para hacerlo ... para hacerlo lo más simple posible.


Actualización para 2020:

A menos que necesite que funcione en navegadores anteriores como Internet Explorer 10, puede usar flexbox. Es ampliamente compatible con todos los principales navegadores actuales . Básicamente, el contenedor debe especificarse como un contenedor flexible, junto con el centrado a lo largo de su eje principal y transversal:

#container {
  display: flex;
  justify-content: center;
  align-items: center;
}

Para especificar un ancho fijo para el elemento secundario, que se denomina "elemento flexible":

#content {
  flex: 0 0 120px;
}

Ejemplo: http://jsfiddle.net/2woqsef1/1/

Para reducir el contenido, es aún más simple: simplemente elimine el flex: ... línea del elemento flexible y automáticamente se encogerá.

Ejemplo: http://jsfiddle.net/2woqsef1/2/

Los ejemplos anteriores se han probado en los principales navegadores, incluidos MS Edge e Internet Explorer 11.

Una nota técnica si necesita personalizarlo: dentro del elemento flexible, dado que este elemento flexible no es un contenedor flexible en sí mismo, la antigua forma de CSS sin flexbox funciona como se esperaba. Sin embargo, si agrega un elemento flexible adicional al contenedor flexible actual, los dos elementos flexibles se colocarán horizontalmente. Para hacerlos colocados verticalmente, agregue el flex-direction: column;al contenedor flexible. Así es como funciona entre un contenedor flexible y su inmediato elementos secundarios .

Existe un método alternativo para centrar: no especificando centerla distribución en el eje principal y transversal para el contenedor flexible, sino que especifica margin: autoen el elemento flexible para ocupar todo el espacio extra en las cuatro direcciones, y los márgenes distribuidos uniformemente hará que el elemento flexible se centre en todas las direcciones. Esto funciona excepto cuando hay múltiples elementos flexibles. Además, esta técnica funciona en MS Edge pero no en Internet Explorer 11.


Actualización para 2016/2017:

Se puede hacer con más frecuencia transformy funciona bien incluso en navegadores antiguos como Internet Explorer 10 e Internet Explorer 11. Puede admitir múltiples líneas de texto:

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

Ejemplo: https://jsfiddle.net/wb8u02kL/1/

Para encoger el ancho:

La solución anterior utilizó un ancho fijo para el área de contenido. Para usar un ancho retractilado, use

position: relative;
float: left;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

Ejemplo: https://jsfiddle.net/wb8u02kL/2/

Si se necesita el soporte para Internet Explorer 10, entonces flexbox no funcionará y el método anterior y el line-heightmétodo funcionarían. De lo contrario, flexbox haría el trabajo.


58
Ahora hay una display: table-cellpropiedad para eso, para su información. Usarlo hace que el elemento se comporte como una celda de tabla y lo permitevertical-align: middle;
Shauna

1
Si está utilizando font:estos, asegúrese de ponerlo por delante de la line-altura`.
user1135469

44
Esto podría no funcionar según lo previsto cuando el div contiene elementos <br/>.
Martin Meeser

77
¿Qué pasa si mi altura en%?
CandleCoder

1
con este enfoque, el texto del texto debe estar en una línea, de lo contrario, tendrá la segunda línea 90px debajo primero.
Tomasz Mularczyk

454

Técnicas comunes a partir de 2014:


  • Enfoque 1 - transform translateX/ translateY:

    Ejemplo aquí / Ejemplo de pantalla completa

    En los navegadores compatibles (la mayoría de ellos), puede usar top: 50%/ left: 50%en combinación con translateX(-50%) translateY(-50%)para centrar dinámicamente vertical / horizontalmente el elemento.

    .container {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-50%);
    }

  • Enfoque 2 - Método de Flexbox:

    Ejemplo aquí / Ejemplo de pantalla completa

    En los navegadores compatibles , configure el displayelemento de destino flexy utilícelo align-items: centerpara el centrado vertical y el justify-content: centercentrado horizontal. Simplemente no olvide agregar prefijos de proveedor para soporte adicional del navegador ( ver ejemplo ).

    html, body, .container {
        height: 100%;
    }
    .container {
        display: flex;
        align-items: center;
        justify-content: center;
    }

  • Enfoque 3 - table-cell / vertical-align: middle:

    Ejemplo aquí / Ejemplo de pantalla completa

    En algunos casos, deberá asegurarse de que la altura del elemento html/ bodyesté establecida en 100%.

    Para la alineación vertical, establezca width/ heightto del elemento principal 100%y agregue display: table. Luego, para el elemento hijo, cambie el displaya table-celly agreguevertical-align: middle .

    Para el centrado horizontal, puede agregar text-align: centerpara centrar el texto y cualquier otro inlineelemento secundario. Alternativamente, podría usar margin: 0 autoasumiendo que el elemento está blocknivelado.

    html, body {
        height: 100%;
    }
    .parent {
        width: 100%;
        height: 100%;
        display: table;
        text-align: center;
    }
    .parent > .child {
        display: table-cell;
        vertical-align: middle;
    }

  • Enfoque 4 - Absolutamente posicionado 50%desde la parte superior con desplazamiento:

    Ejemplo aquí / Ejemplo de pantalla completa

    Este enfoque asume que el texto tiene una altura conocida - en este caso, 18px. Simplemente coloque el elemento 50%desde arriba, en relación con el elemento padre. Use un margin-topvalor negativo que sea la mitad de la altura conocida del elemento, en este caso - -9px.

    html, body, .container {
        height: 100%;
    }
    .container {
        position: relative;
        text-align: center;
    }
    .container > p {
        position: absolute;
        top: 50%;
        left: 0;
        right: 0;
        margin-top: -9px;
    }

  • Enfoque 5 - El line-height método (menos flexible - no sugerido):

    Ejemplo aquí

    En algunos casos, el elemento padre tendrá una altura fija. Para el centrado vertical, todo lo que tiene que hacer es establecer unline-height valor en el elemento secundario igual a la altura fija del elemento primario.

    Aunque esta solución funcionará en algunos casos, vale la pena señalar que no funcionará cuando haya varias líneas de texto, como esta .

    .parent {
        height: 200px;
        width: 400px;
        text-align: center;
    }
    .parent > .child {
        line-height: 200px;
    }

Los métodos 4 y 5 no son los más confiables. Ve con uno de los primeros 3.


8
+1 para una respuesta integral. Personalmente, prefiero el primer método porque el método 2 tiene menos soporte y me gusta evitar table-celllo más posible.
Harry

44
2. El método Flexbox es el único que funciona si .containers parent es absoluto. 1. el método hace que los padres se reduzcan debido a que .container absoluto y 3. el método simplemente no funcionó mientras que .parent tenía una posición absoluta.
Jānis Gruzis

Flex trabajó para centrar verticalmente el texto de varias líneas en el navegador ipad chrome.
bob

77
El método Flexbox es el mejor del lote.
rorykoehler

Enfoque1 falla para mí cuando el es desplazable.
Vishal Gulati

78

Usando flexbox / CSS:

<div class="box">
    <p>&#x0D05;</p>
</div>

El CSS:

.box{
    display: flex;
    justify-content: center;
    align-items: center;
}

Tomado de Consejo rápido: la forma más sencilla de centrar elementos vertical y horizontalmente


44
Cuidado: no funcionará en IE. Tendrás que agregar display: -ms-flexbox; -ms-flex-align: center; -ms-flex-pack: center.
Florian Wendelborn

agregar text-align:centera inline-los elementos .. tales como texto.

Tenga en cuenta que flexbox ahora tiene soporte al menos parcial en IE 10 y 11, y funciona para el 97% de los usuarios según caniuse . Ya no creo que el soporte del navegador sea un argumento en contra.
Félix Gagnon-Grenier

28

Agregue la línea display: table-cell;a su contenido CSS para ese div.

Solo las celdas de la tabla admiten vertical-align: middle;, pero puede dar esa definición [table-cell] a la div ...

Un ejemplo en vivo está aquí: http://jsfiddle.net/tH2cc/

div{
    height: 90px;
    width: 90px;
    text-align: center;
    border: 1px solid silver;
    display: table-cell; // This says treat this element like a table cell
    vertical-align:middle; // Now we can center vertically like in a TD
}

1
Esto no funciona si positiones absoluto o fijo. Ver: jsfiddle.net/tH2cc/1636
Aaron Mason el

16

Siempre uso el siguiente CSS para un contenedor, para centrar su contenido horizontal y verticalmente.

display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;

-webkit-box-align: center;
-moz-box-align: center;
-ms-flex-align: center;
-webkit-align-items: center;
align-items: center;

-webkit-box-pack: center;
-moz-box-pack: center;
-ms-flex-pack: center;
-webkit-justify-content: center;
justify-content: center;

Véalo en acción aquí: https://jsfiddle.net/yp1gusn7/


3
^ por qué los estándares son importantes
Florian Wendelborn


16

Dele esta clase CSS al <div> objetivo:

.centered {
  width: 150px;
  height: 150px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  background: red; /* Not necessary just to see the result clearly */
}
<div class="centered">This text is centered horizontally and vertically</div>


2
Realmente tienes que hacerlo, y la cuadrícula CSS también :) Recomiendo este plan de estudios .
Aminu Kano

9

Puede usar la flexpropiedad en el elemento primario div y agregar la margin:autopropiedad a los elementos secundarios:

.parent {
    display: flex;
    /* You can change this to `row` if you want the items side by side instead of stacked */
    flex-direction: column;
}

/* Change the `p` tag to what your items child items are */
.parent p {
    margin: auto;
}

Puede ver más opciones flexaquí: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


8

Enfoque 1

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>

Enfoque 2

div {
  height: 200px;
  line-height: 200px;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: inline-block;
  vertical-align: middle;
  line-height: normal;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Haec et tu ita posuisti, et verba vestra sunt. Non enim iam stirpis bonum quaeret, sed animalis. </span>
</div>

Enfoque 3

div {
  display: table;
  height: 100px;
  width: 100%;
  text-align: center;
  border: 2px dashed #f69c55;
}
span {
  display: table-cell;
  vertical-align: middle;
}
<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>


4
<div class="small-container">
    <span>Text centered</span>
</div>

<style>
.small-container {
    width:250px;
    height:250px;
    border:1px green solid;
    text-align:center;
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
.small-container span{
    position: absolute;
    top: 50%;
    left: 50%;
    -moz-transform: translateX(-50%) translateY(-50%);
    -webkit-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
}
</style>

4
# Parent
{
  display:table;
}

# Child
{
  display: table-cell;
  width: 100%; // As large as its parent to center the text horizontally
  text-align: center;
  vertical-align: middle; // Vertically align this element on its parent
}

66
¿Cómo es exactamente esto diferente de las otras respuestas publicadas?
Josh Crozier

3

div {
  height: 90px;
  line-height: 90px;
  text-align: center;
  border: 2px dashed #f69c55;
}
<div>
  Hello, World!!
</div>


3
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
Sudheesh Singanamalla

1

.cell-row {display: table; width: 100%; height: 100px; background-color: lightgrey; text-align: center}
.cell {display: table-cell}
.cell-middle {vertical-align: middle}
<div class="cell-row">
  <div class="cell cell-middle">Center</div>
</div>


1

Esto funciona para mí (probado bien!):

HTML:

<div class="mydiv">
    <p>Item to be centered!</p>
</div>

CSS:

.mydiv {
    height: 100%; /* Or other */
    position: relative;
}

.mydiv p {
    margin: 0;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-right: -50%;
    transform: translate(-50%, -50%); /* To compensate own width and height */
}

Puede elegir otros valores que no sean 50%. Por ejemplo, 25% para centrarse en el 25% de los padres.


1
<!DOCTYPE html>
<html>
  <head>
    <style>
      .maindiv {
        height: 450px;
        background: #f8f8f8;
        display: -webkit-flex;
        align-items: center;
        justify-content: center;
      }
      p {
        font-size: 24px;
      }
    </style>
  </head>

  <body>
    <div class="maindiv">
      <h1>Title</h1>
    </div>
  </body>
</html>

¿Por qué dos respuestas?
Peter Mortensen

1

Puedes probar los siguientes métodos:

  1. Si tiene una sola palabra o una oración de línea, entonces el siguiente código puede hacer el truco.

    Tener un texto dentro de una etiqueta div y darle una identificación. Defina las siguientes propiedades para esa identificación.

    id-name {
      height: 90px;
      line-height: 90px;
      text-align: center;
      border: 2px dashed red;
    }

    Nota: Asegúrese de que la propiedad de altura de línea sea la misma que la altura de la división.

    Imagen

    Pero, si el contenido es más de una sola palabra o una línea, entonces esto no funciona. Además, habrá momentos en los que no podrá especificar el tamaño de una división en px o% (cuando la división es realmente pequeña y desea que el contenido esté exactamente en el medio).

  2. Para resolver este problema, podemos probar la siguiente combinación de propiedades.

    id-name {
      display: flex;
      justify-content: center;
      align-items: center;
      border: 2px dashed red;
    }

    Imagen

    Estas 3 líneas de código establecen el contenido exactamente en el medio de una división (independientemente del tamaño de la pantalla). El "align-items: center" ayuda en el centrado vertical mientras que "justify-content: center" lo hará centrado horizontalmente.

    Nota: Flex no funciona en todos los navegadores. Asegúrese de agregar los prefijos de proveedor adecuados para obtener soporte adicional del navegador.


La opción 2 funcionó bien para mí. ¡Gracias!
anacron


0

Ajuste de altura de línea para obtener la alineación vertical.

line-height: 90px;

3
No va a downvote, ya que puede ser una solución, sin embargo, esto sólo funciona si se puede garantizar de texto de una sola línea ...
dooleyo

0

Esta debería ser la respuesta correcta. Más limpio y simple:

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

0

Aplicar estilo:

position: absolute;
top: 50%;
left: 0;
right: 0;

Su texto estaría centrado independientemente de su longitud.


0

Esto funcionó para mí:

.center-stuff{
    text-align: center;
    vertical-align: middle;
    line-height: 230px; /* This should be the div height */
}

0

Para mí esta fue la mejor solución:

HTML:

 <div id="outer">  
     <img src="logo.png">
 </div>

CSS:

#outer {
  position: fixed;
  top: 50%;
  left: 50%;
  /* bring your own prefixes */
  transform: translate(-50%, -50%);
}

-1
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <div style ="text-align: center;">Center horizontal text</div>
        <div style ="position: absolute; top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);">Center vertical text</div>
    </body>
</html> 

1
Este es un buen código limpio. Sin embargo, puede agregar ID a sus etiquetas div, de modo que pueda usarlas más adelante si es necesario.
Amir Md Amiruzzaman

Gracias por su sugerencia. Sí, acepto que la identificación es útil para manipular.

2
¿Leíste las respuestas anteriores? ¿Puedes decir qué agrega esta respuesta a las anteriores?
Temani Afif

1
@AmirMdAmiruzzaman puede decirnos cuál es la más limpia parte de este código :) ... Veo estilos en línea que no es bueno ... también la adición de ID no es una idea muy buena, necesitamos Clases
Temani Afif

1
Duplicado del enfoque 1 de la respuesta de Josh
Munim Munna

-1

¡Un código realmente simple que funciona para mí! Solo una línea y su texto estará centrado horizontalmente.

.center-horizontally{
  justify-content: center;
}

<Card.Footer className="card-body-padding center-horizontally">
  <label className="support-expand-text-light">Call or email Customer Support to change</label>
</Card.Footer>

El resultado se ve así:

Vote esta respuesta si funciona solo para ahorrar tiempo a los desarrolladores que buscan soluciones fáciles. ¡Gracias! :)


-2

Prueba el siguiente ejemplo. He agregado ejemplos para cada categoría: horizontal y vertical.

<!DOCTYPE html>
<html>
    <head>
        <style>
            #horizontal
            {
                text-align: center;
            }
            #vertical
            {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translateX(-50%) translateY(-50%);
            }
         </style>
    </head>
    <body>
         <div id ="horizontal">Center horizontal text</div>
         <div id ="vertical">Center vertical text</div>
    </body>
</html> 

1
la pregunta es sobre el centrado horizontal y vertical también esta solución ya se proporcionó antes
Temani Afif
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.