完整教程:如何优雅的布局,height: 100% 的使用和 flex-grow: 1 的 min-height 陷阱

news/2025/10/2 18:47:10/文章来源:https://www.cnblogs.com/lxjshuju/p/19123866

一、层层嵌套的布局

假设我们有这样一段代码如下,在一个层层前套的布局中,有一个 header(A),固定高度44px,内容区域有很长的内容(d),需要可以滚动。


在上面的例子中

  1. 我们使用 flex 的 column 布局
  2. 内部前套的元素宽高都设置为 width:100%,height: 100%
  3. 给滚动元素 d 设置 overflow: auto
  4. 给 d 的父级设置 overflow: hidden;

不瞒你说,我经常这样写,但是实际效果却不尽人意,下面区域有部分内容展示不全,如下图所示:

1.1 想清楚再用 100%

我们发现从黄色边框【也就是B】元素开始就有部分内容不展示了。

想要解决这个问题,其实很简单,只需要给 B 增加 overflow: hidden 就行,

增加了 overflow: hidden,把超出 B 内容区域的东西都隐藏了,看起来就展示正确了。

1.2 布局要有逻辑

但是我们仔细看下代码,有些地方是不符合“逻辑的”,我们要深刻的理解一下 height: 100% 的意义,想清楚了再用 100%, 不要随便写。布局也要写的有逻辑,改起来才能有思路。

前提是我们设置了 box-sizing: border-box !important; 所以 100% 代表的是内容区域,不包含padding 和 border

首先  

  1. .outer-container 固定宽高 100vw/100vh 没有任何问题
  2. box 宽高 100% / 100% 也没有问题,因为 outer-container 里面只有一个元素

  3. A 固定高度 44 px ,且不可压缩 flex-shrink: 0

  4. 重点来了,到 B 元素了,B元素的高度显然不是100% ,而是 100% - 44px( A的高度)

所以在这个例子的布局中,从 B 元素开始我们的高度设置就出了问题!!!

我们可以给 B 设置 height: calc(100% - 44px),但是这样的问题是,一旦 A 的高度变化了,B 的高度也得随之改变,很麻烦,也容易忘。

二、flex-grow: 1 的陷阱

所以鉴于 B 的父元素 box 使用了 flex 布局,我们自然能想到给 B 使用 flex-grow: 1,A 元素固定高度的情况下,让 B 的高度撑开剩余内容,得到下面的代码:


但是这样还是有问题,我们发现,内层元素 d 居然滚动不了了,一看 B 元素的高度竟是 8834px,这显然不对。如果 B 的高度是 8834px,那么会导致 c  和 d 的高度都是 8834px, 自然就无法滚动展示。

2.1 别随便用 overflow: hidden

有一个解决办法,就是给 B 设置 overflow: hidden;

没错,又是这个 overflow:hidden,虽然他解决我们的问题,但是仔细一想“逻辑”还是不对的,而且可能会导致别的问题。

比如,假设我们 B 里面有一个超出区域的绝对定位的 气泡,增加 overflow:hidden 会把这个气泡裁剪,这显然不是我们想要的,如下图:


2.2 flex 布局的 min-height 陷阱

现在我们来说一下终极解决方案

给 flex-grow: 1 的元素增加 min-height: 0;


上面这段代码,可以满足我们所有的需求。

这里有个知识点,flex 布局的项目,也就是子元素的 min-height 默认是 auto!!

所以我们手动设置 min-height: 0 就可以解决很多内部元素无法滚动或者展示不全的问题。牢记这个小技巧,可以大大提高我们的开发效率。

三、知识总结

3.1 flex-grow: 1 和 min-height: auto

在 flex 容器里面,子元素设置 flex:grow: 1 之后,会去分配剩余空间

但是 css 规范有一个默认的行为,flex-item 在交叉轴(比如 column 布局中的垂直方向)默认最小尺寸是 min-height: auto (或者min-width: auto);

这意味着

  1. 当你给某个元素 flex-grow: 1, 它理论上应该被压缩、撑开、来分配剩余空间
  2. 但如果它的内容本身很大(比如内容有一段长文字或者子元素),浏览器会认为它至少要容纳这些内容,因此会把min-height:算得很大
  3. 结果就是,父容器虽然是100%高度,但子元素因为最小高度的限制、不能被压缩到期望的高度,导致出现,子元素内容撑破容器,滚动条不出来、兄弟元素展示不全等问题。

3.2  overflow 的规范

为什么 overflow:hidden 可以解决问题?

在 flex 布局中,默认的 min-height: auto 表示:元素的最小高度至少等于其内容高度,这会阻止元素被压缩。

当你给这个元素设置 overflow:hidden 时,浏览器规范要求:

如果一个设置了非 visible 的overflow ,那么他的 min-height/min-width 会被强制当作0

所以 overflow: hidden 只是起到了【间接把 min-height: auto 改成了0 的效果】但是却会导致我上面说的那种内容被裁剪的问题。

所以看看 chatgpt 给的对比,还是用 min-height: 0吧

四、结论

flex 布局防止内容展示不全的终极解决方案是,给 flex-grow: 1 的元素,增加 min-height: 0 属性。

好了,看到这里,快去把你所有 flex-grow:1 的元素,且元素内容可能会很多的 dom 都增加一个属性 min-height: 0 吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis缓存架构深度拆解:从PerpetualCache的LRU陷阱到Redis分布式二级缓存防穿透实战 - 详解

