如何在弹性项目中垂直居中文本?

Posted

技术标签:

【中文标题】如何在弹性项目中垂直居中文本?【英文标题】:How to center text vertically in a flex item? 【发布时间】:2017-11-28 07:06:15 【问题描述】:

我只希望文本是这样的:

display: table-cell;
vertical-align: middle;

但是使用弹性盒子

div 
  border: 1px solid black;


.box 
  display: flex;
  flex-flow: column nowrap;
  justify-content: center;
  align-content: center;
  align-items: stretch;
  height: 200px;


.box div 
  order: 1;
  flex: 0 1 auto;
  align-self: auto;
  min-width: 0;
  min-height: auto;


.box div.C 
  flex: 1 1 auto;
<div class="box">
  <div class="A">A</div>
  <div class="B">B</div>
  <div class="C">C</div>
  <div class="D">D</div>
  <div class="E">E</div>
  <div class="F">F</div>
</div>

【问题讨论】:

【参考方案1】:

div 
  border: 1px solid black;


.box 
  display: flex;
  flex-flow: column nowrap;
  justify-content: center;
  align-content: center;
  align-items: stretch;
  height: 200px;


.box div 
  order: 1;
  flex: 0 1 auto;
  align-self: auto;
  min-width: 0;
  min-height: auto;
  display: flex;            /* NEW */
  align-items: center;      /* NEW */


.box div.C 
  flex: 1 1 auto;
<div class="box">
  <div class="A">A</div>
  <div class="B">B</div>
  <div class="C">C</div>
  <div class="D">D</div>
  <div class="E">E</div>
  <div class="F">F</div>
</div>

说明

flex formatting context 的范围仅限于父子关系。子元素之外的 flex 容器的后代不参与 flex 布局,并且会忽略 flex 属性。

在您的布局中,.box 元素是弹性容器(父级),而 div 元素是弹性项目(子级)。因此,justify-contentalign-contentalign-items 规则适用于 div。

但是,文本又低了一层。它超出了这个弹性容器的范围。文本被认为是弹性项目的子元素/弹性容器的大子元素。因此,文本不能接受 flex 属性。

在 CSS 中,未被元素显式包裹的文本在算法上由内联框包裹。这使它成为 匿名内联元素 和父级的子级。

来自 CSS 规范:

9.2.2.1 Anonymous inline boxes

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

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

4. Flex Items

flex 容器的每个流入子元素都成为一个 flex 项,并且每个连续的文本都直接包含在 flex 中 容器被包裹在一个匿名的弹性项目中。

因此,文本是弹性项目的子元素。

所以你需要做的就是把弹性项目变成弹性容器。然后,您可以重复居中规则以垂直和/或水平居中文本。

【讨论】:

我非常喜欢这个解决方案,因为它仍然允许拉伸内部 div。 附带说明,如果文本包含标签,它会被拆分为多个(匿名)弹性项目,这可能导致意外行为(即,在有标签的地方增加/减少空白)。因此,在这种情况下,必须确保将整个文本包装在例如&lt;p&gt;&lt;/p&gt;.

以上是关于如何在弹性项目中垂直居中文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 flex 元素中垂直居中文本?

块级元素的垂直居中

弹性项目不垂直居中

没有弹性盒的垂直居中

垂直居中并左对齐一列弹性项目

Flexbox - 垂直居中文本[重复]