1

我正在尝试使用 ShadowDomv1(使用https://github.com/webcomponents/webcomponentsjshttps://github.com/webcomponents/shadycss),但它不起作用。

ShadowDom 本身可以工作,但 css 没有被封装(正如我们可以看到的h2css 规则)。

它在 Chrome 和 Safari 上按预期工作(但它们都支持 ShadowDomv1)。

我错过了什么还是不可能?

这里的jsbin:http ://jsbin.com/maqohoxowu/edit?html,output

和代码:

<script type="text/javascript" src="https://rawgithub.com/webcomponents/webcomponentsjs/master/webcomponents-hi-sd-ce.js"></script>
<style type="text/css">
    h2 {
        color: red;
        border-bottom: 1px black dotted;
    }
</style>
<h2>h2 red and dotted</h2>

<my-element>
</my-element>

<template id="myElementTemplate">
    <style scope="my-element">
        h2 {color: blue}
    </style>
    <div>
        <h2>h2 blue and not dotted !</h2> <!-- Should not be dotted because of the encapsulation -->
    </div>
</template>

<script type="text/javascript">
    ShadyCSS.prepareTemplate(myElementTemplate, 'my-element');

    class MyElement extends HTMLElement {
        connectedCallback() {
            ShadyCSS.styleElement(this);

            if (!this.shadowRoot) {
                this.attachShadow({mode: 'open'});
                this.shadowRoot.appendChild(document.importNode(myElementTemplate.content, true));
            }
            ShadyCSS.styleElement(this);
        }
    }

    customElements.define("my-element", MyElement);
</script>
4

3 回答 3

1

您可以使用CustomStyleInterface将文档级样式仅应用于非 Shadow DOM:

const CustomStyleInterface = window.ShadyCSS.CustomStyleInterface;
CustomStyleInterface.addCustomStyle(document.querySelector('style.doc-level'));

class MyElement extends HTMLElement {
  connectedCallback() {
      this.attachShadow({ mode: 'open' });
      this.shadowRoot.appendChild(document.importNode(myElementTemplate.content, true));
  }
}

customElements.define("my-element", MyElement);
<script src="https://rawgithub.com/webcomponents/webcomponentsjs/master/webcomponents-hi-sd-ce.js"></script>
<script src="https://rawgit.com/webcomponents/shadycss/master/custom-style-interface.min.js"></script>

<style class="doc-level">
  h2 {
    color: red;
    border-bottom: 1px black dotted;
  }
</style>

<h2>h2 red and dotted</h2>

<my-element></my-element>

<template id="myElementTemplate">
    <style>
        h2 {color: blue}
    </style>
    <div>
        <h2>h2 blue and not dotted !</h2> 
    </div>
</template>

于 2017-11-03T21:10:50.050 回答
0

polyfill 无法模拟由真正的 ShadowDOM 原生处理的 CSS 封装。

相反,如果您打算同时使用两者,请避免使用简单的 CSS 选择器。而是尝试使用像 BEM 这样的 CSS 命名模式:http: //getbem.com/introduction/

这将允许您的 CSS 在大多数情况下在真正的 ShadowDOM 和 ShadyDOM 中工作。

于 2017-11-15T03:18:44.350 回答
0

根据 Mozilla 的平台状态页面,Shadow DOM 仍在开发中。 https://platform-status.mozilla.org/#shadow-dom

于 2017-11-02T19:08:56.017 回答