::details-content

Avatar of Geoff Graham
Geoff Graham

CSS 的 ::details-content 伪元素提供了一种方法来选择和应用样式到 <details> 元素的内部部分,而不会将样式泄露到 <summary>

details::details-content {
  background-color: hsl(0 0% 0%);
}

语法

<element-selector>::details-content {}

我们在那里说 <element-selector>,但 ::details-content 特别与 <details> 元素绑定,这意味着在许多情况下,您将使用它作为选择器。

details::details-content {}

当然,如果您想选择一个特定的 <details> 元素,那么也可以通过类来选择它。

.my-class::details-content {}

终于,有一种方法可以为 details 内容设置样式!

典型 <details> 元素的 HTML 看起来像这样

<details>
  <summary>Details Example</summary>
  Whatever content or other markup we want in this space!
</details>

只需在 CSS 中选择 <details> 元素,就可以轻松地为它设置样式。

我们还可以使用 open 属性在元素展开时为它设置样式。

<summary> 元素添加样式同样容易,因为我们也可以直接选择它。

我们可以为 <summary> 之前的那个小箭头设置样式。如果我们打开开发者工具并检查元素,我们会看到 Shadow DOM 中有一个针对 -webkit 的特定伪元素。

Inspecting a details element in devtools to reveal the markup containing the detail marker.

看到了吗?它是 <summary> 元素的伪元素,所以我们可以像这样选择它。

summary::-webkit-details-marker {
  /* Style away! */
}

但是,我们如何在世界上为 <details> 元素内部的内容设置样式?这就是我们一直缺少的东西,也是 ::details-content 伪元素存在的意义。在撰写本文时,::details-content 尚未被任何浏览器实现,因此我们没有具体的方法来展示它的工作原理。假设在它正式被采用为一项功能之前,规范不会发生任何变化,它可能看起来像这样。

details::details-content {
  background-color: hsl(0 0% 0% / .85);
  margin-block: 1rem;
}

这就是我们为什么需要 ::details-content 的原因。它算是 <details> 样式难题中缺失的一块。

示例

我们已经看过了示例,但规范中有一个值得提到的示例。它很有意思,因为它演示了我们如何才能为内容设置动画,使其淡入视图。

details::details-content {
  display: block;
  opacity: 0;
  transition: content-visibility 300ms allow-discrete step-end, opacity 300ms;
}

details[open]::details-content {
  opacity: 1;
  transition: content-visibility 300ms allow-discrete step-start, opacity 300ms;
}

什么?! 这表明伪元素将与原生 CSS 过渡配合使用,甚至与多步过渡配合使用!让我们继续添加一个该功能的实时演示,看看它是否在得到更广泛支持后有效。

浏览器支持

目前还没有!我们将随着支持的推出而添加一个完整的支持表格。

规范

::details-content 属性在 CSS 伪元素模块级别 4 规范中定义。它目前处于编辑草案状态,这意味着它尚未成为 WHATWG 在 HTML 方面和 CSS 工作组在 CSS 方面的正式建议,它可能会在正式建议发布之前发生变化。因此,如果您正在考虑是否要在生产环境中尝试使用它,最好还是耐心等待更多浏览器实现对它的支持。

如果您感兴趣,该定义于 2024 年 6 月添加到规范中,您可以在这里找到提交。您还可以在几个GitHub 线程中找到对它的讨论,以获得更多上下文信息。