【发布时间】:2021-04-20 14:29:20
【问题描述】:
概括地说,DOM spec 定义了影子树的概念如下:
- 影子树是与当前文档不同的节点树(light tree)。
- 它的根(shadow root)通过host引用与光照树节点相连——这与后代/祖先关系不同DOM 树。
- 此外,影子树可以有slot节点,它们又可以通过assigned节点slottables)连接/strong> 关系(再次被认为可与 DOM 树结构区分开来)。
我觉得这张照片有点牵强。看起来我们实际上没有两棵不同的树(光和影),而是三棵树。实际上,用户代理会渲染另一个名为 flattened tree 的用户代理。在这棵树中,影子根是其宿主的子节点,而插槽是其插槽表的祖先:
有人可能会争辩说,扁平化的树只是一个“虚拟想法”。但是,它用于 CSS 和事件侦听,可能这一事实证明了它的有用性。
松散地,影子树被视为影子主机的内容 而不是其正常的灯光树内容。然而,它的一些光 树的孩子可以通过分配它们被“拉入”阴影树 到插槽。 这会导致它们被视为插槽的子级 CSS 目的。 (CSS non-normative explanation)
当物质状态可以用单个扁平树来描述时,是否有任何理由引入影子树的概念,尤其是槽分配节点,其中节点与众所周知的后代/祖先引用相连,而不是具有特殊的引用命名为“分配节点”?当然,如果我们渴望封装,像 findElementById() 这样的 API 函数将保持扁平树的“影子”子树完好无损。
【问题讨论】:
-
您是否在问为什么 HTML 标准委员会做出了设计决定?你得问问他们。
-
@Robert Harvey 也许有一些我不知道的众所周知的原因
-
where nodes are connected with well-known descendants/ancestor references-- 这听起来不像是“影子树”。引用意味着对数据结构的更改会影响原始树。 -
“但是,它 [Flattened DOM] 用于 CSS 和事件监听” 你能进一步解释一下吗?只有 lightDOM 或 shadowDOM。开槽/分配的节点被 反射 从 lightDOM 到 shadowDOM。两者都有详细解释in this answer
标签: html shadow-dom