MyBatis缓存架构深度拆解:从PerpetualCache的LRU陷阱到Redis分布式二级缓存防穿透实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

2025柔版印刷机厂家 TOP 企业品牌推荐排行榜,塑编袋,编织袋,阀口袋,重包膜,机组式,卫星式,不换版,FFS 重载膜,水泥袋柔版印刷机公司推荐!

在当前包装印刷行业快速发展的背景下,柔版印刷机作为关键生产设备,其市场需求持续增长,但同时行业也面临着诸多亟待解决的问题。一方面,随着下游行业对印刷精度、速度及环保要求的不断提高,部分传统柔版印刷机厂家…

免费北京网站建设济南 制作网站 公司吗

我喜欢回答各种各样的问题,自然也喜欢记录下自己的一些观点和看法。希望给朋友们多一点参考,也欢迎交流探讨。 提问: 自考本科,学的开发语言,问互联网行业求职和发展! 作为一个资深码农,对这样…

做网站公司哪家便宜WordPress的固态链接

行首: Ctrl A 行末:Ctrl E转载于:https://www.cnblogs.com/summer1019/p/11043692.html

蒙古文网站建设工作情况汇报宁晋网站建设代理价格

在当今科技飞速发展的时代,鸿蒙系统以其独特的微内核架构和对人工智能算法的深度融合,正引领着操作系统智能化的新潮流。本文将深入探讨鸿蒙系统的微内核架构是如何与人工智能算法高效协同,从而提升系统性能和智能化水平的。 鸿蒙系统微内核…

西安网站关键词优化虚拟主机网站500错误

文章来源:https://medium.com/voxel51/how-to-cluster-images-6e09bdff7361 2024 年 4 月 10 日 使用 FiftyOne、Scikit-learn和特征嵌入 在 2024 年深度学习的计算密集型环境中,集群一词最常出现在讨论 GPU 集群时--高度优化的矩阵乘法机器的大规模集…

9 30 -

9 30P2194很显然的强连通分量P4168考虑分块,预处理出每种颜色在每个整块中的出现次数,定义 \(p_{l,r}\) 为在第 \(l\) 块到第 \(r\) 块中出现次数最多的颜色 可以发现可以做到 \(O(N \sqrt{N})\)下午vp mx模拟赛 两个…

2025/10/2

A 用时:2h 预期:55pts 实际:35pts 写了超大常熟 \(k\sqrt{R}\) 的做法,没算时间复杂度以为 Sub 2 能过,实际上 T 飞了,直接预处理因数个数就能过。 总结:写完一定要算时间复杂度,不要想当然以为能过。 B 用时:…

网站开发顶岗周记现在做网络推广好做吗

🎈写在前面 🙋‍♂️大家好呀,我是超梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好SQL&am…

Spring 基础核心 - SpringMVC 入门与请求流程

Spring 基础核心 - SpringMVC 入门与请求流程本文是介绍 Spring 技术的第四篇入门级文章,前面已经介绍了 Spring 入门案例、IOC 容本文是介绍 Spring 技术的第四篇入门级文章,前面已经介绍了 Spring 入门案例、IOC 容…

网络平台怎么建立网站吗汕头百度搜索排名优化

张宇、汤家凤、武忠祥、李永乐、杨超、王式安、方浩这些老师都有自己擅长的细分 比如张宇老师,杨超,汤家凤,武忠祥老师的高数讲的很好,李永乐老师是线代的神,王式安、方浩概率论讲的很好,所以对于不同的学…

(数据结构)链表OJ——刷题练习 - 实践

(数据结构)链表OJ——刷题练习 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

重测序数据fastp数据质控及fastQC质量评估

001、fastp -i sample_name_1.fq.gz -o sample_name_qc_1P.fastq.gz -I sample_name_2.fq.gz -O sample_name_qc_2P.fastq.gz --thread 4 -g -q 20 -u 30 -l 150 --overlap_diff_limit 1 --overlap_diff_percent_limit…

网站建设公司南京wordpress 数据库说明

一.递归 (1)汉诺塔问题 当n2时,要将A中最下面盘子上方的盘子放到B上,最下面盘子放到C上,再将B上的盘子通过A放到C即可; 当n3时,要将A中最下面盘子上方的盘子放到B上,最下面盘子放到…

请问怎么做网站惠州网站开发

类的加载顺序 有父子关系的类在加载时先调用父类静态初始化块,静态属性,但不包括静态方法,然后再是,子类静态初始化块,静态属性,但同样不包括静态方法 。 类什么时候被加载/类加载时机: 第一&…

深圳网站建设机构深圳工程建设交易服务中心网站

Java基础教程之多线程 下 🔹本节学习目标1️⃣ 线程的同步与死锁1.1 同步问题的引出2.2 synchronized 同步操作2.3 死锁 2️⃣ 多线程经典案例——生产者与消费者🔍分析sleep()和wait()的区别? 🌾 总结 🔹本节学习目标…

东莞做网站的公司乐山高端网站建设

现在, 电视机 对于每个家庭来说已然不是什么奢侈品,并且已经成为必备的家庭电器之一。其实,国产电视机中也有不少的知名品牌,但是许多消费者对国外的电子技术持有更高的认可度,因此下面小编就来跟大家讲讲sony电视&…

企业网站建设大概费用网站打开速度突然变慢的原因

... 转载于:https://www.cnblogs.com/2008nmj/p/7264769.html

8. Spring AI tools/function-call - 教程

8. Spring AI tools/function-call - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…