Menu

CSS display:block、inline、inline-block、none 和 flex

display 属性决定元素如何参与布局。通过并排对比、实际测量的盒子,学习 block、inline 和 inline-block,display none 与 visibility hidden 的区别,以及 flex、grid、flow-root 和 contents 各自的用途。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

display 的作用

每个元素都有一个 display 值,决定它的布局方式。最先接触到的三个值是 block、inline 和 inline-block。下面是三个完全相同的盒子,width、height、padding 和 margin 都一样,只有 display 不同:

blockinlineinline-block
从新的一行开始是否否
默认宽度占满容器适应内容适应内容
width 和 height生效被忽略生效
垂直外边距生效被忽略生效
垂直内边距会推开内容会绘制出来,但不会撑开行距会推开内容
典型元素div、p、h1、ul、sectionspan、a、strong、embutton、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: nonevisibility: hiddenopacity: 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,或者删掉这些空白。

Coddy 编程语言插图

和 Coddy 一起学编程

开始