标准答案

  1. display: none 会把元素从布局树中移除,不占空间,也不渲染,通常屏幕阅读器也读不到。
  2. visibility: hidden 会让元素不可见,但仍占原来的布局空间,也不会响应鼠标事件。
  3. opacity: 0 只是把元素画成透明,元素仍占空间,也可能响应点击、键盘焦点和辅助技术读取。
  4. 如果只是做淡入淡出动画,可以用 opacity;如果要彻底隐藏并移出布局,用 display: none。
  5. 用 opacity 隐藏可交互元素时,要配合 pointer-events、tabindex、aria-hidden 或真正的隐藏逻辑,避免用户看不见却还能点到。

题目解析

回答时可以按四个维度比较:是否占位、是否渲染、是否能交互、是否影响可访问性。

如果目的是给屏幕阅读器保留内容,不应该用 display: none 或 visibility: hidden,而应该使用专门的 visually-hidden 样式。

代码示例

透明元素如果还在页面上,最好明确处理事件命中。

CSS
.hidden-from-layout {
  display: none;
}

.hidden-but-space {
  visibility: hidden;
}

.fade-out {
  opacity: 0;
  pointer-events: none;
}

常见误区

  • 认为 opacity: 0 的元素不能点击。它仍可能接收事件。
  • 用 display: none 隐藏给屏幕阅读器的提示文本,导致辅助技术也读不到。
  • 只比较是否可见,不比较布局和交互影响。

作者信息