这是不可能的谷歌,因为每一篇文章谈论:before
和:after
伪元素似乎用的是“内容”。
我在this CSS-技巧文章听说这件事,解释如何实现图像滑块作为示例用例的Web组件。因此,看来内的代码的例子是:
CSS
#slides ::content img {
width: 25%;
float: left;
}
HTML
<template>
...
<div class="inner">
<content select="img"></content>
</div>
</template>
这似乎是指这个<content>
标签,这是用来让用户包括Web组件,但我希望能更深刻地理解这一点。
编辑:
进一步阅读,上述文章中,我发现一个链接作者的“影子DOM CSS的cheatsheet”,其中包括一个通道,解释::content
伪元素是什么:
选择的元素的内部分布节点。需要与填充工具,下选择配对对于不支持原生的选择浏览器。
::content h1 {
color: red;
}
来源:http://robdodson.me/blog/2014/04/10/shadow-dom-css-cheat-sheet/
这是有益的,但我仍然觉得整件事情相当不透明。任何额外的见解?
所述::content
伪元素被替换与::slotted
伪元素Web组件/阴影DOM的未来实现。同样,通过这个伪元素有针对性的元素已经从<content
改为<slot
>在Shadow DOM specification的最新版本。你可以看到有关的变化here相关讨论。
目前浏览器还支持<content>
和::content
。
摘要:
::content
基本上是挖ShadowHost
,通常不是可以个性化的更深层次和风格的后裔,因为你的CSS不知道去寻找ShadowDOM片段没有::content
的方式。
这个答案假定您至少有点熟悉<template>
元素和Web Components,特别是ShadowDOM,这与ShadowTree
s和他们的两个主要元素,ShadowHost
和ShadowRoot
交易。
注 - 在撰写本文时,有不到50%的支持(甚至前缀,越野通过默认支持)横跨五大浏览器的Web组件。虽然所有现代浏览器都支持<template>
,只有最近的Chrome和Opera的版本完全支持ShadowDOM;与Firefox后支持它的部分您切换在about:config
(dom.webcomponents.enabled
)所需的功能为true。
使用ShadowDOM
的目标是类似于MVC的separation of concerns。也就是说,我们希望我们的内容从我们的介绍分开,并允许在我们的代码封装模板,帮助使其更易于管理。我们在不同的编程语言已经有了这一点,但它仍然是在HTML和CSS一些时间的问题。此外,在造型Web应用程序元素时,可以有与类名冲突。
通常情况下,我们与LightDOM
(一种“光王国”)的互动,但有时这将有助于采取封装的优势。跨入这种“影子王国”(Web组件的一部分)是为了防止通过允许封装上述问题的新方法。适用于您的ShadowTree
来标记的任何样式不会应用到您的ShadowTree
以外的标记,即使使用完全相同的类或选择。
当ShadowTree
(其中居住在ShadowDOM
)具有从内部它分布在LightDOM
一棵树,和/或当ShadowTree
呈现,其结果是由浏览器进入所谓的composed tree转换。
当浏览器呈现你的代码,内容的分发,并在比它身体类型等新位置插入。这种分布式的输出是你所看到的(和浏览器看到的),并且被称为composed tree
。在现实中,内容不是原来的顺序输入,它现在出现,但你不会知道这一点,都不会对浏览器。 “最终结果”和“原代码”,如果你愿意,之间的分离是封装的主要好处之一。
Web Components & the Future of CSS是Web组件一个伟大的40分钟的视频并专门ShadowDOM,通过ZachSaucier指给我看。
具体到你的问题,::content
伪元素应用到所谓的分布式节点。分布式节点是无论你把<content></content>
标签中的另一种说法。内容从其原标记的地方分布,无论你已经把你的<content>
标签的模板。
所以,当你在CSS需要的特异性,可以正常处理选择的一种方法是,你去父元素,并添加作为选择的一部分。例如:如果.container {}
不够具体,你可以使用div .container {}
或.main .container {}
为了使您的选择工作。
关于ShadowDOM,这是确定范围和封装的角度思考,你必须意识到你已经创建了这个新ShadowTree是一个完全新的(离散)DOM片段。这不是在同一个“淡泊境界”为内容的剩余部分;这是一个“影子王国”。那么,如何将CSS知道瞄准这一“暗影王国”?通过使用::content
伪元素!
::content
pseudo-element selector acts as the parent element of distributed nodes.的HTML5Rocks有教程here,here和here覆盖更多的信息,并给出一些很好的例子(请务必使用Chrome或Opera访问,直到更多的浏览器支持这些功能)的大序列。
例如,参见由的HTML5Rocks代码的这个修改和改进(由Leo)版本:
var div = document.querySelector('div');
var root = div.createShadowRoot();
var template = document.querySelector('template');
root.appendChild(template.content);
<template>
<style>
h3 { color: red; }
content[select="h3"]::content > h3 { color: green; }
::content section p { text-decoration: underline; }
</style>
<h3>Shadow DOM</h3>
<content select="h3"></content>
<content select="section"></content>
</template>
<div>
<h3>Light DOM</h3>
<section>
<div>I'm not underlined</div>
<p>I'm underlined in Shadow DOM!</p>
</section>
</div>
也可在JSFiddle(请记住,在如Chrome或Opera基于WebKit的浏览器访问)
在这里,您可以看到::content
section p
伪元素首先选择ShadowRoot
,这是div
元素的内容在您的标记内容,然后通过添加section p
进一步详细说明。
相比普通CSS选择器使用时(例如,为什么不使用section p {}
?)这似乎是不必要的,直到你记得,穿越ShadowTree
的时候,你不能host
元素通常选择后代(其中分布式节点),因为他们在“阴影王国”我前面提到的。
太糟糕了!不幸的是::content
是V0,而被废弃。
您现在应该使用V1 ::slotted
。
此外,<content>
赞成<slot>
的被弃用。
请参阅:http://hayato.io/2016/shadowdomv1/
另请参阅:Web Components - why <content> was replaced with <slot>