Au lieu d'utiliser align-self: center
use align-items: center
.
Il n'est pas nécessaire de modifier flex-direction
ou d'utiliser text-align
.
Voici votre code, avec un ajustement, pour que tout fonctionne:
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
propriété s'applique aux éléments flexibles . Sauf que votre li
n'est pas un élément flexible parce que son parent - le ul
- n'a pas display: flex
ou n'a pas display: inline-flex
appliqué.
Par conséquent, ul
n'est pas un conteneur flexible, li
n'est pas un élément flexible et align-self
n'a aucun effet.
La align-items
propriété est similaire à align-self
, sauf qu'elle s'applique aux conteneurs flexibles .
Étant donné que le li
est un conteneur flexible, align-items
peut être utilisé pour centrer verticalement les éléments enfants.
* {
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>
démo codepen
Techniquement, voici comment align-items
et align-self
travailler ...
La align-items
propriété (sur le conteneur) définit la valeur par défaut de align-self
(sur les éléments). Par conséquent, align-items: center
signifie que tous les éléments flexibles seront définis sur align-self: center
.
Mais vous pouvez remplacer cette valeur par défaut en ajustant les align-self
éléments individuels.
Par exemple, vous souhaiterez peut-être des colonnes de hauteur égale, de sorte que le conteneur est défini sur align-items: stretch
. Cependant, un élément doit être épinglé en haut, il est donc défini sur align-self: flex-start
.
exemple
Comment le texte est-il un élément flexible?
Certaines personnes se demandent peut-être comment une série de textes ...
<li>This is the text</li>
est un élément enfant du li
.
La raison en est que le texte qui n'est pas explicitement encapsulé par un élément de niveau en ligne est encapsulé de manière algorithmique par une zone en ligne. Cela en fait un élément en ligne anonyme et un enfant du parent.
De la spécification CSS:
9.2.2.1 Boîtes en ligne anonymes
Tout texte contenu directement dans un élément de conteneur de bloc doit être traité comme un élément en ligne anonyme.
La spécification flexbox prévoit un comportement similaire.
4. Articles flexibles
Chaque enfant entrant d'un conteneur flexible devient un élément flexible et chaque série de texte contiguë contenue directement dans un conteneur flexible est enveloppée dans un élément flexible anonyme.
Par conséquent, le texte dans le li
est un élément flexible.
align-items: baseline
. Bon pour différentes hauteurs provenant de différents caractères Unicode, etc.