不要使用align-self: center
,而要使用align-items: center
。
无需更改flex-direction
或使用text-align
。
以下是您的代码,只需要进行一处调整即可使其正常工作:
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
align-items: center;
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-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 匿名内联框
任何直接包含在块级容器元素中的文本都必须被视为匿名内联元素。
弹性盒规范提供了类似的行为。
4. 弹性盒子项
弹性容器中的每个流动子元素都变成了一个弹性盒子项,在弹性容器中直接包含的任何连续文本都会被包装在一个匿名的弹性盒子项中。
因此,li
中的文本是一个弹性盒子项。
align-items: baseline
。它适用于来自不同Unicode字符的不同高度等情况。 - qräbnömargin: 0px;
。 - Adam Cox