HTML hidden 全局属性

hidden 全局属性是一个枚举属性,表示浏览器不应渲染该元素的内容。例如,它可以用于隐藏页面中直到登录过程完成后才能使用的元素。

试一试

<p>
  This content should be read right now, as it is important. I am so glad you
  are able to find it!
</p>

<p hidden>
  This content is not relevant to this page right now, so should not be seen.
  Nothing to see here. Nada.
</p>
p {
  background: #ffe8d4;
  border: 1px solid #f69d3c;
  padding: 5px;
  border-radius: 5px;
}

描述

hidden 属性表示元素的内容不应呈现给用户。该属性接受以下任何一个值:

  • 关键字 hidden
  • 关键字 until-found
  • 空字符串或无值

无效的 hidden 属性值也会使元素处于*隐藏*状态。因此,以下所有元素都处于隐藏状态:

html
<span hidden>I'm hidden</span>
<span hidden="">I'm also hidden</span>
<span hidden="hidden">I'm hidden too!</span>
<span hidden="bananas">I'm equally as hidden!</span>

关键字 until-found 将元素设置为直到找到才显示状态

html
<span hidden="until-found">I'm hidden until found</span>

隐藏状态

隐藏状态表示元素当前与页面不相关,或者它被用于声明内容以便页面其他部分重用,并且不应直接呈现给用户。浏览器不会渲染处于隐藏状态的元素。

Web 浏览器可能会使用 display: none 来实现隐藏状态,在这种情况下,元素将不参与页面布局。此外,更改隐藏元素的 CSS display 属性的值将覆盖隐藏状态。例如,即使存在 hidden 属性,样式为 display: block 的元素也将显示。

直到找到才显示状态

直到找到才显示状态下,元素是隐藏的,但其内容可通过浏览器的“页面查找”功能或片段导航进行访问。当这些功能导致滚动到*直到找到才显示*子树中的元素时,浏览器将:

  1. 在隐藏元素上触发 beforematch 事件
  2. 从元素中移除 hidden 属性
  3. 滚动到元素

这允许您折叠内容部分,同时仍然允许用户通过搜索或导航找到它。

浏览器通常使用 content-visibility: hidden 来实现*直到找到才显示*。这意味着,与处于隐藏状态的元素不同,处于*直到找到才显示*状态的元素会生成盒子,并且:

  • 它们参与页面布局
  • 它们的边距、边框、内边距和背景都会被渲染

此外,元素需要受到 布局隔离 的影响才能被揭示。如果处于*直到找到才显示*状态的元素其 display 值为 nonecontentsinline,则该元素将不会通过“页面查找”或片段导航而被揭示。

用法说明

hidden 属性不得用于仅从一种呈现方式中隐藏内容。如果某物被标记为隐藏,它将从所有呈现方式中隐藏,包括(例如)屏幕阅读器。

除非使用 hidden="until-found",否则不应从可见元素链接到隐藏元素。例如,使用 href 属性链接到具有 hidden 属性的部分是不正确的。如果内容不适用或不相关,则不应链接。

然而,可以使用 ARIA aria-describedby 属性来引用隐藏的描述。虽然隐藏描述意味着它们本身没有用处,但当以这种方式引用时,它们可以提供有用的上下文。

同样,具有 hidden 属性的 canvas 元素可以被脚本图形引擎用作离屏缓冲区,并且表单控件可以通过其 form 属性引用隐藏的表单元素。

最后,请注意,隐藏元素的后代元素仍然处于活动状态,这意味着脚本元素仍然可以执行,表单元素仍然可以提交。

html
<div hidden>
  <script>
    console.warn("Boo! I'm hidden *and* running!");
  </script>
</div>

示例

使用 hidden 属性

在此示例中,我们有三个 <div> 元素。第一个和第三个没有隐藏,而第二个具有 hidden 属性。请注意,隐藏元素没有生成的盒子。

html
<div>I'm not hidden</div>
<div hidden>I'm hiding!</div>
<div>I'm not hidden, either</div>

使用 until-found 值

在此示例中,我们有三个 <div> 元素。第一个和第三个是可见的,而第二个具有 hidden="until-found"id="until-found-box" 属性。id 为 until-found-box 的元素具有红色虚线边框和灰色背景。

我们还有一个链接,它指向 "until-found-box" 片段,以及一个 JavaScript 脚本,它监听该隐藏元素上触发的 beforematch 事件。事件处理程序更改盒子的文本内容,以说明当即将移除直到找到才显示状态时可能发生的操作。

HTML

html
<a href="#until-found-box">Go to hidden content</a>

<div>I'm not hidden</div>
<div id="until-found-box" hidden="until-found">Hidden until found</div>
<div>I'm hidden</div>

CSS

css
div {
  height: 40px;
  width: 300px;
  border: 5px dashed black;
  margin: 1rem 0;
  padding: 1rem;
  font-size: 2rem;
}

div#until-found-box {
  color: red;
  border: 5px dotted red;
  background-color: lightgray;
}

JavaScript

js
const untilFound = document.querySelector("#until-found-box");
untilFound.addEventListener(
  "beforematch",
  () => (untilFound.textContent = "I've been revealed!"),
);

结果

点击“转到隐藏内容”链接会导航到*直到找到才显示*元素。beforematch 事件触发,文本内容更新,元素变为可见。请注意,尽管元素的内容被隐藏,但元素仍然有一个生成的盒子,占据布局空间,并且背景和边框都会被渲染。

要再次运行示例,请点击“重置”。

规范

规范
HTML
# the-hidden-attribute

浏览器兼容性

另见