Invece di usare align-self: centeruse align-items: center.
Non è necessario modificare flex-directiono 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-selfproprietà si applica agli articoli flessibili . Tranne che il tuo linon è un oggetto flessibile perché il suo genitore - il ul- non ha display: flexo display: inline-flexapplicato.
Pertanto, ulnon è un contenitore flessibile, linon è un oggetto flessibile e align-selfnon ha alcun effetto.
La align-itemsproprietà è simile align-self, tranne per i contenitori flessibili .
Poiché liè un contenitore flessibile, align-itemspuò 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-itemse come align-selffunziona ...
La align-itemsproprietà (sul contenitore) imposta il valore predefinito di align-self(sugli articoli). Pertanto, align-items: centersignifica che tutti gli elementi flessibili saranno impostati su align-self: center.
Ma puoi sovrascrivere questa impostazione predefinita regolando align-selfsu 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.