Заставить переменные css отбирать дочерние компоненты

Я использую Polymer 2 для создания библиотеки компонентов, но у меня возникают проблемы с переменными css в браузерах, отличных от Chrome.

У меня есть компонент-оболочка (x-page), и у него есть свойство темы, которое может быть light или же dark, Мой CSS выглядит примерно так:

:host([light]) {
    ---color-1: rgb(200,200,200);
    ---color-2: rgb(210,210,210);
}
:host([dark]) {
    ---color-1: rgb(10,10,10);
    ---color-2: rgb(20,20,20);
}

Теперь я хочу использовать эти переменные во всех компонентах в этой оболочке (не только непосредственно в слотах, все они, включая их теневой корень).

В Chrome это работает нормально, так как дети будут читать переменные из оболочки, но в других браузерах это не работает, хотя я использую polyfill apply-shim и пробовал также с пользовательскими стилями.

Я ценю вашу помощь:)

1 ответ

Для того чтобы стили CSS могли применяться с полифилом Shadow DOM, сначала необходимо подготовить <template> вы добавляете к теневому корню ShadyCSS.prepareTemplate() функция, как объяснено на странице полизаполнения ShadyCSS:

ShadyCSS.prepareTemplate( template1, 'x-page' )

Пример:

ShadyCSS.prepareTemplate( template1, 'x-page' )
class XPage extends HTMLElement {
    constructor() {
        super()
        this.attachShadow( { mode: "open" } )
            .appendChild( template1.content.cloneNode( true ) )
    }
}
customElements.define( 'x-page', XPage )
<script src="https://rawgit.com/webcomponents/webcomponentsjs/master/webcomponents-bundle.js"></script>

<template id="template1">
    <style>
        :host([light]) {
            ---color-1: red;
            ---color-2: pink;
        }
        :host([dark]) {
            ---color-1: yellow;
            ---color-2: black;
        }
        span { 
            color: var(---color-1);
            background-color: var(---color-2);
        }
    </style>
    <span><slot></slot></span>
</template>

<x-page light>Light</x-page>
<x-page dark>Dark</x-page>

Другие вопросы по тегам