web-component - 如何避免在影子 DOM 中重复样式?

标签 web-component shadow-dom templatetags

我是网络组件的新手,所以不确定是否有关于这个的简单答案或最佳实践。

如果我想创建一系列具有封装样式的重复元素,我该如何避免对每个元素重复样式 block 。

我使用的代码的简化版本是:

<ul id="wrapper"></ul>

<template id="template">
  <style>
    li { color: red }
  </style>

  <li></li>
</template>

<script>
var wrapper = document.getElementById('wrapper');
var tpl = document.getElementById('template');
var shadow = wrapper.createShadowRoot();
var arr = ['a', 'b', 'c'];

for(var i = 0, ii = arr.length; i < ii; i++) {
  tpl.content.querySelector('li').textContent = arr[i];

  var clone = document.importNode(tpl.content, true);

  shadow.appendChild(clone);
}
</script>

我遇到的问题是影子 DOM 对于每个 <li> 都有一个重复的样式 block 。 ,我不确定最好的解决方法。

我试过嵌套模板,要么永远行不通,要么我做的不对。

最佳答案

如何检查样式元素并单独导入它?

<ul id="wrapper"></ul>

<template id="template">
  <style>
    li { color: red }
  </style>

  <li></li>
</template>

<script>
var wrapper = document.getElementById('wrapper');
var tpl = document.getElementById('template').cloneNode(true);
var shadow = wrapper.createShadowRoot();

var style = tpl.content.querySelector('style');
if (style) {
  tpl.content.removeChild(style);
  shadow.appendChild(document.importNode(style, true));
}

var arr = ['a', 'b', 'c'];
for(var i = 0, ii = arr.length; i < ii; i++) {
  tpl.content.querySelector('li').textContent = arr[i];
  shadow.appendChild(document.importNode(tpl.content, true));
}
</script>

关于web-component - 如何避免在影子 DOM 中重复样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876163/

相关文章:

javascript - shadowdomv1 在 firefox 上的兼容性

selenium-webdriver - 如何正确地将 shadow DOM CSS 选择器转换为非 shadow-DOM 选择器

Javascript 绑定(bind)函数到 Shadow DOM 和自定义元素

css - 我不能使用 django 模板标签换行符和证明

django - 使用 django 模板 url 标签时,项目名称自动插入到 url 中

web-component - vaadin 流 - Google 报告 : I'm sorry your browser is not supported

polymer - 纸张对话框中的自动对焦纸张输入只能工作一次?

javascript - 使用 polyfill 的 Shadow DOM v1 样式

python - 链接 `if` 和 `url` 模板标签

javascript - 为什么不组合复选框输入更改事件?