h-full 失效是因为父容器无显式高度,需配合 min-h-[100dvh]、flex-1 和 overflow-y-auto 实现稳定全高布局,避免依赖 h-screen 或单纯 h-full。

h-full 为什么经常失效?
h-full 编译为 height: 100%,而 CSS 中这个值只在父容器有**显式高度**(如 h-screen、min-h-[500px]、h-96)时才生效。父容器若为默认的 height: auto,h-full 就完全不工作——元素高度塌陷为 0 或仅由内容撑开。
常见错误现象:
- 给
<main></main>加了h-full,但外层<div> 没设高度,结果主区域看不见 <li>在 Flex 布局里对子项用 <code>h-full,却忘了父级是否加了min-h-0或h-full - 服务端渲染(如 Next.js)中,
h-screen可能导致首屏布局跳动,尤其在 Safari iOS 上 - 别混用
h-full和h-screen:前者依赖父高,后者依赖视口,逻辑冲突 - 旧版 Tailwind 不支持
dvh,需手动在tailwind.config.js中扩展:theme.extend.spacing['100dvh'] = '100dvh',再用h-[100dvh] -
min-h-[100dvh]比h-[100dvh]更稳妥,因部分安卓 WebView 对dvh支持不稳定
全高布局该用 min-h-screen 还是 h-screen?
h-screen 基于初始视口高度计算,不响应地址栏收起/展开(iOS Safari 中会跳变),也不兼容 SSR 场景下的首屏渲染;min-h-screen 更安全,它提供最小保障,内容少时不会留白过长,内容多时仍可自然扩展。
但真正跨设备稳定的写法是:min-h-[100dvh](Tailwind v3.3+ 支持)。dvh 是动态视口单位,能实时响应移动端地址栏变化。注意:
Flex 布局中主区域怎么自适应高度?
在 flex flex-col 容器里,别给主区域写 h-full——它既不健壮又易被截断。正确做法是用 flex-1,它不依赖父级显式高度,只按 Flex 规则分配剩余空间。
典型结构:
<div class="min-h-[100dvh] flex flex-col"> <header class="h-16"></header><main class="flex-1 overflow-y-auto"></main><footer class="h-12"></footer> </div>
关键点:
-
min-h-[100dvh]提供高度上下文 -
flex flex-col启用垂直弹性流 -
flex-1让<main></main>占满剩余空间,且自动适配滚动行为 - 必须加
overflow-y-auto,否则内容超长时会被裁剪
两栏布局(侧边栏 + 主内容)的高度怎么控制?
左侧固定宽、右侧需自适应高度并可滚动时,不能只靠 h-full。必须同时满足三个条件:
- 父容器设
min-h-[100dvh](提供高度上下文) - 左侧用
flex-[0_0_240px]锁死宽度(flex-none在嵌套 Flex 中不可靠) - 右侧加
flex-1 min-w-0 overflow-y-auto(min-w-0防止长文本或 URL 导致横向溢出)
响应式收起侧栏时,别直接用 hidden——它破坏可访问性且触发重排。推荐用:sm:flex-[0_0_0] sm:opacity-0 sm:translate-x-[-100%] transition-all,配合主内容区保持 flex-1 自动占满全宽。
最常被忽略的一点:所有高度相关的自适应,都建立在「父容器有明确高度来源 + 布局上下文正确(Flex/Grid) + 滚动行为显式声明」这三者之上。漏掉任何一个,h-full 就只是个无效的字符串。











