block、inline、inline-block、none 有什么区别?
简化版
block 独占一行,可设置宽高;inline 不独占一行,宽高通常不生效;inline-block 像行内元素一样排列,又能设置宽高;display:none 会让元素不参与布局和渲染。
详细版
display 决定元素生成什么类型的盒子。
常见差别:
block:从新行开始,默认占满父容器宽度。inline:跟文本流在一行内排列,宽高不按普通块盒生效。inline-block:在行内排列,但可以设置宽高、内外边距。none:不生成盒子,页面布局中也不占位置。
面试追问常围绕“为什么 span 设置宽高没用”“inline-block 为什么有间隙”“隐藏元素是否可访问”展开。
完整版教学
一、display 决定元素参与哪种格式化上下文
HTML 元素默认有不同显示类型。
例如 div 默认是块级,span 默认是行内。
CSS 的 display 可以改变元素生成的盒子类型,从而影响布局、宽高、换行和相邻元素关系。
.box {
display: block;
}
.tag {
display: inline-block;
}
一个元素并不是因为标签名永远块级或行内。
标签只是浏览器默认样式,最终行为由计算后的 display 决定。
二、block:独占一行,可控尺寸
块级盒子会在普通文档流中独占一行。
默认宽度通常填满包含块,高度由内容撑开。
它可以设置 width、height、margin、padding。
.panel {
display: block;
width: 300px;
height: 120px;
}
如果父容器宽 800px,一个没有设置宽度的块盒通常使用可用宽度,也就是接近 800px。
这就是为什么多个 div 默认会上下排列。
页面主结构、段落、区块容器常使用块级布局。
三、inline:跟文字在一行,尺寸由内容决定
行内盒子参与行内格式化,像文字一样从左到右排布。
它不会强制换行,宽高由内容和字体度量决定。
直接设置 width、height 通常不会像块盒那样生效。
span {
display: inline;
width: 200px; /* 通常不按预期生效 */
height: 80px; /* 通常不按预期生效 */
}
行内元素的左右 padding/margin 比较直观。
上下方向的表现会受行盒、行高和文本基线影响,不适合拿来搭大型盒布局。
所以需要控制尺寸时,经常会把它改成 inline-block 或 block。
四、inline-block:行内排列和块级尺寸的折中
inline-block 可以和文本或其他行内盒子排在同一行。
同时它又能设置宽高,常用于按钮、标签、徽章等小组件。
它的典型问题是元素之间可能出现空白间隙。
<span class="item">A</span>
<span class="item">B</span>
.item {
display: inline-block;
width: 100px;
}
如果两个 span 之间源码里有换行或空格,页面上可能出现约 4px 左右的间隙。
这不是 margin,而是 HTML 空白字符参与了行内排版。
现代布局更推荐 Flex/Grid 处理横向排列。
五、display:none 和其他隐藏方式不同
display:none 会让元素不生成盒子。
它不占空间,不参与布局,通常也不会被屏幕阅读器读取。
这和 visibility:hidden、opacity:0 都不同。
| 写法 | 是否占位 | 是否可点击 | 是否参与可访问树 |
|---|---|---|---|
display:none | 否 | 否 | 通常否 |
visibility:hidden | 是 | 否 | 通常否 |
opacity:0 | 是 | 可能是 | 可能是 |
| 视觉隐藏类 | 否或极小 | 通常否 | 可以保留 |
这里和站内“隐藏元素”题有交叉,但本题重点放在 display 的盒生成语义。
面试里要主动说明 none 是布局层面的消失。
六、现代 display 还包括 flex 和 grid
display 不只这四个值。
display:flex 会让元素成为弹性容器,子项进入 flex formatting context。
display:grid 会让元素成为网格容器,子项按二维网格布局。
.nav {
display: flex;
gap: 12px;
}
.gallery {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
流程可以理解为:
display 决定父盒类型
-> 父盒建立布局规则
-> 子元素按该规则排布
所以 display 是布局入口属性,不只是控制“显示不显示”。
记忆钩子:
block管大区块,inline管文字流,inline-block管小组件,none让盒子不生成。
七、常见误区与追问
- 误区:行内元素不能设置 padding。 行内元素可以有 padding,但上下方向对行高和布局的影响容易不符合直觉。
- 误区:
inline-block间隙是浏览器 bug。 多数来自源码空白字符参与行内排版,不是 bug。 - 误区:
display:none只是透明。 它不生成盒子,不占布局空间,也不同于opacity:0。 - 追问:为什么
span设置宽高不生效?span默认是行内盒,宽高不按块级盒模型参与布局。 - 追问:横向排列按钮更推荐什么? 多数现代场景推荐 Flex,因为间距、对齐和换行控制更稳定。
- 追问:
display会继承吗? 通常不会继承,每个元素有自己的显示类型,子元素是否进入某种布局取决于父容器规则。
八、加强记忆
回答 display 时按“是否独占一行、能否设置宽高、是否生成盒子”三条线讲。block 独占且尺寸可控,inline 随文字流,inline-block 兼具行内排列和宽高控制,none 直接不生成盒子;再补一句现代布局用 flex/grid,答案就完整了。