En lugar de usar el align-self: center
uso align-items: center
.
No hay necesidad de cambiar flex-direction
o usar text-align
.
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%;
}
La align-self
propiedad se aplica a artículos flexibles . Excepto que su li
no es un elemento flexible porque su padre - el ul
- no tiene display: flex
ni display: inline-flex
aplicado.
Por lo tanto, ul
no es un contenedor flexible, li
no es un elemento flexible y align-self
no tiene ningún efecto.
La align-items
propiedad es similar a align-self
, excepto que se aplica a contenedores flexibles .
Dado que li
es un contenedor flexible, align-items
se puede utilizar 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>
demostración de codepen
Técnicamente, así es como align-items
y cómo align-self
funciona ...
La align-items
propiedad (en el contenedor) establece el valor predeterminado de align-self
(en los elementos). Por lo tanto, align-items: center
significa que todos los elementos flexibles se establecerán en align-self: center
.
Pero puede anular este valor predeterminado ajustando los align-self
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 estar fijado en la parte superior, por lo que está configurado en align-self: flex-start
.
ejemplo
¿Cómo es el texto un elemento flexible?
Algunas personas pueden preguntarse cómo una serie de textos ...
<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 un cuadro en línea. Esto lo convierte en un elemento en línea anónimo y secundario del padre.
De la especificación CSS:
9.2.2.1 Cuadros anónimos en línea
Cualquier texto que esté contenido directamente dentro de un elemento contenedor de bloques debe tratarse como un elemento anónimo en línea.
La especificación flexbox proporciona un comportamiento similar.
4. Artículos flexibles
Cada elemento secundario en flujo de un contenedor flexible se convierte en un elemento flexible, y cada corrida contigua de texto que está contenida directamente dentro de un contenedor flexible se envuelve en un elemento flexible anónimo.
Por lo tanto, el texto en el li
es un elemento flexible.
align-items: baseline
. Bueno para diferentes alturas provenientes de diferentes caracteres Unicode, etc.