Кратко
СкопированоПсевдоэлемент :
позволяет применять стили к отдельным частям элемента внутри Shadow DOM, если этим частям задан атрибут part
.
Пример
Скопировано<template id="card-template"> <style> ::slotted(h1) { font-weight: bold; color: #FF8630; margin-bottom: 8px; font-size: 2rem; } ::slotted(p) { font-size: 1.2rem; } </style> <div class="card" part="box"> <slot name="title">Пустая карточка 😔</slot> <slot name="content"></slot> </div></template><my-card> <h1 slot="title">Крутая карточка 😎</h1> <p slot="content">Контент очень крутой карточки</p></my-card><my-card></my-card>
<template id="card-template"> <style> ::slotted(h1) { font-weight: bold; color: #FF8630; margin-bottom: 8px; font-size: 2rem; } ::slotted(p) { font-size: 1.2rem; } </style> <div class="card" part="box"> <slot name="title">Пустая карточка 😔</slot> <slot name="content"></slot> </div> </template> <my-card> <h1 slot="title">Крутая карточка 😎</h1> <p slot="content">Контент очень крутой карточки</p> </my-card> <my-card></my-card>
class MyCard extends HTMLElement { constructor() { super() const shadow = this.attachShadow({ mode: 'open' }) const template = document.getElementById('card-template') const content = template.content.cloneNode(true) shadow.appendChild(content) }}customElements.define('my-card', MyCard)
class MyCard extends HTMLElement { constructor() { super() const shadow = this.attachShadow({ mode: 'open' }) const template = document.getElementById('card-template') const content = template.content.cloneNode(true) shadow.appendChild(content) } } customElements.define('my-card', MyCard)
my-card::part(box) { color: #ffffff; border: 1.5px solid #ff8630; background: #ffffff22;}
my-card::part(box) { color: #ffffff; border: 1.5px solid #ff8630; background: #ffffff22; }
Как пишется
СкопированоЗапись :
применяется к элементу, на котором установлен part
внутри Shadow DOM. Также есть несколько условий:
- Элемент должен быть в
shadow
;Root - Нужно явно указать атрибут
part
у целевого элемента; - Элемент, использующий
:
, должен находиться снаружи компонента.: part ( )
custom-element::part(name) { /* стили */}
custom-element::part(name) { /* стили */ }
Как понять
СкопированоShadow DOM изолирует внутреннюю разметку компонента от внешнего CSS. Однако, с помощью :
можно выбрать конкретные участки внутренней разметки, помеченные part
, и изменить их стиль снаружи.
Это особенно удобно, если вы хотите позволить разработчикам кастомизировать внешний вид вашего компонента, не открывая весь Shadow DOM.
Подсказки
Скопировано💡 После :
можно использовать простые псевдоклассы, например :
, но нельзя использовать структурные псевдоклассы - :
💡 Атрибут exportparts
позволяет передавать part
из вложенного компонента выше — для сложных вложенных структур.
<inner-component exportparts="button, icon"></inner-component>
<inner-component exportparts="button, icon"></inner-component>
💡 Можно указать несколько имён в part
:
<div part="header primary"></div>
<div part="header primary"></div>
И потом выбирать по любому:
x-box::part(header) { color: red; }x-box::part(primary) { font-weight: bold; }
x-box::part(header) { color: red; } x-box::part(primary) { font-weight: bold; }
- Chrome 73, поддерживается
- Edge 79, поддерживается
- Firefox 72, поддерживается
- Safari 13.1, поддерживается