height: 100% 无效是因为父容器高度为 auto,无计算基准;需逐级设置 height: 100% 或改用 min-height: 100vh/100dvh,或通过 absolute、flex: 1、grid 1fr 等替代方案实现撑满。

父容器没设高度时 height: 100% 为什么无效
因为 height: 100% 是相对于**父元素的计算后高度**,而块级元素(如
)默认高度由内容撑开,父容器若没显式设
height 或 min-height,其计算高度就是 auto,此时子元素的 100% 就没参照物,退化为 0。
常见场景:想让一个 填满整个视口,但只写 height: 100% 不起作用。
- 必须确保从
html和body开始逐级设高:html, body { height: 100%; margin: 0; } .container { height: 100%; } - 更稳妥的做法是用
min-height: 100vh,vh单位不依赖父容器高度,直接基于视口 - 注意:ios safari 对
100vh的处理有 bug(地址栏收放时高度会错),必要时改用100dvh(支持现代浏览器)
position: absolute 撑满的边界条件
绝对定位元素通过四边偏移可以强制撑满父容器,但前提是父容器得是「定位上下文」——即 position 值不能是 Static(默认值)。
- 父容器需设
position: relative、absolute或fixed - 子元素设:
.full-cover { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } - 如果父容器本身没高度(比如空 ),即使绝对定位也看不见——它仍需要一个有尺寸的包含块
- 慎用在 Flex/Grid 容器内:绝对定位会脱离布局流,可能破坏原有排列逻辑
Flex 布局下让子项撑满剩余空间
当父容器是
display: flex,且已有其他子元素时,单靠flex: 1就能让某子项占满剩余空间,比手动算高度更健壮。立即学习“前端免费学习笔记(深入)”;
- 父容器需设
flex-direction: column(垂直布局)或保持默认row(水平) - 目标子项加:
flex: 1;—— 等价于
flex-grow: 1; flex-shrink: 1; flex-basis: 0 - 若只想撑高不撑宽,用
flex: 1 1 auto并配合width: 100%;反之亦然 - 注意:如果兄弟元素设置了固定高度(如
height: 60px),flex: 1才能正确分配剩余空间;否则所有子项都flex: 1会均分
Grid 布局中用
1fr实现自适应撑满Grid 天然适合“划分区域+自动填充”,比百分比或
vh更可控,尤其适合多栏或头部/主体/底部结构。- 父容器设
display: grid和明确的轨道定义,例如:.layout { display: grid; grid-template-rows: 60px 1fr 40px; height: 100vh; } -
1fr表示“剩余可用空间的一份”,多个1fr会等分;2fr则占两份 - 不用给子元素单独设高,Grid 自动按轨道分配尺寸
- 兼容性注意:IE11 支持 Grid 但语法不同(需用
-ms-grid),如需兼容得降级处理
实际项目里最常踩的坑不是写法不对,而是忘了检查父链上任意一层是否隐式成了
height: auto,或者在移动端漏掉了viewportmeta 标签导致vh计算失准。