grid 是实现三栏等高最直接方案,因其天然支持子项拉伸对齐最高栏;flex 方案需确保父容器高度有效且子项未禁用拉伸;float 和 inline-block 已不推荐。
display: grid 实现三栏等高最直接三栏等高本质是让三列内容区域高度自动对齐到最高那一栏,grid 天然支持。不需要 JS、不需要 hack、不依赖内容顺序。
关键点在于:容器设为 display: grid,用 grid-template-columns 定义三列,子元素默认拉伸填满行高。
grid-template-columns(比如 1fr 2fr 1fr 或 300px 1fr 300px)height 或 min-height,也不用 align-items —— 默认就是 stretch
.layout {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 20px;
}
.layout > div {
background: #f5f5f5;
padding: 16px;
}
display: flex 实现三栏等高要注意容器高度来源flex 方案可行,但容易失效——因为 flex 子项的等高依赖于父容器有明确高度或能被内容撑开。若父容器高度为 auto 且子项本身高度不一致,可能看起来“不等高”。
height: 0、min-height: 0 或 overflow: hidden 等压制高度的设置
align-items: stretch,无需额外写flex: 0 0 auto 或 align-self: flex-start,这会主动放弃拉伸body 直接子元素,记得检查 body 是否有 display: flex 且没设 flex-direction: column,否则子项不会按行布局.layout {
display: flex;
gap: 20px;
}
.layout > div {
flex: 1; / 等分宽度,同时保持拉伸 /
background: #f5f5f5;
padding: 16px;
}
float 或 inline-block 搞三栏等高这两种老方案在现代布局中已无必要,强行实现等高成本高、副作用多:
float 必须清除浮动,且等高需靠 padding-bottom: 9999px + margin-bottom: -9999px 这类 hack,响应式下极易错位inline-block 受制于行内元素默认基线对齐,要等高得加 vertical-align: top,但无法解决内容高度差异带来的容器高度塌陷问题gap,间距靠 margin 易产生首尾多余空白flex 和 grid,但若真要兼容 IE9 及更早,应整体重构交互逻辑,而非硬套等高视觉很多人以为“等高”是要让文字行数一致,其实不是。浏览器渲染的是元素盒模型高度,只要 height 或 min-height 一致,或通过 grid/flex 拉伸,背景、边框、阴影就会对齐。文字多的栏会自动换行,文字少的栏留白即可。
min-height
height: 100%,除非父容器有明确高度——否则 100% 会计算为 0实际项目里,grid 是首选;只有需要支持 Safari 9–10(2015 年旧版)且不能用 autoprefixer 补全时,才退回到 flex 并仔细检查父容器的高度上下文。