Кратко
СкопированоПсевдокласс :host
применяется внутри Shadow DOM и позволяет стилизовать корневой элемент (хост), к которому прикреплён Shadow DOM. Вариант с функцией :host
позволяет задать условие — например, стилизовать хост только если у него есть определённый атрибут или класс.
Пример
Скопировано<template id="my-box-template"> <style> ::slotted(h1) { color: #FF8630; } ::slotted(p) { font-size: 1.2rem; } :host { display: block; padding: 1em; border-radius: 5px; } :host(.warning) { border-radius: 1.4rem; border: 5px solid red; } :host([disabled]) { opacity: 0.5; pointer-events: none; } </style> <div class="card" part="box"> <slot name="title">Пустая карточка 😔</slot> <slot name="content"></slot> </div></template><my-box> <h1 slot="title">Крутая карточка 😎</h1> <p slot="content">Контент очень крутого бокса</p></my-box><my-box class="warning"> <h1 slot="title">Внимание ⚠️</h1> <p slot="content">Это предупреждающий бокс</p></my-box><my-box disabled> <h1 slot="title">Отключённый бокс 🚫</h1> <p slot="content">Этот бокс недоступен</p></my-box>
<template id="my-box-template"> <style> ::slotted(h1) { color: #FF8630; } ::slotted(p) { font-size: 1.2rem; } :host { display: block; padding: 1em; border-radius: 5px; } :host(.warning) { border-radius: 1.4rem; border: 5px solid red; } :host([disabled]) { opacity: 0.5; pointer-events: none; } </style> <div class="card" part="box"> <slot name="title">Пустая карточка 😔</slot> <slot name="content"></slot> </div> </template> <my-box> <h1 slot="title">Крутая карточка 😎</h1> <p slot="content">Контент очень крутого бокса</p> </my-box> <my-box class="warning"> <h1 slot="title">Внимание ⚠️</h1> <p slot="content">Это предупреждающий бокс</p> </my-box> <my-box disabled> <h1 slot="title">Отключённый бокс 🚫</h1> <p slot="content">Этот бокс недоступен</p> </my-box>
class MyBox extends HTMLElement { constructor() { super() const shadow = this.attachShadow({ mode: 'open' }) const template = document.getElementById('my-box-template') shadow.appendChild(template.content.cloneNode(true)) }}customElements.define('my-box', MyBox)
class MyBox extends HTMLElement { constructor() { super() const shadow = this.attachShadow({ mode: 'open' }) const template = document.getElementById('my-box-template') shadow.appendChild(template.content.cloneNode(true)) } } customElements.define('my-box', MyBox)
Как пишется
Скопировано:host
— без параметров, просто селектор хоста.
:host { display: block;}
:host { display: block; }
:host
— селектор внутри скобок — условие на хост. Например:( <селектор> )
:host(.active) { border-color: green;}:host([disabled]) { opacity: 0.5;}
:host(.active) { border-color: green; } :host([disabled]) { opacity: 0.5; }
Можно использовать любые обычные CSS-селекторы, которые применимы к хост-элементу.
Как понять
СкопированоShadow DOM — это отдельный контекст, и в нём нельзя просто обратиться к хосту как к обычному элементу. Псевдокласс :host
позволяет именно внутри Shadow DOM задать стили для самого хоста.
Использование условия через :host
даёт гибкость — можно менять стили компонента в зависимости от его атрибутов, классов или состояний, переданных извне.
Подсказки
Скопировано💡 :host
работает только внутри Shadow DOM. В обычном CSS вне компонента он не действует.
💡 Для выбора вложенных элементов компонента используется :host
, :
и другие селекторы.
💡 Для стилизации частей компонента снаружи используйте part и :
.
💡 :host и
имеют более низкую специфичность, чем внешние стили вне зависимости от селектора. Например:
* { padding: 0; margin: 0;}
* { padding: 0; margin: 0; }
<template> <style> :host { /* Данное свойство будет ИГНОРИРОВАТЬСЯ из-за низкой специфичности :host (или :host()) */ padding: 16px; } </style> ...</template>
<template> <style> :host { /* Данное свойство будет ИГНОРИРОВАТЬСЯ из-за низкой специфичности :host (или :host()) */ padding: 16px; } </style> ... </template>
💡 Псевдокласс :host
можно комбинировать с другими селекторами, например, :host
. Или даже с другими псевдоклассами, такими как :not
и :is
, например:
:host(:not([disabled])) { ... }:host(:is(:hover, :focus-visible)) { ... }:host(:dir(rtl)) { ... }
:host(:not([disabled])) { ... } :host(:is(:hover, :focus-visible)) { ... } :host(:dir(rtl)) { ... }
- Chrome 54, поддерживается
- Edge 79, поддерживается
- Firefox 63, поддерживается
- Safari 10, поддерживается