¿Cómo alinear verticalmente el texto dentro de un flexbox?
Me gustaría usar flex box para alinear verticalmente algún contenido dentro de un <li>
pero no teniendo gran éxito.
He comprobado en línea y muchos de los tutoriales en realidad utilizan un div envoltura que obtiene el align-items:center
de la configuración de flex en el padre, pero me pregunto si es posible cortar este elemento adicional?
He optado por usar flex box en esta instancia, ya que la altura del elemento de la lista será un %dinámico.
* {
padding: 0;
margin: 0;
}
html, body {
height: 100%;
}
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
align-self: center;
background: silver;
width: 100%;
height: 20%;
}
<ul>
<li>This is the text</li>
</ul>
5 answers
Editar: Por favor use La respuesta de Michael_B en lugar de la mía. Borraría esta respuesta si pudiera, pero las respuestas aceptadas no se pueden eliminar.
Si haces el flex-direction
vertical (usando column
) entonces justify-content: center
se centra verticalmente. Entonces puede usar text-align: center
para centrar horizontalmente también.
li {
display: flex;
justify-content: center;
flex-direction: column;
text-align: center;
}
Aquí está en acción: http://codepen.io/anon/pen/Fkhgo
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 16:49:51
En Lugar de utilizar align-self: center
uso align-items: center
.
No hay necesidad de cambiar flex-direction
o usar text-align
(como se sugiere en otra respuesta).
Aquí está su código, con un ajuste, para que todo funcione:
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
/* align-self: center; <---- REMOVE */
align-items: center; /* <---- NEW */
background: silver;
width: 100%;
height: 20%;
}
El align-self
la propiedad se aplica a elementos flexibles . Excepto que su li
no es un elemento flexible porque su padre – el ul
– no tiene display: flex
o display: inline-flex
aplicado.
Por lo tanto, el ul
no es un flex contenedor, el li
no es un elemento flexible, y align-self
no tiene ningún efecto.
El align-items
la propiedad es similar a align-self
, excepto que se aplica a flex containers.
Dado que el li
es un contenedor flexible, align-items
se puede usar para centrar verticalmente los elementos secundarios.
* {
padding: 0;
margin: 0;
}
html, body {
height: 100%;
}
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
/* align-self: center; */
align-items: center;
background: silver;
width: 100%;
height: 20%;
}
<ul>
<li>This is the text</li>
</ul>
Técnicamente, así es como align-items
y align-self
funcionan...
La propiedad align-items
(en el contenedor) establece el valor predeterminado de align-self
(en los elementos). Por lo tanto, align-items: center
significa que todos los elementos flex se establecerán en align-self: center
.
Pero puede anular este valor predeterminado ajustando el align-self
en elementos individuales.
Por ejemplo, es posible que desee columnas de igual altura, por lo que el contenedor se establece en align-items: stretch
. Sin embargo, un elemento debe ser fijado a la parte superior, por lo que se establece en align-self: flex-start
.
Cómo es el texto un flex ¿artículo?
Algunas personas pueden preguntarse cómo una racha de texto...
<li>This is the text</li>
Es un elemento hijo de li
.
La razón es que el texto que no está envuelto explícitamente por un elemento de nivel en línea está envuelto algorítmicamente por una caja en línea. Esto lo convierte en un elemento inline anónimo e hijo del padre.
De la especificación CSS:
9.2.2.1 Anónimo en línea recuadros
Cualquier texto que está contenido directamente dentro de un elemento contenedor de bloque debe tratarse como un elemento inline anónimo.
La especificación flexbox proporciona un comportamiento similar.
4. Artículos Flexibles
Cada hijo en flujo de un contenedor flex se convierte en un elemento flex, y cada ejecución contigua de texto que está contenido directamente dentro de un flex el contenedor está envuelto en un elemento flexible anónimo.
Por lo tanto, el texto en el li
es un artículo flexible.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 11:35:46
Para futuros Googlers,
La respuesta más votada y la segunda más votada también, son para resolver este problema específico publicado por OP, donde el contenido(texto) estaba siendo "aliado algorítmico" envuelto dentro del elemento de bloque en línea. PERO, su caso puede ser sobre centrando un elemento normal verticalmente dentro de un contenedor, que también se aplica en mi caso, por lo que todo lo que necesita es
align-self: center;
Simplemente poniendo esto aquí, ya que este es el mejor resultado para el mencionado consulta y también estaba bastante confundido durante bastante tiempo * Derp *
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-21 18:42:27
* {
padding: 0;
margin: 0;
}
html, body {
height: 100%;
}
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
align-items:center;
background: silver;
width: 100%;
height: 20%;
}
<ul>
<li>This is the text</li>
</ul>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-14 09:27:49
Puede cambiar las pantallas ul
y li
a table
y table-cell
. Entonces, vertical-align
trabajaría para ti:
ul {
height: 20%;
width: 100%;
display: table;
}
li {
display: table-cell;
text-align: center;
vertical-align: middle;
background: silver;
width: 100%;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-14 15:21:55