我正在尝试填充 Flexbox 内的弹性项目的垂直空间。
.container { 高度:200px;宽度:500px;显示:弯曲;弹性方向:行; } .flex-1 { 宽度:100px;背景颜色:蓝色; } .flex-2 { 位置:相对;弹性:1;背景颜色:红色; } .flex-2-child { 高度:100%;宽度:100%;背景颜色:绿色; }
这是JSFiddle
flex-2-child
不会填充所需的高度,但以下两种情况除外:
flex-2 的高度为 100%(这很奇怪,因为 flex 项目默认为 100% + 它在 Chrome 中是错误的) flex-2-child 有一个绝对位置,这也很不方便
目前这在 Chrome 或 Firefox 中不起作用。
height:100%
但它们以自然高度呈现。奇怪的是,如果我将它们的高度更改为 auto
,那么它们会呈现为 height:100%
,就像我试图做的那样。如果它应该是这样工作的,那肯定是不直观的。
使用对齐项目:拉伸
与 David Storey 的回答类似,我的解决方法是:
.flex-2 {
display: flex;
align-items: stretch;
}
请注意,应从子组件中删除 height: 100%
(请参阅注释)。
作为 align-items
的替代方法,您可以仅在要拉伸的 .flex-2-child
项目上使用 align-self
。
我已经回答了一个类似的问题 here。
我知道您已经说过 position: absolute;
不方便,但它有效。有关修复调整大小问题的更多信息,请参见下文。
另请参阅此 jsFiddle 进行演示,尽管我只添加了 WebKit 前缀,因此在 Chrome 中打开。
您基本上有两个问题,我将分别处理。
让弹性项目的孩子填充高度 100%
设置位置:相对;在孩子的父母身上。
设置位置:绝对;在孩子身上。
然后,您可以根据需要设置宽度/高度(在我的示例中为 100%)。
修复 Chrome 中调整大小滚动的“怪癖”
放溢出-y: auto;在可滚动的 div 上。
可滚动的 div 必须明确指定高度。我的样本已经有 100% 的高度,但如果没有应用,您可以指定高度:0;
有关滚动问题的详细信息,请参阅 this answer。
如果我理解正确,您希望 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 项,但它的父项是。
align-self: stretch
,您仍然可以使用 align-items: center
。
min-height: 100vh;
添加到 .flex-2
元素才能使其正常工作。谢谢您的帮助!
我想 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%
在 Chrome 中给我带来了非常奇怪的结果。似乎这会导致“指定高度”设置为容器的总高度,而不是元素本身的高度,因此当其他元素的大小相对于它计算时会导致不需要的滚动.
我自己找到了解决方案。假设您有以下 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;
}
这也可以在我们想要拉伸的元素上使用 align-self: stretch;
来解决。
有时希望在 Flexbox 设置中仅拉伸一项。
.container { 高度:200px;宽度:500px;显示:弯曲;弹性方向:行; } .flex-1 { 宽度:100px;背景颜色:蓝色; } .flex-2 { 位置:相对;弹性:1;对齐自我:拉伸;背景颜色:红色; } .flex-2-child { 背景颜色:绿色; }
.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%;背景颜色:绿色; }
一个想法是,带有 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/
有趣的事实:height-100% 适用于最新的 chrome;但不是在野生动物园中;
所以顺风的解决方案是
“弹性项目-拉伸”
https://tailwindcss.com/docs/align-items
并递归地应用于孩子的孩子的孩子......
.parent {
display: flex;
}
.child {
min-height: 100%;
}
我使用的另一种方法(其他选项不适合我的情况,因为我需要一个更通用的解决方案,并且我真的想尽可能避免使用 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;背景颜色:绿色; }
。容器 { 。 . . .对齐项目:拉伸; . . . . }
这是我使用 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。
stretch
:这应该是选择的答案。height: 100%