是否有人在 IE 11 或 Edge 中创建了一个 Shadow DOM 来阻止来自 bleeding/leaking 的样式表的 Shadow DOM?
Has anyone created a Shadow DOM that stops stylesheets from bleeding/leaking out of a Shadow DOM in IE 11 or Edge?
我需要一个 Web 组件,它不允许样式从 IE 11 或 Edge 中的阴影 DOM 渗出。内联样式可以工作,但我需要使用样式表。
我已经尝试了所有方法,包括标准 Web 组件、polymer/LiteElement、react-shadow-dom-component 和普通的旧 JS。我附加的代码非常基础。这个例子没有使用样式表,它仍然流血。我尝试了多个 polyfill。我也尝试过使用 defer 和 async 加载程序。非常感谢任何帮助。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello-world</title>
<!-- Imports polyfill -->
<!--<script src="../webcomponentsjs/webcomponents.min.js"></script>-->
<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-
bundle.js"></script>
<script src="https://unpkg.com/@webcomponents/webcomponentsjs@^2/">
</script>
<!--<script src="node_modules/custom-elements-es5-adapter/custom-
elements-es5-adapter.js"></script>-->
<!-- Imports custom element -->
<!--<link rel="import" href="hello-world.html">-->
<!--<script src="shadowComponent.js"></script>-->
<style>
.text {
color: red;
}
</style>
</head>
<body>
<div class="text">I should be red.</div>
<div id="myText"></div>
<script type="text/javascript">
var element = document.getElementById('myText');
var styles = '.text{color: blue; }';
var content = 'I should be blue.';
var style = document.createElement('style');
style.type = 'text/css';
style.appendChild(document.createTextNode(styles));
var p = document.createElement('p');
p.className = 'text';
p.appendChild(document.createTextNode(content));
var shadowRootContainer = element.attachShadow({ mode: 'open' });
var innerContainer = document.createElement('div');
shadowRootContainer.appendChild(innerContainer);
var shadowRoot = innerContainer.attachShadow({ mode: 'open' });
shadowRoot.appendChild(style);
shadowRoot.appendChild(p);
</script>
</body>
</html>
在这个例子中有一个嵌套的影子 DOM 因为我束手无策,决定把一些代码扔到墙上看看是否有任何东西会粘住。我知道顺序对样式很重要。我希望使用 polyfill 这应该可以工作。它适用于 Chrome(显然)FF 和 Opera。如有必要,我有更复杂的例子。再次感谢您的帮助。
IE11 或 Edge (pre-chromium) 中没有 shadowDOM。所以没有built-in方法来防止shadowDOM渗透。
如果您使用 BEM 之类的东西或 name-spacing 您的 CSS 选择器的其他方式,您可以限制渗透。
你几乎可以用 ShadyCSS component of the webcopmonentsjs polyfill. There are some limitations 模拟 ShadowDOM 作用域 CSS 并且它只会在组件中包含 CSS,它不会阻止外部样式泄漏。
我需要一个 Web 组件,它不允许样式从 IE 11 或 Edge 中的阴影 DOM 渗出。内联样式可以工作,但我需要使用样式表。
我已经尝试了所有方法,包括标准 Web 组件、polymer/LiteElement、react-shadow-dom-component 和普通的旧 JS。我附加的代码非常基础。这个例子没有使用样式表,它仍然流血。我尝试了多个 polyfill。我也尝试过使用 defer 和 async 加载程序。非常感谢任何帮助。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello-world</title>
<!-- Imports polyfill -->
<!--<script src="../webcomponentsjs/webcomponents.min.js"></script>-->
<script src="/node_modules/@webcomponents/webcomponentsjs/webcomponents-
bundle.js"></script>
<script src="https://unpkg.com/@webcomponents/webcomponentsjs@^2/">
</script>
<!--<script src="node_modules/custom-elements-es5-adapter/custom-
elements-es5-adapter.js"></script>-->
<!-- Imports custom element -->
<!--<link rel="import" href="hello-world.html">-->
<!--<script src="shadowComponent.js"></script>-->
<style>
.text {
color: red;
}
</style>
</head>
<body>
<div class="text">I should be red.</div>
<div id="myText"></div>
<script type="text/javascript">
var element = document.getElementById('myText');
var styles = '.text{color: blue; }';
var content = 'I should be blue.';
var style = document.createElement('style');
style.type = 'text/css';
style.appendChild(document.createTextNode(styles));
var p = document.createElement('p');
p.className = 'text';
p.appendChild(document.createTextNode(content));
var shadowRootContainer = element.attachShadow({ mode: 'open' });
var innerContainer = document.createElement('div');
shadowRootContainer.appendChild(innerContainer);
var shadowRoot = innerContainer.attachShadow({ mode: 'open' });
shadowRoot.appendChild(style);
shadowRoot.appendChild(p);
</script>
</body>
</html>
在这个例子中有一个嵌套的影子 DOM 因为我束手无策,决定把一些代码扔到墙上看看是否有任何东西会粘住。我知道顺序对样式很重要。我希望使用 polyfill 这应该可以工作。它适用于 Chrome(显然)FF 和 Opera。如有必要,我有更复杂的例子。再次感谢您的帮助。
IE11 或 Edge (pre-chromium) 中没有 shadowDOM。所以没有built-in方法来防止shadowDOM渗透。
如果您使用 BEM 之类的东西或 name-spacing 您的 CSS 选择器的其他方式,您可以限制渗透。
你几乎可以用 ShadyCSS component of the webcopmonentsjs polyfill. There are some limitations 模拟 ShadowDOM 作用域 CSS 并且它只会在组件中包含 CSS,它不会阻止外部样式泄漏。