当前位置: 首页 > 面试题库 >

:: content / :: slotted伪元素是什么,它如何工作?

白嘉志
2023-03-14
问题内容

对于Google而言,这是不可能的,因为每个谈论:before:after伪元素的文章似乎都使用“内容”一词。

我在这篇CSS-Tricks文章中听说过它,解释了如何实现图像滑块作为Web组件的示例用例。因此,它出现在内部的代码示例为:

CSS

#slides ::content img {
   width: 25%;
   float: left;
}

HTML

<template>
  ...
  <div class="inner">
    <content select="img"></content>
  </div>
</template>

似乎是指该<content>标签,该标签用于允许用户包括Web组件,但我希望对此有更深入的了解。

编辑:

在进一步阅读之后,在上述文章中,我找到了作者的“ Shadow DOM CSS
Cheatsheet”链接,其中包括一段解释什么是::content元素的段落:

选择元素内部的分布式节点。对于不支持本机选择器的浏览器,需要与polyfill-next-selector配对。

::content h1 {
    color: red;
}

问题答案:

所述::content伪元素被替换与所述Web组件/阴影DOM的未来实现::slotted伪元素。同样,在最新版本的Shadow
DOM规范中,此伪元素所针对的元素已从更改<content<slot>


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

原始答案:

摘要:

::content本质上是一种挖掘的更深层次和样式的后代的方法ShadowHost,通常无法设置样式的后代,因为CSS不知道是否要寻找ShadowDOM片段::content

该答案假定您至少对 <template>元素和Web组件 有所了解,特别是ShadowDOM
,它处理ShadowTrees及其两个主要元素,ShadowHost以及ShadowRoot

注意
-撰写本文时,在五个主要浏览器中对Web组件的支持不足50%(甚至是带前缀的默认关闭支持)。尽管所有现代浏览器都支持<template>,但只有Chrome和Opera的最新版本才完全支持ShadowDOM。将about:configdom.webcomponents.enabled)中的必需功能切换为true 后,Firefox支持它的部分功能。

使用的目标ShadowDOM类似于MVC的
关注点分离。也就是说,我们希望将内容与演示文稿分开,并允许代码中包含封装的模板,以使其更易于管理。我们已经在各种编程语言中拥有了这个功能,但是在HTML和CSS中仍然存在一段时间了。此外,在样式化Web应用程序中的元素时,类名称可能会发生冲突。

通常,我们与LightDOM(一种“LightRealm”)互动,但有时利用封装会有所帮助。跨入此类“影子领域”(Web组件的一部分)是一种通过
允许封装
来防止上述问题的新方法。即使ShadowTreeShadowTree使用完全相同的类或选择器,应用于您内部标记的任何样式也不会应用于您外部的标记。

ShadowTree(驻留在中ShadowDOM)具有来自其LightDOM内部分布的树时,和/或ShadowTree呈现时,浏览器将结果转换为所谓的组合树

当浏览器呈现您的代码时,内容将被分发并插入到新位置, 而不是 实际键入的位置。分布式输出就是您所看到的(以及浏览器所看到的),称为composedtree。实际上,最初并不是按现在出现的顺序键入内容,但是您不会知道,浏览器也不会。如果需要的话,“最终结果”和“原始代码”之间的分隔是封装的主要好处之一。

Web组件和CSS的未来是在Web组件一个伟大的40分钟的视频并专门ShadowDOM,通过向我指出。

针对您的问题,::content伪元素适用于所谓的 分布式节点
。分布式节点是您在<content></content>标签内放置任何内容的另一个术语。内容将从其在原始标记中的位置 分发
到您<content>在模板中放置标签的任何位置。

因此,当您需要CSS的特殊性时,通常可以处理选择器的一种方法是转到父元素并将其添加为选择器的一部分。例如:如果.container{}不够具体,则可以使用div .container {}.main .container {}以使选择器起作用。

