为 <details>
元素设置样式时存在一个很大的陷阱,如 Kitty Giraudel 在此处的文档中所述。它足够晦涩,您可能永远不会遇到它,但如果您遇到了,我可以看到它会非常令人困惑(至少会让我困惑)。
也许您了解阴影 DOM?它在 Web Components 方面被广泛讨论,并且在考虑 <svg>
和 <use>
时也会出现。但 <details>
也有一个阴影 DOM
<details>
#shadow-root (user-agent)
<slot name="user-agent-custom-assign-slot" id="details-summary">
<!-- <summary> reveal -->
</slot>
<slot name="user-agent-default-slot" id="details-content">
<!-- <p> reveal -->
</slot>
<summary>System Requirements</summary>
<p>
Requires a computer running an operating system. The computer must have some
memory and ideally some kind of long-term storage. An input device as well
as some form of output device is recommended.
</p>
</details>
正如 Amelia 解释的那样,
<summary>
插入到第一个阴影根插槽中,而其余内容(称为“光 DOM”或我们案例中的<p>
标签)插入到第二个插槽中。问题是,这些插槽或阴影根都不能与通用选择器
*
匹配,它只匹配来自光 DOM 的元素。
所以 <slot>
在那里有点“挡道”。最终,<p>
实际上是 <slot>
的子元素。这很奇怪,因为像 details > p
这样的选择器仍然可以很好地选择它。大概,该选择器在光 DOM 中解析,然后在插入插槽后继续工作。
但是,如果您告诉某个属性 inherit
(继承),事情就会崩溃。如果您执行以下操作…
<div>
<p></p>
</div>
div {
border-radius: 8px;
}
div p {
border-radius: inherit;
}
…那么 <p>
将具有 8px
的边框半径。
但是,如果您执行以下操作…
<details>
<summary>Summary</summary>
<p>Lorem ipsum...</p>
</details>
details {
border-radius: 8px;
}
details p {
border-radius: inherit;
}
那么 <p>
将像门把手一样是方形的。我想这可能是因为您无法强制通过阴影 DOM 进行继承,或者继承仅发生在父元素(即 <slot>
)上?无论如何,它都不起作用。
不影响 Firefox
感谢您的分享,我一直在使用 Firefox,并且想知道为什么我看到了边框半径哈哈
是的,当我阅读时,我很好奇这是否是规范的一部分还是实现的一部分。
非常出乎意料。我刚刚快速测试了一下 创建我自己的组件,并且来自上方的
text-decoration
在插槽化的<a/>
标签上完美继承。我怀疑这可能与自定义插槽行为有关。通常,插槽内容需要由slot="some-name"
分配,这与阴影 DOM 中的<slot name="some-name">
相关。由于<summary>
组件似乎没有名称(除非它隐藏在实现中),因此它一定有一些独特之处才能显示在第一个插槽中,而其余子元素显示在第二个插槽中。根据我的经验,这不是常见的<slot/>
行为。根据 CSS 范围 规范,这是预期行为,对吧?
奇怪的是,Firefox 对
<details>
进行了 Chris 预期的操作,但对其他自定义元素却没有。同样有趣的是,文本属性确实继承了(隐式地)。(或多或少与 Donnie 制作的 相同笔。哎呀。)关于为什么某些样式继承而某些样式不继承的一些说明 https://lamplightdev.com/blog/2019/03/26/why-is-my-web-component-inheriting-styles/