Flex align-items 不适用于 flex-wrap? [复制]

Posted

技术标签:

【中文标题】Flex align-items 不适用于 flex-wrap? [复制]【英文标题】:Flex align-items does not work with flex-wrap? [duplicate] 【发布时间】:2021-03-26 01:46:53 【问题描述】:

我有时觉得 Flex 太复杂了。

演示:https://jsfiddle.net/304xhguw/

我正在尝试创建一个结尾有多行文本的容器:

使用 Flex 应该真的很容易,对吧?

div 
  display: flex;
  align-items: flex-end;
  padding: 20px;
  height: 300px;
  background: #222;
  flex-wrap: wrap;


h1 
  width: 100%;


h1, p 
  color: #fff;

完成,容器使用 flex,在末尾对齐项目,并且由于 wrap100% 中的 wrapwidth,h1 创建了一个新行。完美。

不是这样的:

等等,这里发生了什么? <p> 与底部对齐,但 <h1> - 不是吗?但是父容器有align-items: flex-end;,这是什么魔法?

不用担心,有一些惊人的属性应该可以工作,让我们试试吧:

h1 align-self: flex-end;

没什么变化,嗯,好吧,那么也许:

h1 align-self: end;

好吧,现在怎么办?

请问,谁能向我解释一下这里到底发生了什么以及为什么 Flex 如此愚蠢不直观?我可以在 20 秒内使用旧的 position: relative 甚至 tables(我知道,我知道...)来完成此操作。是只有我一个人还是 Flexbox 感觉像是一个非常强大的工具,但对于大约 95% 的最简单的情况来说,它是一种过度杀伤和令人头疼的工具?

注意:我不想添加任何额外的 DIVS 包装器或容器。我觉得将 h1 和 p 包装在一个 div 中然后对齐会相当容易,但我不会在 2021 年使用 Flex 来添加不必要的标记。

【问题讨论】:

【参考方案1】:

使用 flex 的替代解决方案,使用 flex 方向作为列

div 
display: flex;
flex-direction:column;
justify-content: flex-end;
padding: 20px;
height: 300px;
background: #222;
flex-wrap: wrap;

【讨论】:

【参考方案2】:

编辑 1:

我忘了在关于 flex-wrap 的原始答案中提到,当它的启用和行项目被包装并创建多行 flexbox 时。在这种情况下,当您对齐内容时(我没有提到项目,因为您想考虑所有元素而不仅仅是单行上的元素),您需要使用align-content: flex-end

这将在 flexbox 的末尾打包 flex 布局中出现的所有多行,并且您的项目将在底部对齐。

当您使用align-items: flex-end 时,flexbox 会根据元素所在的行对齐项目。

当您使用align-items: flex-end 时,元素按照它们的线对齐。

Heading
--------- // line 1
Paragraph
--------- // line 2

当你使用align-content: flex-end 时,线条会移动到底部。

Heading
Paragraph
--------- // multi lines are packed at the end of the flexbox

以下是适合您的工作示例:

body  margin: 0; padding: 0; 

div 
  display: flex;
  align-content: flex-end;
  padding: 20px;
  height: 300px;
  background: #222;
  flex-wrap: wrap;


h1 
  width: 100%;


h1, p 
  color: #fff;
<div>
  <h1>Header something something something header more of header and more and more</h1>
  <p>Just some content at the end of the div not sure what more to write</p>
</div>

https://jsfiddle.net/h9ykz0ue/


您的代码实际上没有任何问题。我建议您在 flex 容器中使用 align-items: flex-end; 而不是 align-items: end;

您在这里面临的问题是保证金。 &lt;h1&gt;&lt;p&gt; 都有自己的边距。

由于 flex 布局,这些元素是并排呈现的(但在视觉上它们是垂直堆叠的,感谢flex-wrap)。 margin collapsing 也没有出现在你的布局中,因为它在 flex 布局中不受支持,它只出现在块布局中。

我建议你不要使用flex-wrap: wrap,而是这样使用flex-direction: columnjustify-content: flex-end

div 
  .
  .
  flex-direction: column;
  justify-content: flex-end;
  .
  .

这是我所说的快速演示:

body 
  margin: 0;
  padding: 0;


div 
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: 20px;
  height: 300px;
  background: #222;


h1 
  width: 100%;


h1, p 
  color: #fff;


p 
  margin: 0;
<div>
  <h1>Header something something something header more of header and more and more</h1>
  <p>Just some content at the end of the div not sure what more to write</p>
</div>

这里我还去掉了&lt;p&gt;的边距,这样&lt;h1&gt;就会更接近它。如果不需要,您可以删除样式。

【讨论】:

谢谢你,但我认为你在这里可能错了,删除边距没有帮助,所以问题必须出在其他地方:jsfiddle.net/pno45L3c 您能否详细说明您的要求。你在这里期待什么? 这里检查一下:jsfiddle.net/z6hopvqw,它不仅仅是边距,它也是您需要更改的 flex-direction。保证金在这里是可选的! 请阅读完整答案,我已经详细解释了 您的回答非常好,我会接受它,尽管我尝试学习新东西,但我仍然不明白为什么我需要对没有列的数据使用“列”布局全部。 Flexbox 真的很奇怪。

以上是关于Flex align-items 不适用于 flex-wrap? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Flexbox CSS 不适用于 Safari

css篇——flex布局详解

微信小程序-学习笔记5-UI布局

元素水平垂直居中

Flex-end 不适用于显示 flex 的 div 内的按钮

Safari flex 不适用于 clearfix hack