display 的作用
每个元素都有一个 display 值,决定它的布局方式。最先接触到的三个值是 block、inline 和 inline-block。下面是三个完全相同的盒子,width、height、padding 和 margin 都一样,只有 display 不同:
block | inline | inline-block | |
|---|---|---|---|
| 从新的一行开始 | 是 | 否 | 否 |
| 默认宽度 | 占满容器 | 适应内容 | 适应内容 |
width 和 height | 生效 | 被忽略 | 生效 |
| 垂直外边距 | 生效 | 被忽略 | 生效 |
| 垂直内边距 | 会推开内容 | 会绘制出来,但不会撑开行距 | 会推开内容 |
| 典型元素 | div、p、h1、ul、section | span、a、strong、em | button、input、img(替换元素的表现就是这样) |
在预览中,块盒子独占一行,宽 120px。行内盒子忽略了宽度和高度,只包住自己的那个词,它的垂直内边距和边框会伸出到行的上方和下方,却不会让这一行变高。行内块盒子留在文字行中,同时保持完整的尺寸。
display: block
块元素占据全部可用宽度,并把后面的内容推到新的一行。把链接变成块元素,就能让整行都可以点击:
.menu a {
display: block; /* the full row is the link */
padding: 10px 16px;
}
块元素可以设置宽度,设置之后 margin: 0 auto 就能让它居中,详见 div 居中页面。
display: inline-block
inline-block 是一个折中方案:它像一个词一样在行中流动,但你可以设置它的尺寸。它适合用在文字中的徽标、按钮和图标上:
一行中的多个 inline-block 盒子之间会有一条小空隙,来自 HTML 中的空白。如果要排一行盒子,在父元素上用 display: flex 是更好的工具。
display: none 与 visibility: hidden
两者都能让元素不可见。区别在于是否保留它的空间:
display: none | visibility: hidden | opacity: 0 | |
|---|---|---|---|
| 占据空间 | 否 | 是 | 是 |
| 可以点击 | 否 | 否 | 是 |
| 屏幕阅读器会读 | 否 | 否 | 是 |
| 可以平滑地做动画 | 否 | 否 | 是 |
HTML 的 hidden 属性通过浏览器自带的样式表实现,效果和 display: none 相同,这意味着任何给该元素设置 display 的 CSS 规则(例如 .card { display: flex; })都会覆盖它,元素又会显示出来。如果你被这个问题坑过,就加上 [hidden] { display: none !important; }。
如果要在视觉上隐藏某些内容,但仍让屏幕阅读器读到(比如图标按钮的标签),请使用“视觉隐藏”类,而不是 display: none。
display: flex 和 display: grid
这两个值会把元素变成其子元素的布局容器:
display: flex把子元素排成一行或一列,并能控制对齐和间距。见 flexbox。display: grid同时按行和列放置子元素。
容器本身仍然是块元素。inline-flex 和 inline-grid 对子元素的作用相同,但会让容器像 inline-block 一样在行内流动。
其他取值
| 值 | 作用 |
|---|---|
flow-root | 一个能包含内部浮动、并阻止子元素外边距溢出的块元素;现代版的“清除浮动” |
contents | 元素自身的盒子消失,它的子元素就像是父元素的子元素一样。不要用在按钮、列表和表格上:有些浏览器会让屏幕阅读器丢失元素的语义 |
list-item | 带列表标记的块元素,是 li 的默认值 |
table、table-row、table-cell | 在非表格元素上使用表格布局 |
inline-flex、inline-grid | 位于行内的 flex 或 grid 容器 |
常见错误
- 给
span或a设置width或height。 行内元素会忽略它们。请用inline-block或block。 - 给行内元素设置垂直外边距。 同样会被忽略,解决方法相同。
- 用
display: none隐藏给屏幕阅读器读的文字。 它对屏幕阅读器也一样隐藏了。 - 以为
display: none的父元素里的子元素能显示出来。 隐藏的父元素里面什么都不会渲染。 display规则覆盖了hidden属性。 CSS 规则会胜出。- 想给
display做动画。 设置display: none会让元素立刻隐藏,没有淡出效果;请给opacity做动画,在结束时再切换display(或visibility)。
常见问题
block、inline 和 inline-block 有什么区别?
block 元素从新的一行开始,并占满可用宽度。inline 元素在文字中流动,会忽略 width、height 和垂直方向的外边距。inline-block 像 inline 一样在文字中流动,但又像块元素一样接受宽度、高度、内边距和外边距。
display: none 有什么作用?
它把元素从页面中完全移除:不占空间、不被渲染,屏幕阅读器也读不到。它的子元素会一起被隐藏,而且无法用子元素自己的 display 值显示出来。
display: none 和 visibility: hidden 有什么区别?
display: none 会移除元素及其占据的空间。visibility: hidden 让元素不可见,但在布局中保留它的空间,所以其他内容不会移动。
div 默认是块元素还是行内元素?
块元素。div、p、标题、ul、section 和 form 默认是块元素;span、a、strong、em、img、input 和 button 是行内元素或行内块元素。
为什么 inline-block 元素之间有空隙?
HTML 中标签之间的空白会被渲染成一个空格,就像单词之间的空格一样。改为在父元素上使用 display: flex 加 gap,或者删掉这些空白。