如何将常见CSS样式一次性应用于多个Shadow Roots?

7
考虑到我有一些使用Shadow DOM隐藏其内部div-soup和布局的元素。
尽管它们是不同的,但它们共享相同的CSS样式表,因为它们使用的是应该以一致方式进行样式化的同一组元素。例如,这可能是一个CSS框架(bootstrap)。
问题在于这个样式表非常大。
在许多Shadow Roots之间共享如此庞大的样式表的最有效方法是什么?
1个回答

8

更新:2019年 - 使用构造样式表

截至2019年,使用构造样式表是将样式表应用于影子DOM和web组件的方法。在此处了解更多

之前的答案:

您可以在Shadow DOM中定义的<style>元素的第一行使用import CSS规则:

<div id=D1></div>
<template id=T1>
   <style>
      @import url( '/css/stylesheet.css' )
   </style>
   ...
</template>

然后在 Shadow DOM 根元素中导入 <template>content

var root = D1.attachShadow( {mode: open } )
root.appendChild( T1.content.cloneNode( true ) )

1
谢谢!我已经用你的解决方案创建了jsbin http://jsbin.com/veruki/edit?html,output - tomalec
2
如果在<head>中有一个包含全局样式的<style>元素,我们该怎么办呢?由于它只是一个字面上的元素,所以无法使用@import导入。在这种情况下,你会怎么做? - trusktr
@trusktr 我想我会克隆样式元素,将其注入模板或直接注入到 Shadow DOM 中。 - Supersharp
3
现在你也可以在 Shadow DOM 中使用 <link rel="stylesheet">。 - Supersharp
截至2021年12月,这仍然是Chrome独有的功能,Firefox犹豫是否推出,并将其隐藏在“about:config > layout.css.constructable-stylesheets.enabled”后面。即使caniuse.com目前也不知道它。同时,<link rel="stylesheet".../>在两者中都可以使用,另外还有<style>@import...</style> - sunny moon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接