根本原因是html和body未设height: 100%,导致flex容器的height: 100%无法计算;必须同时设置html, body { height: 100%; },且避免中间父元素使用inline、table-cell或float等破坏包含块的行为。

html 和 body 没设 height: 100% 是根本原因
Flex 容器写 height: 100% 却撑不开 body,不是 Flex 有问题,而是浏览器根本算不出“100%”对应多少像素——html 或 body 的 computed height 是 auto,所以 100% × 0px = 0px。
常见错误写法:body { height: 100%; } 单独存在,没用。因为 body 的 100% 是相对于 html 的,而 html 默认高度是 auto,结果还是 0px。
- 必须同时写:
html, body { margin: 0; padding: 0; height: 100%; } - 某些 CSS reset(如 Normalize.css)会悄悄重置
html或body的height,得用开发者工具「Computed」面板确认它们的height确实是像素值,不是auto - 如果项目用了
min-height: 100vh替代,它不依赖上层高度链,更可靠;但注意旧版 Safari 对min-height: fit-content支持差,别混用
父容器用了 display: inline / float / table-cell 就失效
即使 html 和 body 都设了 height: 100%,中间某层父元素用了 display: inline、display: table-cell 或 float,也会让包含块(containing block)失效,导致子元素的百分比高度跳过它往上找,最终回退到视口或直接变成 auto。
-
display: inline元素不能作为有效包含块,子元素的height: 100%会被忽略 -
position: absolute或fixed的父容器只写了top: 0; bottom: 0,部分旧版 Firefox 会误判为不可拉伸,显式加height: 100%更稳 - 调试时可用
outline: 1px solid red临时查看各层真实尺寸范围,快速定位哪一层“断掉了”高度链
Flex 子项写了 height / min-height 就关掉了 stretch
很多人以为给子项写 height: 100% 能让它填满父容器,其实这反而会关闭 align-items: stretch 行为——只要子元素显式声明了 height、min-height 或 max-height(哪怕只是 min-height: 0),浏览器就放弃拉伸逻辑,严格按你写的值渲染。
- 删除子项的
height和min-height后立刻等高?说明就是它们在干扰 -
flex-direction: column时,align-items: stretch控的是子项宽度,不是高度;想撑高得靠flex: 1或justify-content - 图片、iframe 等替换元素自带固有尺寸,即使没写
height也可能抑制拉伸;可加height: 100%; min-height: 0;强制参与
flex: 1 比 height: 100% 更适合占满剩余空间
当目标是让 Flex 容器占满父容器剩余高度(比如侧边栏 + 主内容区),flex: 1 是更可靠的选择。它不依赖父级是否定义了像素高度,而是基于 flex 布局的剩余空间分配机制工作;而 height: 100% 是纯 CSS 百分比计算,一旦链路中断就归零。
- 外层容器需是 flex 容器(如
display: flex; flex-direction: column;),内层想撑满的部分加flex: 1 - 避免在内层再写
height: 100%,它会破坏自适应能力,尤其当内容变多时容易溢出或截断 - 滚动区域(如列表容器)若用了
flex: 1却不收缩,通常是因为浏览器给了默认min-height;加min-height: 0或overflow: hidden可修复
position、overflow、align-items,或者某一层父元素悄悄用了 display: inline —— 它们不会报错,但会让高度链无声断裂。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











