标准答案

  1. 如果内容要视觉隐藏但保留给屏幕阅读器读取,不能用 display: none 或 visibility: hidden,它们通常会把内容从可访问树中移除。
  2. opacity: 0 也不是理想方案,因为元素仍然占位,还可能接收点击或键盘焦点。
  3. 常见做法是 visually-hidden 或 sr-only:把元素裁剪到 1px,绝对定位到页面布局之外,隐藏溢出,同时保留在 DOM 和可访问树中。
  4. 它适合给图标按钮补充可访问名称、给表单补充说明、给跳过导航链接提供文本。
  5. 如果元素需要键盘聚焦,比如“跳过主内容”链接,focus 时要恢复可见,不能一直隐藏。

题目解析

这题的核心是区分视觉隐藏和语义隐藏。display: none 是两者都隐藏,visually-hidden 是只视觉隐藏。

如果内容本来就不应该被辅助技术读取,应使用 aria-hidden 或不渲染,而不是 visually-hidden。

代码示例

经典 sr-only 样式可以保留屏幕阅读器可读性。

CSS
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.skip-link:focus {
  position: static;
  width: auto;
  height: auto;
  margin: 0;
  overflow: visible;
  clip: auto;
}

常见误区

  • 用 display: none 写辅助说明,导致屏幕阅读器也读不到。
  • 用 opacity: 0 隐藏可交互元素,导致看不见但能聚焦或点击。
  • 跳过链接聚焦后仍然不可见,键盘用户无法确认焦点位置。

作者信息