这对于谷歌来说是不可能的,因为每一篇谈论: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组件,但我希望更深入地了解这一点.

EDIT:

在进一步阅读上述文章后,我发现了作者的"Shadow DOM CSS Cheatsheet"链接,其中包括一段解释::content伪元素是什么的文章:

Select 元素内的分布式 node .需要配对 对于不支持的浏览器,使用PolyFill-Next-Selector 本地 Select 器.

::content h1 {
    color: red;
}

来源:http://robdodson.me/blog/2014/04/10/shadow-dom-css-cheat-sheet/

这是有帮助的,但我仍然觉得整个事情相当不透明.还有其他见解吗?

推荐答案

在Web组件/影子DOM的future 实现中,::content伪元素将被::slotted伪元素取代.同样,该伪元素所针对的元素已从<content更改为<slot>;在最新版本的Shadow DOM specification.你可以看到关于这一变化的相关讨论here.

目前浏览器仍支持<content>::content.


原始答案:


Summary:

::content基本上是一种深入挖掘ShadowHost的后代并对其进行样式化的方法,ShadowHost的后代通常无法进行样式化,因为如果没有::content,CSS不知道如何查找ShadowDOM片段.


这个答案假设您至少稍微熟悉100元素和101,特别是102,它处理ShadowTree及其两个主要元素ShadowHostShadowRoot.

Note-在 compose 本文时,五大浏览器对Web组件的支持不到50%(甚至有前缀,默认情况下也不支持).虽然所有现代浏览器都支持<template>,但只有最新版本的Chrome和Opera完全支持ShadowDOM;在将about:config(dom.webcomponents.enabled)中的必要功能切换到true之后,Firefox支持部分ShadowDOM.

使用ShadowDOM的目标类似于MVC的100.也就是说,我们希望将内容与演示文稿分开,并允许在代码中封装模板以帮助使其更易于管理.我们已经在各种编程语言中实现了这一点,但是在HTML和CSS中它仍然是一个问题已经有一段时间了.此外,在设计Web应用程序中的元素样式时,可能会与类名冲突.

通常,我们与LightDOM(一种"光域")交互,但有时利用封装会有所帮助.进入这种"影子领域"(Web组件的一部分)是一种新方法,可以防止allowing encapsulation所提到的问题.应用于ShadowTree中的标记的任何样式都不会应用于ShadowTree之外的标记,即使使用了完全相同的类或 Select 器.

ShadowTree(位于ShadowDOM中)具有分布在其内部的来自LightDOM的树时,和/或当呈现ShadowTree时,浏览器将结果转换成所谓的100.

当浏览器呈现您的代码时,内容将被分发并插入到物理输入的新位置other than.这种分布式输出就是您看到的(以及浏览器看到的),被称为composed tree.实际上,内容最初并不是按照现在的显示顺序键入的,但您不知道这一点,浏览器也不知道.如果愿意的话,"最终结果"和"原始代码"之间的这种分离是封装的主要好处之一.

100是一个关于网络组件的40分钟视频,尤其是ZachSaucier向我指出的ShadowDOM.


具体到您的问题,::content伪元素适用于所谓的distributed nodes.分布式 node 是您放在<content></content>标记内的任何东西的另一个术语.内容从其在原始标记中的位置到您在模板中放置<content>个标记的位置是distributed.

因此,当您需要在CSS中指定时,可以正常处理 Select 器的一种方式是转到父元素并将其作为 Select 器的一部分添加进来.例如:如果.container {}不够具体,您可以使用div .container {}.main .container {}来使您的 Select 器工作.

考虑到ShadowDOM的要点,即作用域和封装,您必须意识到您创建的这个新的ShadowTree是一个全新的(离散的)DOM片段.它与你的内容的睡觉不在同一个"光界"里,它在"影界"里.那么,CSS是怎么知道要瞄准这个"影子王国"的呢?通过使用::content伪元素!

The ::content pseudo-element selector acts as the parent element of distributed nodes.

HTML5Rocks有一系列很棒的教程hereherehere,涵盖了更多信息,并给出了一些很好的例子(在更多浏览器支持这些功能之前,请务必使用Chrome或Opera进行访问).

例如,请参见HTML5Rock中经过修改和改进(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>

也可在100上获得(请记住使用基于WebKit的浏览器(如Chrome或Opera)访问)

在这里您可以看到,100section p伪元素是 Select ShadowRoot的内容的first,这是您的标记中的div元素的内容,并且通过添加100section p进一步指定then.

与正常的CSS Select 器用法(例如,为什么不直接使用section p {}?)相比,这似乎没有必要,直到您回想起,在遍历ShadowTree时,您通常不能 Select host个元素(即分布式 node )的后代,因为它们在我前面提到的"影子领域"中.

Css相关问答推荐

转换间隙值时基于百分比的弹性元素&跳转

如何居中对齐容器父对象?

如果父元素是弹性元素,则不会显示带有纵横比的空div

根据现有值计算CSS变量的新值

当滚动量较小时,在滚动问题上动画粘性导航

如何仅在CSS中屏蔽具有多个形状的div框?

为什么所有选项卡都没有显示在 React 的 MUI 选项卡组件中?

如何在 VS Code 中获得 JavaFX CSS 属性的自动完成功能?

如何为 React Native switch 组件创建标签?

SCSS - Lighten/Darken 不编译?

如何为使用jsTreeR拖入层次 struct node 的元素添加顺序编号?

Angular 导航栏问题

CSS 使文本扩展并保持居中与圆形扩展 div 的问题

在 vuetify 中跨 `default.vue` 和 `index.vue` 维护网格系统

使用 CSS 在悬停时转换 SVG 路径的填充属性

你如何调试可打印的 CSS?

弹性盒项目之间的间距

CSS:将背景图像拉伸到屏幕的 100% 宽度和高度?

数据协议 URL 大小限制

将样式应用于第一行的单元格