ChatGPT解决这个技术问题 Extra ChatGPT

我怎样才能让 Flexbox 孩子 100% 的高度是他们的父母?

我正在尝试填充 Flexbox 内的弹性项目的垂直空间。

.container { 高度:200px;宽度:500px;显示:弯曲;弹性方向:行; } .flex-1 { 宽度:100px;背景颜色:蓝色; } .flex-2 { 位置:相对;弹性:1;背景颜色:红色; } .flex-2-child { 高度:100%;宽度:100%;背景颜色:绿色; }

< /div>

这是JSFiddle

flex-2-child 不会填充所需的高度,但以下两种情况除外:

flex-2 的高度为 100%(这很奇怪,因为 flex 项目默认为 100% + 它在 Chrome 中是错误的) flex-2-child 有一个绝对位置,这也很不方便

目前这在 Chrome 或 Firefox 中不起作用。

使用 height:100% 有什么问题;对于 .flex-2 ?
它违背了 flex 项目的目的,即自行填充内容,它给了我 chrome 中最奇怪的错误,每当我调整窗口大小时高度都会回到零
实际上,只有最新版本的 Firefox 才能正常工作
目前,在 flexbox 中呈现百分比高度时,浏览器之间的行为存在显着差异:stackoverflow.com/a/35537510/3597276
是的,Chrome 有一些问题,尤其是嵌套弹性盒。例如,我有一个嵌套的弹性框,其子元素具有 height:100% 但它们以自然高度呈现。奇怪的是,如果我将它们的高度更改为 auto,那么它们会呈现为 height:100%,就像我试图做的那样。如果它应该是这样工作的,那肯定是不直观的。

B
B T

使用对齐项目:拉伸

与 David Storey 的回答类似,我的解决方法是:

.flex-2 {
    display: flex;
    align-items: stretch;
}

请注意,应从子组件中删除 height: 100%(请参阅注释)。

作为 align-items 的替代方法,您可以仅在要拉伸的 .flex-2-child 项目上使用 align-self


stretch:这应该是选择的答案。
您将如何对齐已拉伸以在中间垂直对齐的 div 内的文本?
是的,您应该添加删除 height: 100%
这拯救了我的一天。我有一个有一些项目的弹性行。我希望这些项目从其父项中获取高度。我在这里展示了我的问题codepen.io/dshung1997/pen/LYxvXNy
如果我们在这个例子中无法控制“容器”,这会起作用吗?换句话说,我不能让“容器”使用弹性布局
P
Peter Mortensen

我已经回答了一个类似的问题 here

我知道您已经说过 position: absolute; 不方便,但它有效。有关修复调整大小问题的更多信息,请参见下文。

另请参阅此 jsFiddle 进行演示,尽管我只添加了 WebKit 前缀,因此在 Chrome 中打开。

您基本上有两个问题,我将分别处理。

让弹性项目的孩子填充高度 100%

设置位置:相对;在孩子的父母身上。

设置位置:绝对;在孩子身上。

然后,您可以根据需要设置宽度/高度(在我的示例中为 100%)。

修复 Chrome 中调整大小滚动的“怪癖”

放溢出-y: auto;在可滚动的 div 上。

可滚动的 div 必须明确指定高度。我的样本已经有 100% 的高度,但如果没有应用,您可以指定高度:0;

有关滚动问题的详细信息,请参阅 this answer


第 1 点)在 Chrome 中完美运行,Firefox 不需要绝对位置。
这不是一个可接受的解决方案。在我多年的编程生涯中,我了解到您只在某些事情上非常小心地使用绝对位置,因为元素可能无法在其他浏览器中正确呈现。再加上没有解决答案,正如他在标题中提到的 Flexbox 一样,所以这个答案是错误的。
@MannyAlvarado 这个问题和答案是在 flexbox 仍处于工作草案和各地的浏览器实现的时候发布的。历史背景在这里很重要。值得庆幸的是,我们现在处于一个更好的位置,这就是为什么更好的答案已经超过了这个。
P
Peter Mortensen

如果我理解正确,您希望 flex-2-child 填充其父级的高度和宽度,以便红色区域完全被绿色覆盖?

如果是这样,你只需要设置 flex-2 来使用 Flexbox:

.flex-2 {
    display: flex;
}

然后告诉 flex-2-child 变得灵活:

.flex-2-child {
    flex: 1;
}

请参阅http://jsfiddle.net/2ZDuE/10/

原因是 flex-2-child 不是 Flexbox 项,但它的父项是。


我怎么能做同样的事情,只是身高 100%,每个孩子都是 50/50?
请注意,如果您使用“align-items: center”,您将无法使用此修复程序,因为您的项目现在将变得等高。
@NeilMonroe 如果您仅对一个孩子使用 align-self: stretch,您仍然可以使用 align-items: center
嗨@David,我尝试了您的解决方案,它适用于 flex-direction: 行布局,它似乎不适用于 flex-direction: 列布局,或者我在代码中有任何地方错误。你能帮忙检查一下为什么在这个小提琴jsfiddle.net/78o54Lmv中,内框不会占据其父级的全部高度吗?
我必须将 min-height: 100vh; 添加到 .flex-2 元素才能使其正常工作。谢谢您的帮助!
P
Peter Mortensen

我想 Chrome 的行为更符合 CSS 规范(尽管它不太直观)。根据 Flexbox 规范,元素的“跨尺寸属性”(在本例中为 height)的 align-self 属性 changes only the used value 的默认 stretch 值。而且,据我了解 the CSS 2.1 specification,百分比高度是根据父级 height指定值计算的,而不是它的使用值。父级的 height 的指定值不受任何 flex 属性的影响,仍然是 auto

