ChatGPT解决这个技术问题 Extra ChatGPT

如何在弹性框中垂直对齐文本?

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

我在网上查过,许多教程实际上使用了一个包装器 div,它从父级的 flex 设置中获取 align-items:center,但我想知道是否可以删除这个额外的元素?

在这种情况下,我选择使用 flexbox,因为列表项高度将是动态的 %

* {填充:0;边距:0; } html, 身体 { 高度: 100%; } ul { 高度:100%; }李{显示:弹性;证明内容:中心;对齐自我:中心;背景:银色;宽度:100%;高度:20%; }

  • 这是正文


P
Penny Liu

使用 align-items: center 代替 align-self: 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: flexdisplay: inline-flex

因此,ul 不是弹性容器,li 不是弹性项目,align-self 无效。

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

由于 li 是一个弹性容器,align-items 可用于垂直居中子元素。

{填充:0;边距:0; } html, 身体 { 高度: 100%; } ul { 高度:100%; }李{显示:弹性;证明内容:中心; /* 对齐自我:中心; */ 对齐项目:居中;背景:银色;宽度:100%;高度:20%; }

  • 这是正文

codepen demo

从技术上讲,align-itemsalign-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 匿名行内框 任何直接包含在块容器元素中的文本都必须被视为匿名行内元素。

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

4. Flex 项 flex 容器的每个流入子项都成为一个 flex 项,并且直接包含在 flex 容器内的每个连续文本运行都包装在一个匿名的 flex 项中。

因此,li 中的文本是一个弹性项目。


我喜欢align-items: baseline。适用于来自不同 unicode 字符等的不同高度。
感谢您解释并链接到匿名内联框的概念......确实有助于阐明为什么您可以通过反复试验来实现某些效果以它们的方式工作。
不要忘记删除任何 margin: 0px;
s
serraosays

最好的做法是将一个 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;
}

如果你想要一个完美的居中文本。 text-align:center 不能单独工作。与它一起使用 align-items: center
我猜如果您将 align-items: center 给具有 display: flex 的父级,那么它会自动应用于它的所有子元素,因此不必为每个子元素显式声明 align-items: center
@ChandraAgarwala - 这是真的,但如果你想垂直居中每个孩子的内容,你还需要为每个孩子添加另一个 display: flex; align-items: center;
T
TylerH

投票最多的答案是解决 OP 发布的此特定问题,其中内容(文本)被包装在 inline-block 元素中。某些情况可能是关于在容器内垂直居中正常元素,这也适用于我的情况,因此您只需要:

align-self: center;

K
Krzysztof AN

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

在浏览器的开发工具中,您需要检查一个元素并在 display: flex 开启的情况下,按屏幕截图中显示的图标。

https://i.stack.imgur.com/yy5P7.png

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


这真的很有用,就像一个注释,它似乎不是在 Firefox 中,而是在 chrome 中。
W
Wilson

结果

https://i.stack.imgur.com/PqAQA.png

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%; 
}

V
Victor Santizo

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;
}
  

L
Lex

使用 display: flex,您可以控制 HTML 元素的垂直对齐方式。

.box { 高度:100px;显示:弯曲;对齐项目:居中; /* 垂直 */ justify-content: center; /* 水平 */ 边框:2px 纯黑色; } .box div { 宽度:100px;高度:20px;边框:1px 实心; }

Hello

世界


L
Leena

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

使用 align-items 将显示 li 中的文本。查看此代码。有用。

{填充:0;边距:0; } html, 身体 { 高度: 100%; } ul { 高度:100%; }李{显示:弹性;证明内容:中心;对齐项目:居中;背景:银色;宽度:100%;高度:20%; }

  • 这是正文


U
Umesh

这取决于你的 li 高度只需再叫一件事线高度

{填充:0;边距:0; } html, 身体 { 高度: 100%; } ul { 高度:100%; }李{显示:弹性;证明内容:中心;对齐自我:中心;背景:银色;宽度:100%;高度:50px;行高:50px; }

  • 这是正文


A
Anatoly Gorchuk

* {填充:0;边距:0; } html, 身体 { 高度: 100%; } ul { 高度:100%; }李{显示:弹性;证明内容:中心;对齐项目:居中;背景:银色;宽度:100%;高度:20%; }

  • 这是正文


L
Lee Taylor

.flex-container { 显示:弹性;高度:300px;对齐项目:居中;证明内容:中心;宽度:100%; } .flex-child { 显示:弹性;宽度:100%;背景色:卡其色;边框:1px 实心#000;对齐项目:居中;证明内容:中心;高度:100px;边距:10px;填充:10px; }

英文
英文
英文


S
Swapnil

* {填充:0;边距:0; } html, 身体 { 高度: 100%; } ul { 高度:100%; }李{显示:弹性;证明内容:中心;对齐项目:中心;背景:银色;宽度:100%;高度:20%; }

  • 这是正文


仅代码的答案不是很有用...添加评论或解释您所做的事情以及它为什么起作用。
E
Edzzn

您可以将 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%; 
}

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


在您在那里添加另一个列表项之前效果很好。
您已将高度切换为 ul 而不是 li?每个 li 的高度都是动态的,所以我担心这不是我可以使用的东西
@LcSalazar 如果您只打算拥有一个项目,您通常不会使用列表。这就是 div 的用途。
再次正确......但我并不是说这是完美的场景。我刚刚发布了一个可以直接回答问题的解决方案。我希望这些信息可能对阅读它并有另一种情况的其他人有用......
另外...... display:table / display:table-cell 技术对于大多数元素的层次结构很有用......所以,我同意它不会被选为正确答案,但我希望它对某人有所帮助。