我想构建一个外部GUI,它运行在与关联CSS一起提供的通用HTML片段上。为了启用GUI的某些功能,我需要创建一些“元”HTML元素来包含部分内容并将它们与数据相关联。
例:
<div id="root">
<foo:meta data-source="document:1111" data-xref="...">
sometext
<p class="quote">...</p>
</foo:meta>
<p class="other">...</p>
</div>
此HTML是从已有的具有关联CSS的HTML开始自动生成的:
<div id="root">
sometext
<p class="quote">...</p>
<p class="other">...</p>
</div>
#root>p {
color:green;
}
#root>p+p {
color:red;
}
问题是,当添加<foo:meta>
元素时,这会破坏CSS子节点和兄弟选择器。我正在寻找一种方法让CSS选择器以这种方式封装内容时继续工作。我们已经尝试过foo\:meta{display:contents}
样式,但是,虽然它在从框渲染器隐藏元元素方面起作用,但它并没有将它隐藏在选择器匹配器中。我们不生成要处理的HTML / CSS,因此在处理之前以某种方式编写它们不是一种选择。它们按原样出现,带有相关CSS的通用HTML文档。
有没有办法实现我们正在寻找使用HTML / CSS?
为了重申,我们正在寻找一种方法来动态地将部分内容封装在非可视元素中,而不会破坏子选项和兄弟CSS选择器。这些元素只能用于DOM遍历,例如document.getElementsByTagName('foo:meta')
如果我正确理解你的问题。我建议使用祖父母和孩子之间的空间而不是'>'。你的选择器也是一个id,而不是一个类。您放入的选择器选择作为子级的下一级子级。但是在两者之间添加空间也可以选择孙子孙女!所以你要做的就是这个
#root .quote {
color:green;
}
如果这有帮助,请告诉我。一个工作的CSS是here
因此,经过大量的研究和研究,我们得出结论,即使使用ShadowDom也无法做到这一点,因为即使这样也需要大量的CSS重写,这可能无法保留语义。
然而,对于任何绊倒这个问题的人来说,我们采用以下方法来达到同样的目的(我只是简短,只有指针):
<!--<foo:bar data-source="1111">-->...content...<!--</foo:bar>-->
)innerHtml
,outerHtml
,XMLSerializer
)上使用字符串操作将封装标签转换为常规标签,以获得可以为内容挖掘和交叉引用的干净XML。document.evaluate('//comment()',document)
,似乎工作,但我们不相信所有浏览器遵守。