不要使用 align-self: center,而是使用 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,除了它适用于弹性容器。
由于li 是一个弹性容器,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 demo
从技术上讲,align-items 和 align-self 的工作原理如下...
align-items 属性(在容器上)设置默认值 align-self(在项目上)。因此,align-items: center 表示所有弹性项目都将设置为align-self: center。
但您可以通过调整单个项目上的align-self 来覆盖此默认值。
例如,您可能需要等高的列,因此将容器设置为align-items: stretch。但是,必须将一项固定到顶部,因此将其设置为align-self: flex-start。
example
文本如何成为弹性项目?
有些人可能想知道如何运行文本...
<li>This is the text</li>
是li的子元素。
原因是没有被内联元素显式包裹的文本在算法上被内联框包裹。这使它成为 匿名内联元素 和父级的子级。
来自 CSS 规范:
9.2.2.1 Anonymous inline
boxes
直接包含在块容器元素中的任何文本
必须被视为匿名内联元素。
flexbox 规范提供了类似的行为。
4. Flex Items
flex 容器的每个流入子项都成为一个 flex 项,并且每个
直接包含在 flex 中的连续文本
容器被包裹在一个匿名的弹性项目中。
因此,li 中的文本是一个弹性项目。