Как использовать селектор css, который ссылается на элемент вне теневого корня

Мне нужно стилизовать компонент на основе класса, прикрепленного к <body>.
logo-placeholder содержится внутри теневого корня.
body, конечно же, снаружи.

Вот чего я хотел бы добиться:

.logo-placeholder {
  background: url(logo_LIGHT.png);
}

body.dark .logo-placeholder {
  background: url(logo_DARK.png);
}
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Огромная точка с автономным теневым домом. Это касается и CSS. Думайте о каждом компоненте как о собственном HTML-документе.

Если вы хотите стилизовать элемент внутри заполнителя, вам нужно сделать что-то вроде этого.

<body>
  <custom-element class = "dark-background"></custom-element>
</body>

Затем внутри custom-element стилизуйте свой div на основе класса хозяин.

:host(.dark-background) .logo-placeholder {
  background: url(logo_DARK.png);
}

Другой способ — использовать свойства CSS.

body custom-element {
  --logo-placeholder-background: 'logo_LIGHT.png';
}

body.dark custom-element {
  --logo-placeholder-background: 'logo_DARK.png';
}

Затем объявите следующее внутри вашего custom-element

.logo-placeholder {
  --background-fallback: 'logo_LIGHT.png';

  background: url(var(--logo-placeholder-background, --background-fallback);
}

Конечно, но это было бы неудобно. Я хочу настроить тело на <body class = "dark"> и хочу, чтобы компоненты реагировали на это. Кроме того, использование переменных css означает, что мне нужно установить их вне компонента, что еще больше нарушает разделение.

Zanna_37 07.05.2022 14:43

Я действительно нашел решение с :host-context(). Я постараюсь обновить ваш ответ, когда stackoverflow позволит мне это сделать.

Zanna_37 07.05.2022 18:19

Просто сделайте свой собственный ответ и установите его как правильный, чтобы люди могли ссылаться на эту тему в будущем. Хорошо, что в итоге все обошлось. :)

Rickard Elimää 08.05.2022 09:55
Ответ принят как подходящий

Полное решение будет следующим:

:host-context(body.dark) .logo-placeholder {
  background: url(logo_DARK.png);
}

:host-context(body.dark) означает, что селектор body.dark должен оцениваться в контексте хост-контейнера, а не на основе теневого DOM. Вот почему это работает.


Всякий раз, когда мы хотим, чтобы пользовательский элемент был оформлен на основе его положения в DOM, а не подчинялся правилам теневого DOM, мы можем использовать :host-context() селектор.

[:host-context()] allows a custom element, or anything within that custom element's shadow DOM, to apply different styles based on its position within the outer DOM or classes/attributes applied to ancestor elements.

Another typical use would be to allow inner elements to react to classes or attributes on any ancestor elements - for example, applying a different text color when a .dark-theme class is applied to <body>.

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