Кратко
СкопированоПсевдоэлемент : позволяет применять стили к отдельным частям элемента внутри 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, поддерживается