如何定义动态注入元素的Polymer@imports/样式表的范围?

如何定义动态注入元素的Polymer@imports/样式表的范围?,polymer,Polymer,我目前正在为Prism.js(语法高亮)开发一个聚合元素。该元素是托管的,并且也位于GitHub中。我试图做的是允许用户设置一个属性theme,它决定我们拉入哪个主题文件。用户应该能够为每个元素设置不同的主题,并且这些样式的范围正确 例如,如果您使用配置元素,当元素初始化时,我们将读取主题中的值,并通过@import注入prism.css。如果我有另一个实例,则为每个元素拉入的主题不应该冲突 不幸的是,尽管输出结果在Canary中是正确的(每个元素的样式不冲突) 在Chrome stable中

我目前正在为Prism.js(语法高亮)开发一个聚合元素。该元素是托管的,并且也位于GitHub中。我试图做的是允许用户设置一个属性
theme
,它决定我们拉入哪个主题文件。用户应该能够为每个元素设置不同的主题,并且这些样式的范围正确

例如,如果您使用
配置元素,当元素初始化时,我们将读取
主题中的
值,并通过
@import
注入
prism.css
。如果我有另一个实例
,则为每个元素拉入的主题不应该冲突

不幸的是,尽管输出结果在Canary中是正确的(每个元素的样式不冲突)

在Chrome stable中,这些样式不受范围限制且相互碰撞:

我想知道是否有可靠的方法来解决这个问题

迄今为止,我已尝试:

  • 使用
    作用域
    属性注入我的样式-这要么不受支持,要么不起作用
  • 在我的
    shadowRoot
    中添加一个样式表链接-这与样式冲突的问题相同
  • 使用
    shimStyling
    -相同问题
  • 根据以下文档使用我的模板样式表:

var sheet=document.querySelector('style').sheet;
var hostRules=sheet.cssRules[0];
hostRules.cssText='@import url(“+this.themepath+”)”;

或者,我想知道是否可以设置我的元素,以便在模板的
@import
中更新
{{theme}}
,如下所示:


:host{display:block;};
@导入'bower_components/prismjs/prism-{{theme}}.css';


尽管如此,我不确定让它发挥作用是否能解决我的范围界定问题。不幸的是,内联所有主题不是一个选项。有什么想法吗?:)

遗憾的是,在ShadowDOM polyfill下实现每个实例的主题选择可能不太现实

本机ShadowRoot可用的CSS范围很难填充。今天,polyfill做了很多技巧和翻译,以便在保持效率的同时提供一些范围

但是,有两类范围界定问题存在问题:

  • 每个实例范围(现在CSS填充程序按类型运行)
  • 下限封装(元素的样式可能会泄漏到其子树中的其他元素中)
  • 考虑到这些约束条件,仍然有很多事情可以很好地工作,但是,特别是像您希望的那样使用CSS并没有得到很好的支持

    正在通过CSS垫片探索对(模拟的)每个实例范围界定的必要支持。如果出现问题,我将尽力更新此问题。

    FWIW,您现在可以。