Anstelle von align-self: center
verwenden Sie align-items: center
.
Es ist nicht notwendig, flex-direction
zu ändern oder text-align
zu verwenden.
Hier ist Ihr Code, mit einer Anpassung, um alles funktionieren zu lassen:
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
/* align-self: center; <---- ENTFERNEN */
align-items: center; /* <---- NEU */
background: silver;
width: 100%;
height: 20%;
}
Die Eigenschaft align-self
gilt für Flex-Elemente. Aber Ihr li
ist kein Flex-Element, da sein Elternelement – das ul
– nicht display: flex
oder display: inline-flex
hat.
Demzufolge ist das ul
kein Flex-Container, das li
kein Flex-Element, und align-self
hat keine Auswirkung.
Die Eigenschaft align-items
ist ähnlich wie align-self
, aber sie gilt für Flex-Container.
Da das li
ein Flex-Container ist, kann align-items
verwendet werden, um die Kind-Elemente vertikal zu zentrieren.
* {
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%;
}
Dies ist der Text
CodePen-Demo
Technisch gesehen, so funktionieren align-items
und align-self
...
Die Eigenschaft align-items
(am Container) setzt den Standardwert von align-self
(an den Elementen). Daher bedeutet align-items: center
, dass alle Flex-Elemente auf align-self: center
gesetzt sind.
Aber Sie können dies standardmäßig überschreiben, indem Sie das align-self
bei einzelnen Elementen anpassen.
Zum Beispiel möchten Sie möglicherweise Spalten mit gleicher Höhe, daher ist der Container auf align-items: stretch
gesetzt. Allerdings muss ein Element oben fixiert sein, daher ist es auf align-self: flex-start
gesetzt.
Beispiel
Wie ist der Text ein Flex-Element?
Einige Leute fragen sich vielleicht, wie eine Textreihe...
Dies ist der Text
ein Kind-Element des li
ist.
Der Grund dafür ist, dass Text, der nicht explizit von einem Inline-Level-Element umschlossen ist, algorithmisch von einer Inline-Box umschlossen wird. Dadurch wird er zu einem anonymen Inline-Element und Kind des Elternelements.
Aus der CSS-Spezifikation:
9.2.2.1 Anonyme Inline-Boxen
Jeder Text, der direkt innerhalb eines Blockcontainer-Elements enthalten ist, muss als anonymes Inline-Element behandelt werden.
Die Flexbox-Spezifikation sieht ein ähnliches Verhalten vor.
4. Flex-Elemente
Jedes im Fluss befindliche Kind eines Flex-Containers wird zu einem Flex-Element, und jeder zusammenhängende Textblock, der direkt innerhalb eines Flex-Containers enthalten ist, wird in ein anonymes Flex-Element eingewickelt.
Daher ist der Text im li
ein Flex-Element.