Estou criando um widget para sites de terceiros, usando o DOM DOM para impedir que o CSS deles interfira no nosso. Estou usando os polyfills ShadyDOM e ShadyCSS para fazê-lo funcionar no Edge e no IE, mas ele não está transformando o CSS para o DOM da sombra, como seria de esperar.
Exemplo:
<!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>
No Chrome (que suporta sombra DOM nativamente), a stuff
div tem um plano de fundo rosa, como eu esperaria. Mas no Edge (que não oferece suporte nativo ao shadow DOM), vejo o texto "coisas dentro do shadow dom" (ou seja, meu script foi executado e as funções do ShadyDOM funcionaram), mas não vejo o fundo rosa.
Por que isso está acontecendo? Estou anexando uma raiz de sombra a uma div antiga simples, em vez de usar elementos personalizados, como o exemplo no README do ShadyCSS, mas isso importa? Se sim, como posso fazer isso funcionar? Estou trabalhando em um aplicativo grande e existente, e não quero fazer muitas alterações de uma só vez; portanto , prefiro usar os elementos HTML padrão que já estou usando ( div
s, button
s, etc.) em vez de criar o meu próprios elementos ou modelos , embora eu esteja disposto a considerar modelos e / ou elementos personalizados, se isso puder ser feito facilmente, sem ter que fazer muitas grandes mudanças.
:host
seletor de CSS, os estilos serão aplicados. Mas eles também são aplicados a coisas fora da raiz das sombras, o que eu não quero.
ShadyCSS.styleElement(element)
e ShadyCSS. styleSubtree(element)
e eles não funcionou.
style
tags no lugar certo e ajustar as dimensões adequadamente. É lento na renderização e complicado de lidar, então eu mudei para usar o DOM DOM. Agora, ele funciona perfeitamente em todos os navegadores que não são da Microsoft. Estou tentando fazê-lo funcionar no Edge e no IE usando o polyfill, mas não está funcionando.
style
elemento diretamente àdiv
raiz interna, em vez da raiz da sombra, anexar ostyle
elemento depois de anexar o internodiv
e definirinnerHTML
ostyle
elemento depois de anexá-lo. Mas nada disso ajudou.