4 回答
TA贡献2019条经验 获得超9个赞
对于Mobile Safari有一个浏览器修复程序。你需要为iOS设备添加-webkit-box。
防爆。
display: flex;
display: -webkit-box;
flex-direction: column;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
align-items: stretch;
如果您正在使用align-items: stretch;父元素的属性,请height : 100%从子元素中删除它。
TA贡献1820条经验 获得超10个赞
解
使用嵌套的Flex容器。
摆脱百分比高度。摆脱表属性。摆脱vertical-align
。避免绝对定位。只需坚持使用flexbox。
应用于display: flex
flex项目(.item
),使其成为flex容器。这会自动设置align-items: stretch
,告诉child(.item-inner
)扩展父级的完整高度。
重要说明:从弹性项中删除指定的高度,以使此方法起作用。如果孩子指定了一个身高(例如height: 100%
),那么它将忽略align-items: stretch
来自父亲的身高。要使stretch
默认设置起作用,子项的高度必须计算为auto
(完整说明)。
试试这个(不改变HTML):
.container {
display: flex;
flex-direction: column;
height: 20em;
border: 5px solid black
}
.item {
display: flex; /* new; nested flex container */
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
display: flex; /* new; nested flex container */
flex: 1; /* new */
/* height: 100%; <-- remove; unnecessary */
/* width: 100%; <-- remove; unnecessary */
/* display: table; <-- remove; unnecessary */
}
a {
display: flex; /* new; nested flex container */
flex: 1; /* new */
align-items: center; /* new; vertically center text */
background: orange;
/* display: table-cell; <-- remove; unnecessary */
/* vertical-align: middle; <-- remove; unnecessary */
}
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>
说明
我的问题是
.item-inner { height: 100% }
在webkit(Chrome)中无效。
它不起作用,因为您使用的百分比高度不符合规范的传统实现。
百分比
指定百分比高度。百分比是根据生成的框的包含块的高度计算的。如果未明确指定包含块的高度且此元素未绝对定位,则值计算为auto
。auto
高度取决于其他属性的值。
换句话说,对于在流入子项上工作的百分比高度,父项必须具有设置的高度。
在您的代码中,顶级容器具有已定义的高度: .container { height: 20em; }
第三级容器具有定义的高度: .item-inner { height: 100%; }
但在它们之间,二级容器.item
- 没有定义的高度。Webkit将其视为缺失的链接。
.item-inner
告诉Chrome:给我height: 100%
。Chrome会查找父(.item
)以供参考并做出响应:100%的内容是什么?我没有看到任何东西(忽略flex: 1
那里的规则)。因此,它适用height: auto
(内容高度),根据规范。
另一方面,Firefox现在接受父亲的弹性高度作为孩子的百分比高度的参考。IE11和Edge也接受弹性高度。
此外,如果与(任何数值有效(不会),包括)一起使用,Chrome将接受flex-grow
作为适当的父参考。但是,在撰写本文时,此解决方案在Safari中失败。flex-basis
auto
flex-basis: 0
#outer {
display: flex;
flex-direction: column;
height: 300px;
background-color: white;
border: 1px solid red;
}
#middle {
flex-grow: 1;
flex-basis: 1px;
background-color: yellow;
}
#inner {
height: 100%;
background-color: lightgreen;
}
<div id="outer">
<div id="middle">
<div id="inner">
INNER
</div>
</div>
</div>
四解决方案
1.在所有父元素上指定高度
可靠的跨浏览器解决方案是在所有父元素上指定高度。这可以防止缺少链接,基于Webkit的浏览器认为这违反了规范。
需要注意的是min-height
和max-height
是不能接受的。它必须是height
财产。
更多详细信息: 使用CSS height
属性和百分比值
2. CSS相对和绝对定位
适用position: relative
于父母和position: absolute
孩子。
大小的孩子height: 100%
和width: 100%
,或使用污损特性:top: 0
,right: 0
,bottom: 0
,left: 0
。
使用绝对定位时,百分比高度在父级上没有指定高度的情况下工作。
3.删除不必要的HTML容器(推荐)
是否需要两个容器button
?为什么不删除.item
或.item-inner
,或两者兼而有之?尽管button
元素有时会作为柔性容器失效,但它们可以是柔性物品。考虑让button
孩子成为.container
或者.item
,并删除无偿加价。
这是一个例子:
4.嵌套的Flex容器(推荐)
摆脱百分比高度。摆脱表属性。摆脱vertical-align
。避免绝对定位。只需坚持使用flexbox。
应用于display: flex
flex项目(.item
),使其成为flex容器。这会自动设置align-items: stretch
,告诉child(.item-inner
)扩展父级的完整高度。
重要说明:从弹性项中删除指定的高度,以使此方法起作用。如果孩子指定了一个身高(例如height: 100%
),那么它将忽略align-items: stretch
来自父亲的身高。要使stretch
默认设置起作用,子项的高度必须计算为auto
(完整说明)。
试试这个(不改变HTML):
.container {
display: flex;
flex-direction: column;
height: 20em;
border: 5px solid black
}
.item {
display: flex; /* new; nested flex container */
flex: 1;
border-bottom: 1px solid white;
}
.item-inner {
display: flex; /* new; nested flex container */
flex: 1; /* new */
/* height: 100%; <-- remove; unnecessary */
/* width: 100%; <-- remove; unnecessary */
/* display: table; <-- remove; unnecessary */
}
a {
display: flex; /* new; nested flex container */
flex: 1; /* new */
align-items: center; /* new; vertically center text */
background: orange;
/* display: table-cell; <-- remove; unnecessary */
/* vertical-align: middle; <-- remove; unnecessary */
}
<div class="container">
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
<div class="item">
<div class="item-inner">
<a>Button</a>
</div>
</div>
</div>
的jsfiddle
添加回答
举报