CSS: CSS 显示模式

CSS 中每个元素都有默认的显示方式。理解不同的显示模式(display),是掌握布局的关键。

display 属性速查表

作用 常见元素
block 块级元素,独占一行,可设宽高 div, p, h1~h6, section
inline 行内元素,内容决定宽高,不可设宽高 span, a, strong, em
inline-block 行内排列但可设宽高 button, input, select
flex 弹性布局容器,子元素按主轴排列 布局容器
inline-flex 行内弹性容器 内联布局
grid 网格布局容器,同时控制行和列 页面整体布局
inline-grid 行内网格容器 内联网格
none 完全隐藏(不占据空间,不同于 visibility: hidden 隐藏元素
table 类似 <table> 元素的行为 表格布局兼容
list-item 类似 <li> 元素的行为 列表项

1. display 属性

display 属性控制元素的显示行为。它可能是 CSS 中最重要、最常用的属性之一。

(1) 块级元素(block)

块级元素的特点是:

常见的块级元素:<div><p><h1>-<h6><ul><li><section><header><footer> 等。

▶ 示例

HTML
<style>
.block {
  display: block;
  width: 200px;
  height: 100px;
  margin-bottom: 10px;  /* 垂直方向有效 */
  background: #e3f2fd;  /* 加背景色便于观察 */
  border: 1px solid #90caf9;
}
</style>
<div class="block">块级元素(占满整行)</div>
▶ 试一试

(2) 行内元素(inline)

行内元素的特点是:

常见的行内元素:<span><a><strong><em><label> 等。

▶ 示例

HTML
<style>
.inline {
  display: inline;
  /* width: 100px;  ❌ 无效 */
  /* height: 50px;  ❌ 无效 */
  margin: 0 5px;     /* 水平方向有效 */
}
</style>
<div class="inline">行内元素(水平排列)</div>
▶ 试一试

(3) 行内块元素(inline-block)

💡 inline-block 的间隙: 多个 display: inline-block 元素之间会有 4px 左右的空隙——这是因为 HTML 中的换行和空格被渲染了。解决方法:父元素设 font-size: 0,或者把元素间的换行去掉。

行内块元素结合了两种模式的特点:

▶ 示例

HTML
<style>
.button {
  display: inline-block;
  width: 120px;
  height: 40px;
  padding: 8px 16px;
  margin: 5px;
  background: #3498db;
  color: white;
  text-align: center;
}
</style>
<button class="button">Button</button>
▶ 试一试

inline-block 的常见问题:两个 inline-block 元素之间会有空格间隙——这是 HTML 中换行/空格导致的。解决方法:

▶ 示例

HTML
<style>
/* 方法1:父元素设置 font-size: 0 */
.parent {
  font-size: 0;
}
.parent > * {
  font-size: 16px;  /* 子元素重新设置字体大小 */
}

/* 方法2:使用 flex 替代(推荐) */
.parent {
  display: flex;
}
</style>
<div class="parent">父容器元素</div>
<div class="parent">父容器元素</div>
▶ 试一试

(4) none(隐藏)

display: none 让元素完全不显示,不占据空间

⚠️ 重要区别: display: none 让元素彻底消失(不占空间),visibility: hidden 只是隐藏(仍占空间),opacity: 0 只是透明(仍占空间且可以交互)。三种方式用途截然不同。

📌 opacity 继承: 子元素无法通过设 opacity: 1 来覆盖父元素的 opacity: 0.5——因为 opacity 是作用于整个元素连同其所有子元素的。如果只想让背景半透明,用 rgba()

▶ 示例

HTML
<style>
.hidden {
  display: none;
}
</style>
<div class="hidden">隐藏元素</div>
▶ 试一试

visibility: hidden 的区别见下文。

(5) flex 和 grid

▶ 示例

HTML
<style>
.flex-container {
  display: flex;   /* 弹性布局,后续专门讲解 */
}

.grid-container {
  display: grid;   /* 网格布局,后续专门讲解 */
}
.grid-container-item {
  background: #e8f4f8;
  border: 1px solid #3498db;
  padding: 16px;
  margin: 4px;
  border-radius: 4px;
  text-align: center;
}
</style>
<div class="grid-container">
    <div class="grid-container-item">Grid container item</div>
    <div class="grid-container-item">Grid container item</div>
    <div class="grid-container-item">Grid container item</div>
</div>
▶ 试一试

2. display 值总结

是否独占一行 能否设置宽高 常用场景
block div、p、标题等
inline span、a、strong等
inline-block 按钮、导航项等
none 不显示 不显示 隐藏元素
flex 弹性布局
grid 网格布局

3. visibility 属性

visibility 控制元素是否可见,但与 display: none 有所不同:

▶ 示例

HTML
<style>
.hidden {
  visibility: hidden;  /* 元素不可见,但仍占据空间 */
}

.invisible {
  display: none;       /* 元素不可见,也不占据空间 */
}
</style>
<div class="hidden">隐藏元素</div>
<div class="invisible">不可见元素(占位隐藏)</div>
▶ 试一试
属性 是否可见 是否占据空间 是否可交互
display: none
visibility: hidden
visibility: visible

4. 其他显示相关的属性

(1) opacity(透明度)

▶ 示例

HTML
<style>
.transparent {
  opacity: 0.5;   /* 50%透明,仍占据空间且可交互 */
  background: #e74c3c;
  color: white;
  padding: 20px;
  text-align: center;
}
</style>
<div class="transparent">透明元素效果展示(半透明红色背景)</div>
▶ 试一试

(2) 元素隐藏的几种方式对比

▶ 示例

HTML
<style>
/* 方式1:不占据空间,完全移除 */
.hide-1 {
  display: none;
}

/* 方式2:占据空间,不可见 */
.hide-2 {
  visibility: hidden;
}

/* 方式3:占据空间,透明但可交互 */
.hide-3 {
  opacity: 0;
}

/* 方式4:移出视口 */
.hide-4 {
  position: absolute;
  left: -9999px;
}

/* 方式5:针对可访问性的隐藏(屏幕阅读器可见) */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
</style>
<div class="hide-1">隐藏方案一</div>
<div class="hide-2">隐藏方案二</div>
<div class="hide-3">隐藏方案三</div>
<div class="hide-4">隐藏方案四</div>
<div class="sr-only">仅屏幕阅读器可见</div>
▶ 试一试

❓ 常见问题

Q display: none 和 visibility: hidden 有什么区别?
A display: none 让元素彻底消失,不占页面空间,后面的元素会补上来。visibility: hidden 只是隐藏了视觉,元素仍然占位。如果需要动画过渡效果,用 opacity: 0 配合 transition 更平滑。
Q inline-block 元素之间有间隙怎么去掉?
A 多个 inline-block 元素之间的 4px 间隙来自 HTML 中的换行和空格。解决方法:父元素设 font-size: 0 然后子元素单独设字号,或者把元素标签写成一行不换行。
Q opacity: 0 和 visibility: hidden 都能隐藏,哪个性能好?
A opacity: 0 的元素仍然可以触发点击事件,visibility: hidden 不会。性能上二者差别不大,但 opacity 可以用过渡动画平滑显示/隐藏,visibility 不能做过渡。

📖 小节

📝 作业

  1. 创建一个页面,分别用 blockinlineinline-block 显示三个盒子,观察它们的排列和尺寸差异。
  2. 将一组导航链接设置为 inline-block,给它们设置宽高和内边距,制作水平导航栏。
  3. 演示 display: nonevisibility: hidden 的区别(提示:可以放两个元素在页面上,观察文档流的变化)。
  4. 使用 display: inline-block 创建一个"按钮组",注意处理 inline-block 之间的空格间隙问题。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