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