如何在Flexbox中垂直对齐文本?

sty*_*ler 364 html css flexbox

我想使用弹性框垂直对齐一些内容,<li>但没有取得很大的成功.

我已经在网上查了一下,很多教程实际上都使用了一个包装div来获取align-items:center父对象的flex设置,但是我想知道是否可以删除这个额外的元素?

我选择在此实例中使用弹性框,因为列表项高度将是动态%.

* {
  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%;
}
Run Code Online (Sandbox Code Playgroud)
<ul>
  <li>This is the text</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

Mic*_*l_B 459

而不是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%; 
}
Run Code Online (Sandbox Code Playgroud)

align-self属性适用于弹性项目.除了你li的不是灵活项目,因为它的父 - 没有ul- display: flex或没有display: inline-flex.

因此,ul它不是flex容器,li不是flex项,align-self也没有效果.

align-items属性类似于align-self,但它适用于柔性容器.

由于li是一个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%;
}
Run Code Online (Sandbox Code Playgroud)
<ul>
  <li>This is the text</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

codepen演示


从技术上讲,这是如何align-itemsalign-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>
Run Code Online (Sandbox Code Playgroud)

是一个孩子的元素li.

原因是未由内联级元素显式包装的文本由内联框在算法上包装.这使它成为父内容的匿名内联元素和子元素.

从CSS规范:

9.2.2.1匿名内联框

任何直接包含在块容器元素中的文本都必须被视为匿名内联元素.

flexbox规范提供了类似的行为.

4. Flex项目

Flex容器的每个in-flow子项都变为flex项,并且直接包含在flex容器内的每个连续文本行都包含在匿名flex项中.

因此,该文本li是一个弹性项目.

  • 我喜欢“对齐项目:基线”。适用于来自不同 unicode 字符等的不同高度。 (4认同)
  • 感谢您解释并链接到匿名内联框的概念...确实有助于阐明为什么您可以通过尝试和错误实现的某些效果会以它们的方式工作。 (4认同)

Ben*_*ess 451

编辑:请使用Michael_B的答案而不是我的答案.如果可以的话,我会删除这个答案,但是接受的答案不能删除.


如果使flex-direction垂直(使用column)然后justify-content: center垂直居中.然后你也可以使用text-align: center水平居中.

li {
  display: flex;
  justify-content: center;
  flex-direction: column;
  text-align: center;
}
Run Code Online (Sandbox Code Playgroud)

在这里它是在行动:http://codepen.io/anon/pen/Fkhgo

  • 很棒的答案!这个解决方案的一个警告是,这个新容器中的任何标签都将被强制放在自己的行上.例如:`a``强'`em`. (7认同)
  • 无需改变方向.align-items:center; 这就是它的用途.align-items用于辅助弹性框轴 (3认同)
  • FWIW,此解决方案适用于现有的Flexbox设置.IOW,你可以嵌套显示:flex元素,所以在容器元素中有例如horiz + vert居中的文本,它们均匀地分布在*他们的*容器中.Flexbox FTW. (2认同)

Krz*_*sik 40

就不写答案了,因为很多人已经给出了正确的答案。不过,我想向您展示一个有用的工具,可以帮助您避免将来遇到此类问题。

在浏览器的开发工具中,您需要检查元素并display: flex单击屏幕截图中显示的图标。

在此输入图像描述

然后,您将看到选择某些属性的选项,display: flex以便您可以轻松快速地检查所有选项,而无需知道可以使用什么。

  • 这个确实很有用,只是作为一个注释,它似乎不在firefox中,而是在chrome中。 (4认同)

Moh*_*jib 30

对于未来的Google员工,

投票最多的答案也是第二个答案,用于解决OP发布的这个特定问题,其中内容(文本)被"算法合法"包含在内联块元素中.但是,你的情况可能是将一个普通元素垂直居中放在容器内部,这也适用于我的情况,所以你需要的只是

align-self: center;
Run Code Online (Sandbox Code Playgroud)

只是把它放在这里,因为这是上述查询的最高结果,而且我很困惑很长一段时间*Derp*


ser*_*ays 15

最好的举措是将flexbox嵌套在flexbox中.你所要做的就是给孩子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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要完美居中的文本。`text-align:center` 不能单独工作。使用 `align-items: center` 。 (2认同)

Wil*_*son 13

结果

在此处输入图片说明

HTML

<ul class="list">
  <li>This is the text</li>
  <li>This is another text</li>
  <li>This is another another text</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

使用align-items代替,align-self我还添加flex-directioncolumn.

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%; 
}
Run Code Online (Sandbox Code Playgroud)


小智 9

将显示设置li为 flex 并设置align-itemscenter

li {
  display: flex;

  /* Align items vertically */
  align-items: center;

  /* Align items horizontally */
  justify-content: center;

}
Run Code Online (Sandbox Code Playgroud)

我个人也会针对伪元素并使用border-box通用选择器 * 和伪元素

*,
*::before,
*::after {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}
  
Run Code Online (Sandbox Code Playgroud)


小智 7

使用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;
}
Run Code Online (Sandbox Code Playgroud)
<div class="box">
  <div>Hello</div>
  <p>World</p>
</div>
Run Code Online (Sandbox Code Playgroud)


小智 6

Align-self不对齐 li 内的项目。相反,它将礼作为一个整体进行对齐。

使用align-items会更改 li 内的文本。查看此代码。有用。

* {
  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%;
}
Run Code Online (Sandbox Code Playgroud)
<ul>
  <li>This is the text</li>
</ul>
Run Code Online (Sandbox Code Playgroud)


LcS*_*zar -7

您可以将ulli显示更改为tabletable-cell。那么,vertical-align将为您工作:

ul {
    height: 20%;
    width: 100%;
    display: table;
}

li {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    background: silver;
    width: 100%; 
}
Run Code Online (Sandbox Code Playgroud)

http://codepen.io/anon/pen/pckvK

  • 又是真的……但我并不是说这是完美的场景。我刚刚发布了一个解决方案,可以按原样回答问题。我希望这些信息对于阅读它并有另一种情况的其他人来说可能会派上用场...... (2认同)