1

我正在尝试仅使用 ShadowDOM v1(没有 Polymer 或其他 Web 组件),但我无法让样式与 polyfill 一起使用。

特殊:host::slottedCSS 选择器不起作用。

我已经尝试过各种 polyfills,但是 TBH,我有点迷路了。我见过这个问题,但它使用的是自定义元素和模板。我的情况是没有这些。

谁能帮我让这段代码在 Firefox 或 Edge 中工作?- 具体来说,您应该看到三种颜色:蓝色、红色和黄色,但只有红色有效。

const shadowHtml =
  `<style>
    :host {
      background: yellow;
    }
    .inside {
      background: red;
      margin: 10px;
    }
    ::slotted(div[slot="content"]) {
      background: blue;
      color: white;
    }
    </style>
    <div>
      <p>i am yellow</p>
      <div class=inside>i am red</div>
      <slot name="content"></slot>
    </div>`;
  

const root = document.querySelector('#root');
const shadow = root.attachShadow({ mode: 'open' });
shadow.innerHTML = shadowHtml;
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Shadow DOM v1 Test</title>
  <script src="https://rawgit.com/webcomponents/webcomponentsjs/v1/webcomponents-lite.js"></script>
</head>
<body>
  <div id=root>
    <div slot="content">
      <p>I am blue</p>
    </div>
  </div>
</body>
</html>

4

1 回答 1

3

webcomponents-lite.js "v1" 现在嵌入了 Shadow DOM v1 polyfill:

  • 提供的ShadyDOM垫片attachShadow()
  • 模拟和的ShadyCSS对象。:host::slotted()

请注意,要使用它,您必须将模板字符串放在<template>元素中才能调用ShadyCSS.prepareTemplate()

const makeTemplate = function (strings) {
    const template = document.createElement('template');
    template.innerHTML = strings[0];
    return template;
}

const shadowHtml =
  makeTemplate`<style>
    :host {
      background: yellow;
    }
    .inside {
      background: red;
      margin: 10px;
    }
     ::slotted(div[slot="content"]) {
      background: blue;
      color: white;
    }
    </style>
    <div>
      <p>i am yellow</p>
      <div class=inside>i am red</div>
      <slot name="content"></slot>
    </div>`
ShadyCSS.prepareTemplate(shadowHtml, 'div');
  
const root = document.querySelector('#root');
const shadow = root.attachShadow({ mode: 'open' });
shadow.innerHTML = shadowHtml.innerHTML;
<script src="https://cdn.rawgit.com/webcomponents/shadydom/master/shadydom.min.js"></script>
<script src="https://cdn.rawgit.com/webcomponents/shadycss/master/scoping-shim.min.js"></script>

<div id=root>
  <div slot="content">
    <p>I am blue</p>
  </div>
</div>

于 2017-02-18T18:36:56.057 回答