如何搭配flex-1和height:0使用

You, web development
Back

相信大家都有使用过 flex-1 来自动撑满父容器的一个经历,如下

但是经常会遇到一个意料外的行为是,当子元素高度超过剩余的高度,那么父元素的高度也会被撑开,并且挤压 .header 的空间,如下

我们通常是增加 overflow 属性来修复这个行为,如下

但当使用 overflow ,其滚动也就不是使用 body 进行滚动了。但我们即想使用 body 滚动又想限制元素的高度怎么办?可以使用一个看起来很魔法 🪄 的 trick,将 overfow 替换为 min-height: 0 即可,如下可以看到当子元素 .content 高度超过父元素 .main 时使用 body 滚动(左一)。未超过父元素时,父元素 .main 高度为剩余高度(右一)。均符合预期~

顺带一提,父元素使用 overflow 也会使子元素的 position: sticky; 没有粘滞效果。
所以在绝大部分情况下在 flex 布局下推荐使用 width:0height: 0 限制元素的宽度和高度

原理: flex: 1 等同于 flex: 1 1 0,两者都是以下的简写等价物。 flex-grow。1 flex-shrink: 1 flex-base: 0 flex-base: 0 = 高度: 0 在这种情况下。 如果这个 flex-basis / height 规则本身,那么你就会有你预期的行为。该元素将有 0 的高度。 然而,在自由空间被其他 flex 属性分配之前,这些属性只设定了一个 flex 项目的初始主要尺寸。 使用 flex-grow: 1,在考虑了 flex-base / height 之后,.main 将消耗该列的所有可用空间。

© liaoliao666.