设置显式 height: 100% 可以正式计算孩子的高度百分比,就像在 CSS 中将 height: 100% 设置为 html 可以计算 body 的百分比高度一样;2.1。


确切地!要付诸实践,只需将 height:100% 添加到 .flex-2。这是jsfiddle
Chrome 的行为更符合 Chrome 团队对 CSS 规范的解释。虽然它可以这样解释,但有更好的解释方法,任何一种都不会将我们困在这个集市、烦人和令人讨厌的行为中。他们应该考虑更多。
@RickDoesburg,这是一年多以前的事了,但我相信我不得不求助于固定高度元素。我希望这些浏览器能够齐心协力。我真的开始不喜欢移动领域了。
将垂直 flexbox 容器的子项设置为 height: 100% 在 Chrome 中给我带来了非常奇怪的结果。似乎这会导致“指定高度”设置为容器的总高度,而不是元素本身的高度,因此当其他元素的大小相对于它计算时会导致不需要的滚动.
P
Peter Mortensen

我自己找到了解决方案。假设您有以下 CSS:

.parent {
  align-items: center;
  display: flex;
  justify-content: center;
}

.child {
  height: 100%; <- didn't work
}

在这种情况下,将高度设置为 100% 将不起作用,因此我将 margin-bottom 规则设置为 auto,例如:

.child {
  margin-bottom: auto;
}

并且孩子将与父母的最顶层对齐。

如果您愿意,也可以使用 align-self 规则:

.child {
  align-self: flex-start;
}

一个不错的技巧,但问题是:如果 child 是侧边栏并且它具有背景颜色,则边距空间仍然是白色的。
这个解决方案的优点是父级的高度可以是动态的!以前的解决方案要求父级具有设定的高度。谢谢你。
P
Peter Mortensen

这也可以在我们想要拉伸的元素上使用 align-self: stretch; 来解决。

有时希望在 Flexbox 设置中仅拉伸一项。

.container { 高度:200px;宽度:500px;显示:弯曲;弹性方向:行; } .flex-1 { 宽度:100px;背景颜色:蓝色; } .flex-2 { 位置:相对;弹性:1;对齐自我:拉伸;背景颜色:红色; } .flex-2-child { 背景颜色:绿色; }

< /div>


c
corn on the cob

.container { 高度:200px;宽度:500px;显示:-moz-box;显示:-webkit-flexbox;显示:-ms-flexbox;显示:-webkit-flex;显示:-moz-flex;显示:弯曲; -webkit-flex-direction:行; -moz-flex-direction:行; -ms-flex-direction:行;弹性方向:行; } .flex-1 { 弹性:1 0 100px;背景颜色:蓝色; } .flex-2 { -moz-box-flex: 1; -webkit-flex:1; -moz-flex:1; -ms-flex:1;弹性:1 0 100%;背景颜色:红色; } .flex-2-child { 弹性:1 0 100%;高度:100%;背景颜色:绿色; }

< /div>

http://jsfiddle.net/2ZDuE/750/


一个解释将是有序的。
P
Peter Mortensen

一个想法是,带有 flex-direction: row;display:flex;.flex-1.flex-2 填充 container div,但这并不意味着 .flex-2 具有默认 height:100%;,即使它扩展为全高。

要使用 height:100%; 获得子元素 (.flex-2-child),您还需要在 .flex-2 div 上将父元素设置为 height:100%; 或将 display:flex;flex-direction: row; 一起使用。

据我所知,display:flex 不会将您所有的子元素高度扩展到 100%。

一个小演示,删除了 .flex-2-child 的高度并在 .flex-2 上使用了 display:flex;http://jsfiddle.net/2ZDuE/3/


A
Archy Will He 何魏奇

有趣的事实:height-100% 适用于最新的 chrome;但不是在野生动物园中;

所以顺风的解决方案是

“弹性项目-拉伸”

https://tailwindcss.com/docs/align-items

并递归地应用于孩子的孩子的孩子......


Z
Zach White
.parent {
    display: flex;
}

.child {
    min-height: 100%;
}

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。
B
Berci

我使用的另一种方法(其他选项不适合我的情况,因为我需要一个更通用的解决方案,并且我真的想尽可能避免使用 position: absolute):

有一个带有 display: flex 的父元素也给你的元素显示 flex,align-self:stretch 和 margin-top: 0 + margin-bottom: 0

最小的可重现示例:

.parrent { 显示:弹性; // 宽度可以是任何值。宽度:150px; } .full-height-just-with-bg-collor { 宽度:100%;显示:弯曲;对齐自我:拉伸; // 这可以只是 0 或者你可以只设置顶部和底部值 margin: 0 2px;背景颜色:绿色; }

textForHeight


H
HRK

。容器 { 。 . . .对齐项目:拉伸; . . . . }


欢迎来到stackoverflow。您需要充分解释您的答案,以及它与现有答案的不同之处。请参阅stackoverflow.com/help/how-to-answer
您的答案似乎与 B T 的相同(提前三年写成),但表达得更差。
P
Peter Mortensen

这是我使用 css+ 的解决方案。

首先,如果第一个孩子 (flex-1) 应该是 100px,它不应该是 flex。

实际上,在 css+ 中,您可以设置灵活和/或静态元素(列或行),您的示例变得如此简单:

<div class="container">
  <div class="EXTENDER">
    <div class="COLS">
      <div class="CELL _100px" style="background-color:blue">100px</div>
      <div class="CELL _FLEX" style="background-color:red">flex</div>
    </div>
  </div>
</div>

容器 CSS:

.container {
    height: 200px;
    width: 500px;
    position: relative;
}

显然包括css+ 0.2 core

这是the fiddle