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.
fuente
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ó.: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)
yShadyCSS. 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.Respuestas:
Con ShadyCSS
:host
El pseudo-elemento CSS no se conoce en Edge.Para que funcione, debe usar
ShadyCSS.prepareTemplate()
que reemplazará: host por el nombre del elemento personalizado y definir el estilo como un estilo global que se aplicará a toda la página.Recuerde que no hay Shadow DOM en Edge: no hay límites / alcance para CSS con un Shadow DOM falso / polifundido.
En su caso, podría usar
ShadyCSS.prepareTemplate( yourTemplate, 'div' )
como en el siguiente ejemplo:Nota: dado que el polyfill reemplazará: host por div y lo agregará como un estilo global, podría observar algunos efectos secundarios si tiene otra parte de código HTML que coincida
div .stuff
.Sin ShadyCSS
ShadyCSS fue diseñado para elementos personalizados, pero no realmente para elementos estándar. Sin embargo, debe inspirarse en el polyfill y crear explícitamente las propiedades de estilos para Shadow DOM falso (polyfilled). En su caso, reemplace
:host
condiv#containter
:fuente