Estoy creando un widget para sitios web de terceros, usando shadow DOM para evitar que su CSS interfiera con el nuestro. Estoy usando los polyfills ShadyDOM y ShadyCSS para que funcione en Edge e IE, pero no está transformando el CSS para el DOM de sombra como era de esperar.
Ejemplo:
<!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>
En Chrome (que admite shadow DOM de forma nativa), el stuff
div tiene un fondo rosa, como era de esperar. Pero en Edge (que no es compatible con shadow DOM de forma nativa), veo el texto "cosas dentro de shadow dom" (lo que significa que mi script se ejecutó y las funciones ShadyDOM funcionaron), pero no veo el fondo rosa.
¿Por qué está pasando esto? Estoy adjuntando una raíz de sombra a un viejo div simple, en lugar de usar elementos personalizados como lo hace el ejemplo en ShadyCSS README, pero ¿eso importa? Si es así, ¿cómo puedo hacer que esto funcione? Estoy trabajando en una aplicación grande y existente, y no quiero hacer demasiados cambios a la vez, por lo que preferiría usar los elementos HTML estándar que ya estoy usando ( div
s, button
s, etc.) en lugar de crear mi propios elementos o plantillas , aunque estaría dispuesto a considerar plantillas y / o elementos personalizados si se puede hacer fácilmente, sin tener que hacer muchos cambios importantes.
:host
del selector CSS, entonces los estilos se aplican. Pero también se aplican a cosas fuera de la raíz de la sombra, que no quiero.
ShadyCSS.styleElement(element)
y ShadyCSS. styleSubtree(element)
no funcionaron.
style
etiquetas en el lugar correcto y ajustar las dimensiones adecuadamente. El procesamiento es lento y engorroso de manejar, por lo que lo cambié para usar DOM de sombra. Ahora funciona perfectamente en todos los navegadores que no son de Microsoft. Estoy tratando de hacerlo funcionar en Edge e IE usando el polyfill, pero no funciona.
style
elemento directamente al interior endiv
lugar de la raíz de la sombra, agregar elstyle
elemento después de agregar el interiordiv
y configurarinnerHTML
elstyle
elemento después de agregarlo. Pero ninguna de esas cosas ayudó.