而不是使用align-self: center
use align-items: center
。
无需更改flex-direction
或使用text-align
。
这是您的代码,只需进行一些调整即可使其全部工作:
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
/* align-self: center; <---- REMOVE */
align-items: center; /* <---- NEW */
background: silver;
width: 100%;
height: 20%;
}
该align-self
属性适用于弹性项目。除非您li
不是弹性项目,否则因为其父项ul
-没有display: flex
或没有display: inline-flex
应用。
因此,ul
它不是伸缩容器,li
不是伸缩项目,并且align-self
没有效果。
该align-items
属性类似于align-self
,不同之处在于它适用于flex容器。
由于li
s是flex容器,align-items
因此可以用于将子元素垂直居中。
* {
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>
Codepen演示
从技术上讲,这里是如何align-items
和align-self
工作...
该align-items
属性(在容器上)设置align-self
(在项目上)的默认值。因此,align-items: center
意味着所有弹性项目都将设置为align-self: center
。
但是您可以通过调整align-self
单个项目的设置来覆盖此默认设置。
例如,您可能需要等高的列,因此将容器设置为align-items: stretch
。但是,必须将一项固定在顶部,因此将其设置为align-self: flex-start
。
例
文本是弹性项目吗?
有些人可能想知道文本如何运行。
<li>This is the text</li>
是的子元素li
。
原因是没有被内联级元素显式包装的文本被内联框算法包装。这使其成为匿名的内联元素和父级的子级。
从CSS规范:
9.2.2.1匿名内联框
直接包含在块容器元素内的任何文本都必须视为匿名内联元素。
flexbox规范提供了类似的行为。
4.弹性项目
flex容器的每个流入子元素都将成为一个flex项目,而直接包含在flex容器内部的每个连续文本段都被包装在一个匿名flex项目中。
因此,中的文字li
是弹性项目。
align-items: baseline
。适合来自不同Unicode字符等的不同高度。