Возьмите указатели из моего другого ответа: Используйте CSS селекторы, такие как: первый ребенок внутри тени dom
Ваши элементы остаются скрытыми в lightDOM!
any применяемый вами глобальный стиль (в любое время) будет отраженным для shadowDOM
customElements.define('my-custom-element', class extends HTMLElement {
constructor(){
super()
.attachShadow({mode: 'open'})
.innerHTML = `<slot></slot><style>:host { color: red; }</style>`;
}
});
<div>
<my-custom-element>first</my-custom-element>
<my-custom-element>... more elements</my-custom-element>
<my-custom-element>last</my-custom-element>
</div>
<style>
div my-custom-element:last-child {
padding: .5em;
background: green;
}
</style>
Примечания:
Re: comment:
Это может быть реальный ответ, но это облом, я думал, что весь смысл теневого дома должен быть самодостаточным, если мне нужно написать некоторые стили в глобальном затем таблица стилей для того, чтобы создать стиль в теневом домике, который не кажется чем-то особенным, неудивительно, что люди тяготеют к таким вещам, как реакция и vue, когда веб-стандарты настолько плохи.
Думайте об этом так. если ваши my-custom-element
, где <p>
элементы; как бы <p>
узнал, что это внутри last-child
... только путем ссылки на его родительский контейнер .
Если вы не хотите, чтобы этот контейнер был глобальной областью действия, тогда:
неудивительно, что люди тяготеют к таким вещам, как React и Vue, когда веб-стандарты настолько плохи.
Все Каркасы делают точно так же, они упаковывают вещи в контейнеры (будь то в обычном DOM, shadowDOM, виртуальном DOM (памяти)
Лучше сказать: Frameworks frame ваш контент в контейнерах .. всегда
Стандартный API пользовательских элементов W3 C дает 100% -ный контроль использовать контейнер или нет.
Да, это означает, что вы должны выполнить некоторые сценарии / готовить, прежде чем сможете пообедать.
У вас есть 100% свобода в том, как вы хотите готовить компоненты.
React добавляет 48 КБ (GZipped) к вашей загрузке, не говоря уже о всем процессе сборки, не говоря уже о нем никогда не будет работать в унисон с любым другим фреймворком, не говоря уже о том, что он даже не соответствует стандарту ES.
Дополнительный пользовательский элемент занимает у вас около 15 минут, а может и 200 байт