サードパーティのWebサイト用のウィジェットを構築しています。シャドウDOMを使用して、CSSが私たちのWebサイトに干渉しないようにしています。私が使用していますShadyDOMとShadyCSSそれがエッジで動作させるためpolyfillsをし、IEが、私が期待するように、影のDOMのためのCSSを変換されていません。
例:
<!DOCTYPE html>
<html>
<head>
<title>Shadow DOM test</title>
</head>
<body>
<div id="container">container is here</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.3.0/webcomponents-bundle.js"></script>
<script>
const shadow = document.getElementById("container").attachShadow({ mode: "open" });
const style = document.createElement("style");
style.innerHTML = `
:host .stuff {
background: #ff00ff;
}
`;
shadow.appendChild(style);
const div = document.createElement("div");
div.classList.add("stuff");
div.innerHTML = "stuff inside shadow dom";
shadow.appendChild(div);
</script>
</body>
</html>
Chrome(ネイティブでシャドウDOMをサポート)では、stuff
divの背景がピンクになります。しかし、Edge(これはシャドウDOMをネイティブではサポートしていません)では、「シャドウDOMの内部にあるもの」というテキスト(スクリプトが実行され、ShadyDOM関数が機能したことを意味します)は表示されますが、ピンク色の背景は表示されません。
なんでこんなことが起こっているの?ShadyCSS READMEの例のようにカスタム要素を使用する代わりに、プレーンな古いdivにシャドウルートをアタッチしていますが、それは重要ですか?もしそうなら、私はどのようにこれを機能させることができますか?私は大きな既存のアプリに取り組んでいて、一度に多くの変更を加えたくないので、私が思いつくのではなくdiv
、すでに使用している標準のHTML要素(s、button
sなど)を使用することを強くお勧めします独自の要素またはテンプレート。ただし、大きな変更を加えることなく、簡単に行うことができる場合は、テンプレートやカスタム要素を検討します。
:host
CSSセレクターからを削除すると、スタイルが適用されます。しかし、それらはシャドウルートの外にあるものにも適用されます。
ShadyCSS.styleElement(element)
とShadyCSS. styleSubtree(element)
、彼らは動作しませんでした。
style
、適切な場所にタグを配置して寸法を適切に調整するいくつかのトリックを実行することで機能します。レンダリングが遅く、扱いにくいので、シャドウDOMを使用するように変更しました。現在では、Microsoft以外のすべてのブラウザで美しく動作します。EdgeとIEでポリフィルを使用して機能させようとしていますが、機能しません。
style
要素をdiv
シャドウルートの代わりに内部に直接style
追加する、内部を追加した後に要素を追加する、追加した後に要素のdiv
を設定するinnerHTML
など、いくつかのことを試しましstyle
た。しかし、それらのどれも助けにはなりませんでした。