5月28日 03:15

CSS display 有哪些值?面试必考的 9 个属性详解

CSS display 控制元素在页面上的渲染方式,面试常考的就这几个:

none — 元素不渲染、不占空间,从布局树中移除。和 visibility: hidden 的关键区别:后者保留空间只隐藏视觉效果。频繁切换显隐优先用 visibility,因为只触发重绘不触发回流。

block — 独占一行,可设宽高。<div><p><h1> 默认就是 block。

inline — 不换行,宽高由内容撑开,垂直方向的 margin/padding 不生效。<span><a> 默认 inline。

inline-block — 对外像 inline 不换行,对内像 block 能设宽高。做横排按钮、导航菜单首选。

flex — 弹性布局容器,子元素沿主轴排列。居中、等分空间、对齐一行搞定,一维布局主力。

grid — 网格布局容器,同时控制行和列。二维布局(如页面骨架、卡片网格)用 grid 更直观。

table 系列(table / table-row / table-cell)— 不用 <table> 标签也能模拟表格布局,现在主要用来做垂直居中(table-cell + vertical-align)。

contents — 元素本身不生成盒子,子元素直接参与父级布局。做组件封装时有用,不想让容器标签影响布局。

flow-root — 创建新的 BFC,等效于 clearfix 的正经方案。浮动清除不再需要伪元素 hack。

补充一点:现代 CSS 支持 display 双值语法,比如 inline flex 等于 inline-flex,第一个值控制外部显示类型,第二个值控制内部。目前浏览器支持度还不错,面试提一句是加分项。

追问

inline 元素设置 width/height 为什么不生效?

CSS 规范规定非替换 inline 元素的盒模型由内容决定,宽高属性不适用。想设宽高就换成 inline-blockblock。但 <img><input> 这类替换元素虽然是 inline,却可以设宽高——因为它们有内在尺寸。

flex 和 grid 怎么选?

一维用 flex,二维用 grid。实际项目经常混搭:外层 grid 做页面骨架,内层 flex 做组件对齐。别纠结"哪个更好",它们解决的不是同一个问题。

display: none、visibility: hidden、opacity: 0 有什么区别?

display: nonevisibility: hiddenopacity: 0
占空间不占
触发回流
触发重绘
子元素可覆盖是(设 visible)
响应事件
可访问性不可见不可见可见

频繁切换用 visibility(只重绘),需要完全移除用 display: none,做淡入淡出动画用 opacity

display: contents 在实际项目里有什么用?

做组件封装时,容器 div 只是想传 props,不想让它参与布局。比如一个 <Card> 组件渲染成 <div class="card"><slot/></div>,但外层用 grid 布局时不希望 .card 这层 div 打断网格结构,这时候给 .carddisplay: contents 就行。注意:contents 会导致元素本身的样式和可访问性语义丢失,屏幕阅读器可能跳过它。

标签:CSS前端