考虑到ShadowDOM的作用域(即范围和封装),您必须意识到,您创建的这个新ShadowTree是一个全新的(离散的)DOM片段。它与其余内容不在同一个“LightRealm”中;它在“影子领域”中。那么,CSS如何知道以“影子领域”为目标?通过使用::content伪元素!

**[所述::content伪元素选择器充当分布式节点的父元素。](http://drafts.csswg.org/css-

scoping/#content-combinator)**

HTML5Rocks都有大量的教程序列,这些教程涵盖了更多信息并给出了一些出色的示例(请确保使用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使用(记住要在基于WebKit的浏览器(例如Chrome或Opera)中访问)

在这里,您可以看到伪元素 首先 选择的内容(即标记中元素的内容), 然后 通过添加进一步指定。 ::contentsection pShadowRoot``div section p

与普通的CSS选择器用法相比,这似乎是不必要的(例如,为什么不使用section p {}?),直到您回想起遍历a时ShadowTree,您通常无法选择host元素的后代(分布式节点是),因为它们位于我之前提到过“影子领域”。



 类似资料:
  • 问题内容: 在以下情况下,为什么:after选择器需要content属性才能起作用? 请注意,直到您指定content属性,您才看不到伪元素: 为什么这是预期的功能?您可能会认为显示块将迫使该元素显示出来。奇怪的是,您实际上可以在Web调试器中看到样式。但是,它们不会显示在页面上。 问题答案: 以下是各种W3C规范和草案的参考: 选择器级别3 伪元素’:before’和’:after’可用于在元素

  • 问题内容: 如果我有一个光子列表,如何使用CSS伪元素:before {content:’‘}来影响?下面有三个选项,我想在每个选项之前插入文本。 我知道可以使用javascript / jQuery完成此操作,但是CSS是否可行? 问题答案: 实际上,和和伪元素在子元素之前/之后添加了一个子节点,因此,这对不能包含子节点的任何元素都无效。 (大致)等同于: 如果要更新文本值,则需要使用JavaS

  • 为了减少内核或跨进程内存泄漏(Spectre攻击),Linux内核1将使用一个新选项编译,引入到,以便通过所谓的retpoline执行间接调用。 这似乎是一个新发明的术语,因为谷歌搜索只是最近才使用(通常都是在2018年)。 1但是,它不是Linux特有的--类似或相同的构造似乎被用作其他操作系统缓解策略的一部分。

  • 问题内容: 和之间有什么区别?我们什么时候必须使用完? 双冒号和单冒号表示法是区分伪类和伪元素。 以上声明的实际含义是什么? 问题答案: 伪类: CSS伪类是关键字,其前面带有一个冒号(:),并添加到选择器的末尾,以指定要对选定元素进行样式设置( 仅当它们处于特定状态时) 。例如,您可能只想在元素被鼠标指针悬停时设置样式,或者在元素被禁用或选中时选中一个复选框,或者是作为其父元素在DOM树中的第一

  • 问题内容: 我想在Linux系统上用C编写一个简单的X终端仿真器。 一开始,我只是想我必须弹出一个shell并显示其输出。我检查了xterm和rxvt代码,它看起来更加复杂。 首先,我必须使用openpty打开一个伪终端。因此,我看了手册页,发现openpty填充了两个文件描述符,即主文件和从文件。由于这些特殊文件的系统相关性,因此xterm和rxvt代码都很混乱。 我了解termios的内容:这

  • 问题内容: 我有一个:before开头的’quote’和一个:after结束的报价。 现在,我想要的是一个:after:after供“引用”参考,但我无法使其正常工作。 有人知道这是否可能吗? 到目前为止,我的代码: 问题答案: 已经提出了嵌套和伪元素的想法;请参阅“生成和替换的内容”模块的这一部分。但是,该模块已被放弃,等待完全重写,因此在重新发布该文档之前,我不会屏息。即便如此,嵌套内容伪元素