我想使用弹性框来垂直对齐<li>
内的一些内容,但没有取得很大的成功。
我已经在网上查了一下,很多教程实际上都使用了一个包装div,它从父级的flex设置中获取align-items:center
,但我想知道是否可以删除这个额外的元素?
我选择在此实例中使用弹性框,因为列表项高度将是动态%。
* {
padding: 0;
margin: 0;
}
html, body {
height: 100%;
}
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
align-self: center;
background: silver;
width: 100%;
height: 20%;
}
<ul>
<li>This is the text</li>
</ul>
答案 0 :(得分:379)
如果可以,我会删除此答案,但无法删除已接受的答案。
如果您使flex-direction
垂直(使用column
),则justify-content: center
垂直居中。然后你也可以使用text-align: center
水平居中。
li {
display: flex;
justify-content: center;
flex-direction: column;
text-align: center;
}
答案 1 :(得分:357)
不使用 align-self: center
,而是使用 align-items: center
。
无需更改flex-direction
或使用text-align
(如another answer中所述)。
以下是您的代码,只需一次调整即可完成所有工作:
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
是一个弹性容器,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>
从技术上讲,这是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 Anonymous inline boxes
直接包含在块容器元素中的任何文本 必须被视为匿名内联元素。
flexbox规范提供了类似的行为。
Flex容器的每个in-flow子项都变为flex项,每个都是 连续运行的文本直接包含在flex中 容器包装在一个匿名的flex项目中。
因此,li
中的文字是弹性项目。
答案 2 :(得分:21)
对于未来的Google员工,
投票最多,回答第二多的答案也用于解决OP发布的这个特定问题,其中内容(文本)被“算法联盟”包裹在内联块元素内。但是,您的案例可能是关于将常规元素垂直放置在容器内的中心,这也适用于我的案例,因此,您所需要做的就是
align-self: center;
只需将其放在此处,因为这是上述查询的最佳结果,并且我在相当长的一段时间内一直感到困惑* Derp *
答案 3 :(得分:10)
最好的方法是在弹性框内嵌套一个弹性框。您所要做的就是给孩子align-items: center
。这将使文本在其父对象内部垂直对齐。
// Assuming a horizontally centered row of items for the parent but it doesn't have to be
.parent {
align-items: center;
display: flex;
justify-content: center;
}
.child {
display: flex;
align-items: center;
}
答案 4 :(得分:4)
在li
中将显示设置为flex,并将align-items
设置为center
。
li {
display: flex;
/* Align items vertically */
align-items: center;
/* Align items horizontally */
justify-content: center;
}
我个人也将伪元素作为目标并使用border-box
(Universal selector * and pseudo elements)
*,
*::before,
*::after {
padding: 0;
margin: 0;
box-sizing: border-box;
}
答案 5 :(得分:3)
使用display: flex
,您可以控制HTML元素的垂直对齐。
.box {
height: 100px;
display: flex;
align-items: center; /* Vertical */
justify-content: center; /* Horizontal */
border:2px solid black;
}
.box div {
width: 100px;
height: 20px;
border:1px solid;
}
<div class="box">
<div>Hello</div>
<p>World</p>
</div>
答案 6 :(得分:3)
这取决于你的li高度,再叫一个东西行高
* {
padding: 0;
margin: 0;
}
html,
body {
height: 100%;
}
ul {
height: 100%;
}
li {
display: flex;
justify-content: center;
align-self: center;
background: silver;
width: 100%;
height:50px;line-height:50px;
}
<ul>
<li>This is the text</li>
</ul>
答案 7 :(得分:0)
* {
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>
答案 8 :(得分:0)
结果
HTML
<ul class="list">
<li>This is the text</li>
<li>This is another text</li>
<li>This is another another text</li>
</ul>
使用align-items
代替align-self
,我还向flex-direction
添加了column
。
CSS
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html,
body {
height: 100%;
}
.list {
display: flex;
justify-content: center;
flex-direction: column; /* <--- I added this */
align-items: center; /* <--- Change here */
height: 100px;
width: 100%;
background: silver;
}
.list li {
background: gold;
height: 20%;
}
答案 9 :(得分:0)
* {
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>
答案 10 :(得分:-2)
您可以将ul
和li
显示更改为table
和table-cell
。然后,vertical-align
会对你有用:
ul {
height: 20%;
width: 100%;
display: table;
}
li {
display: table-cell;
text-align: center;
vertical-align: middle;
background: silver;
width: 100%;
}