Invece di usare align-self: center
use align-items: center
.
Non è necessario modificare flex-direction
o utilizzare text-align
.
Ecco il tuo codice, con una sola modifica, per farlo funzionare:
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
proprietà si applica agli articoli flessibili . Tranne che il tuo li
non è un oggetto flessibile perché il suo genitore - il ul
- non ha display: flex
o display: inline-flex
applicato.
Pertanto, ul
non è un contenitore flessibile, li
non è un oggetto flessibile e align-self
non ha alcun effetto.
La align-items
proprietà è simile align-self
, tranne per i contenitori flessibili .
Poiché li
è un contenitore flessibile, align-items
può essere utilizzato per centrare verticalmente gli elementi figlio.
* {
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>
demo codepen
Tecnicamente, ecco come align-items
e come align-self
funziona ...
La align-items
proprietà (sul contenitore) imposta il valore predefinito di align-self
(sugli articoli). Pertanto, align-items: center
significa che tutti gli elementi flessibili saranno impostati su align-self: center
.
Ma puoi sovrascrivere questa impostazione predefinita regolando align-self
su singoli elementi.
Ad esempio, potresti volere colonne di uguale altezza, quindi il contenitore è impostato su align-items: stretch
. Tuttavia, un elemento deve essere bloccato in alto, quindi è impostato su align-self: flex-start
.
esempio
In che modo il testo è un oggetto flessibile?
Alcune persone potrebbero chiedersi come una sequenza di testo ...
<li>This is the text</li>
è un elemento figlio di li
.
Il motivo è che il testo che non è esplicitamente racchiuso da un elemento di livello inline è algoritmicamente racchiuso da un riquadro inline. Questo lo rende un elemento inline anonimo e figlio del genitore.
Dalle specifiche CSS:
9.2.2.1 Caselle incorporate anonime
Qualsiasi testo contenuto direttamente all'interno di un elemento contenitore di blocchi deve essere trattato come un elemento inline anonimo.
Le specifiche del flexbox prevedono comportamenti simili.
4. Articoli flessibili
Ogni figlio in-flow di un contenitore flessibile diventa un oggetto flessibile e ogni sequenza contigua di testo direttamente contenuta all'interno di un contenitore flessibile viene racchiusa in un oggetto flessibile anonimo.
Quindi, il testo in li
è un oggetto flessibile.
align-items: baseline
. Buono per diverse altezze provenienti da diversi caratteri Unicode ecc.