李恒道 发表于 2021-1-13 01:09:03

关于ipad的flex-grow:1属性失效问题

# w3c手册

这里参考的是

[**10.5 Content height: the `height` property**](http://www.w3.org/TR/CSS22/visudet.html#the-height-property)

**percentage**
Specifies a percentage height. The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly and this element is not absolutely positioned, the value computes to `auto`.

**auto**
The height depends on the values of other properties.

**百分比**

如果指定高度百分比。则百分比是根据生成的框的包含块的高度计算的。如果未明确指定包含块的高度,并且此元素未绝对定位,则该值将计算为“auto”。

**自动**

高度取决于其他属性的值。

我们flex-grow无法生效因为这个问题

# 问题推演

警告:这里我只是简单对着大佬的博客进行了一个梳理和学习,实际的内部机制可能更为复杂!

假设现在有顶级,父级,子级

如果要使上级的百分比高度流入下级,那父级根据w3c规定必须具有一个设定的高度

在第三级有固定高度height:100%,第一级也具有固定的高度

但是由于第二级设定的是 flex-grow:1

第二级没有设定固定的高度,导致webkit第二级的高度对于第三级是缺失的

早期的Chorme和Firefox都有类似的反馈

但是现在根据更新Firefox和Chorme都已经接受了以父级的弹性高度作为子级的百分比高度作为参考

# 解决方案

在flex-grow:1加上flex:1 1 0

主要问题的解决方案在于flex-basis上

当flex-basis为auto的情况下,使用弹性高度的元素的高度根据其内容高度来决定,flex-grow分配剩余的空间,但是这是一个伪分配,flex-grow是一个最小的高度

由于是最小的高度,所以100%被直接归零了,但是我们在内部书写文字依然会撑开一点

当flex-basis为0的情况下,会将剩余空间给弹性高度的元素,来增加高度

# 问题来源

这里的问题来源我认为是苹果完全遵守W3C规则导致子元素无法获取弹性高度的父元素高度的问题。

相信随着逐步的改进,会修复这个问题(可能这是我的问题?)

# 参考链接

https://ruirui.me/2018/12/07/flex-grow-child-not-filling-height-of-parent/

https://stackoverflow.com/questions/33636796/chrome-safari-not-filling-100-height-of-flex-parent
页: [1]
查看完整版本: 关于ipad的flex-grow:1属性失效问题