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.
fonte
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.: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)
eShadyCSS. 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.Respostas:
Com ShadyCSS
:host
O pseudoelemento CSS não é conhecido no Edge.Para fazê-lo funcionar, você deve usar
ShadyCSS.prepareTemplate()
que substituirá: host pelo nome do elemento personalizado e defina o estilo como um estilo global que será aplicado a toda a página.Lembre-se de que não há Shadow DOM no Edge: não há limites / escopo para CSS com um Shadow DOM falso / polifilmado.
No seu caso, você pode usar
ShadyCSS.prepareTemplate( yourTemplate, 'div' )
como no exemplo abaixo:Nota: como o polyfill substituirá: host por div e o adicionará como um estilo global, você poderá observar alguns efeitos colaterais se tiver outra parte do código HTML que corresponda
div .stuff
.Sem ShadyCSS
O ShadyCSS foi projetado para elementos personalizados, mas não para elementos padrão. No entanto, você deve se inspirar no polyfill e criar explicitamente as propriedades de estilo para o Shadow DOM falso (polyfilled). No seu caso, substitua
:host
pordiv#containter
:fonte