Комментарии 14
Повлиять на стиль компонента с Shadow DOM легко: стили уровня :host могут быть переопределены снаружи как и у любого другого DOM-элемента. Для пробрасывания свойств в более глубокие слои — используются CSS-переменные, и это значительно лучше и удобнее отсутствия инкапсуляции. Microsoft поддержку пилит в данный момент (официальный статус). Хотя, конечно, не известно сколько они ее будут еще пилить, возможно и не успеют до перехода на новый движок с такими темпами. Остальное тоже, так или иначе, решается, но если нужна поддержка IE — наверное не стоит связываться. Зависит от того, сколько у вас реальных юзеров на IE.
Повлиять на стиль компонента с Shadow DOM легко: стили уровня :host могут быть переопределены снаружи как и у любого другого DOM-элемента
Я имел в виду стили именно не host уровня, а те, что сидят под shadowRoot компонента. вот пример того что я имею в виду в index.html я пытаюсь повлиять на стиль .test-class, но нет никакого эффекта. Именно поэтому для части компонент, например, календаря, пришлось отказаться от использования shadowRoot, так как часть стилей (цвета, например) иногда нужно переопределять. Скажем, в angular, вроде можно было использовать :ng-deep для таких целей
К сожалению, процент пользователей IE крайне высок.
Больше чем в среднем по статистике? caniuse.com/usage-table
в index.html я пытаюсь повлиять на стиль .test-class, но нет никакого эффекта
Снаружи:
:root {
--color: #F00;
}
Внутри компонента (из Вашего примера):
connectedCallback() {
let shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `<style>
.test-class {
background-color: var(--color, #EEE);
}
</style>
<div class="test-class">Test text</div>`
}
И да, шаблон лучше добавлять не в connectedCallback, а в конструкторе и не парсить каждый раз HTML а клонировать (cloneNode) из заранее созданного контейнера template. И вообще, лучше создать базовый класс блэкджеком и биндингами и наследоваться от него.
Больше чем в среднем по статистике?
О да, в десятки раз. Примерно половина.
И вообще, лучше создать базовый класс блэкджеком и биндингами и наследоваться от него
В статье упоминался lit-element, как вариант.
Спасибо за :root — поэкспериментирую (проверил на stackblitz — работает). Если добавить в документацию к компонентам — вполне себе решение
<my-button big style="--color: #F00">Press Me!</my-button>
Я понял ваш способ, но только что нашел один недостаток. Перегрузить можно только то что предусмотрел разработчик компонента. То есть на самом деле, если внутри shadow написано строго display: block, то я не смогу снаружи это поведение изменить.
Custom elements в бою