display: grid 三行代码可实现四区布局,关键在于用 grid-template-areas 命名区域、minmax(0, 1fr) 防撑爆、html/body 设 height: 100% 确保高度上下文。

用 display: grid 三行代码搞定四区布局
不用浮动、不靠绝对定位,display: grid 是目前最直接可控的方式。关键不是“怎么分”,而是“怎么让各区域不打架又自适应”。
常见错误是给 header、aside 等加固定高度或 position: absolute,结果内容一多就溢出或遮挡。
- 定义容器为
grid,用grid-template-areas命名区域,语义清晰且易维护 - 用
minmax(0, 1fr)替代单纯1fr,防止内容撑爆侧边栏(尤其长文本或未设overflow的aside) - 必须给
html和body设height: 100%,否则100vh在某些安卓 WebView 下会失效
body {
margin: 0;
height: 100vh;
}
.layout {
display: grid;
grid-template-areas:
"header header"
"aside main"
"footer footer";
grid-template-rows: auto 1fr auto;
grid-template-columns: 240px 1fr;
height: 100%;
}
侧边栏宽度固定但内容超长时滚动失效
很多人设了 width: 240px 就以为万事大吉,结果里面放个长列表,滚不动——根本原因是父容器没限制高度,子元素无法触发 overflow。
-
aside必须有明确高度上下文,比如父级grid给了1fr行高,它才能用height: 100% -
overflow-y: auto要加在aside内部的直接子容器上(比如一个<div class="scroll-area">),不能只加在aside自身 - 避免在
aside上设flex或display: grid后又忘设align-items: flex-start,否则内容会被居中挤到看不见
position: sticky 头部/底部在滚动时消失
sticky 不是万能胶,它依赖最近的「有约束的滚动容器」。默认情况下,整个页面滚动,header 只要脱离视口就会隐藏,根本不会吸顶。
立即学习“前端免费学习笔记(深入)”;
- 必须确保
header的父容器没有overflow: hidden或transform(哪怕只是transform: translateZ(0)) -
top: 0才生效,top: 1px或负值会导致吸顶失败;iOS Safari 对sticky支持较弱,建议加-webkit-sticky - 如果用了
grid布局,header所在的 grid cell 不能是auto行高,得是min-content或固定值,否则粘不住
兼容老浏览器时别硬刚 grid
IE11 完全不支持 grid-template-areas,但可以用 display: -ms-grid 模拟,代价是写两套规则、调试成本翻倍。更实际的做法是降级为 flex + calc()。
- 用
@supports (display: grid)包裹现代写法,老浏览器自动 fallback 到flex方案 -
flex-direction: column做垂直分区时,main区域必须设flex: 1,否则不会占满剩余空间 - 不要试图用
float实现四区——footer脱离文档流后,经常卡在main中间,修起来比重写还慢
iframe 或第三方组件,它偷偷改了 body 的 margin 或 overflow,导致整个 grid 高度崩掉。遇到这种情况,先关掉所有第三方脚本,再逐个开。










