display本质是控制“外部行为”和“内部布局”两个维度,如flex即block flex:对外块级独占行,对内弹性排列;一维用flex,二维用grid;inline无效宽高,inline-block有空白间隙,none彻底移除元素。
别再死记硬背 block、inline 这些值了——它们其实是 display: 的简写。比如 display: flex 真实含义是 display: block flex:对外当块级盒子(独占一行),对内建弹性上下文(子元素按 flex 规则排列)。理解这点,就能预判元素在文档流中怎么“站位”,以及它的子元素怎么“排队”。
block → block flow:外部块级 + 内部流式(默认排版)inline-block → 实际是 inline block:对外像文字一样并排,对内可设宽高、能装子元素grid → block grid:整块占行,但内部是二维网格inline-grid → inline grid:不换行,还能用 grid-template-columns 控制列光看定义容易翻车,实际开发中这几个值的行为反直觉最多:
inline:设置 width、height、margin-top、margin-bottom 全无效;padding-top/padding-bottom 虽然视觉上“有高度”,但不会推开下方元素——它只是“盖上去”inline-block:元素间会因 HTML 换行/空格产生约 4px 的空白间隙;解决方法不是删空格,而是给父容器设 font-size: 0,再给子元素重置字体大小none:元素彻底从渲染树移除,不占空间、不响应事件、不触发重排;和 visibility: hidden(仍占位)、opacity: 0(仍可点击)有本质区别
一句话判断:一维排布用 flex,二维结构用 grid。别强行用 flex 做多行等高卡片网格——它本质是单轴容器,多行时 align-items 无法跨行对齐,而 grid 天然支持行列线、区域命名和响应式轨道定义。
display: flex:导航栏、按钮组、表单控件横向对齐、内容居中(justify-content: center; align-items: center)display: grid:仪表盘、响应式图文卡片墙、带侧边栏的页面主结构(grid-template-areas 直观定义布局)display: inline-flex:它虽不换行,但若父容器是 inline 或文本流环境,可能意外破坏基线对齐,建议优先用 flex + margin 控制外边距这些不是“过时”,而是解决特定问题的精准工具:
display: contents:父元素“消失”,子元素直接挂到上层容器里参与布局——适合简化嵌套、避免 Flex/Grid 中多余的包裹层,但注意:它会剥离父元素的样式(如 background、border)且影响可访问性(ARIA 树断裂)display: flow-root:创建 BFC,专治浮动塌陷和外边距合并;比 overflow: hidden 更语义化,且不意外裁剪溢出内容display: 
table-cell:旧项目兼容 IE8 时仍需用它模拟垂直居中;现代开发中基本被 flex 取代,但遇到 legacy 表格逻辑时得懂它怎么响应 vertical-align
真正难的不是记住所有值,而是看到一个布局需求时,能立刻反应出:“这个元素对外要怎么站?对内要怎么管孩子?”——把 display 当成声明式接口,而不是魔法开关。