Кратко
СкопированоПсевдокласс :defined
выбирает только те элементы, которые уже зарегистрированы в браузере как кастомные. Это позволяет стилизовать только определённые компоненты и, например, задать разные стили до и после их инициализации.
Пример
Скопировано<div class="container"> <custom-element> <h1 slot="title">Кастомный элемент</h1> <p slot="content">Контент появился после инициализации</p> </custom-element> <button id="btn">Определить элемент</button></div><template id="custom-element-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"> <slot name="title">Пустой элемент 😔</slot> <slot name="content"></slot> </div></template>
<div class="container"> <custom-element> <h1 slot="title">Кастомный элемент</h1> <p slot="content">Контент появился после инициализации</p> </custom-element> <button id="btn">Определить элемент</button> </div> <template id="custom-element-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"> <slot name="title">Пустой элемент 😔</slot> <slot name="content"></slot> </div> </template>
custom-element:not(:defined) { border-color: grey; color: grey; background: #222;}custom-element:defined { background-color: wheat; border-color: black; color: black;}
custom-element:not(:defined) { border-color: grey; color: grey; background: #222; } custom-element:defined { background-color: wheat; border-color: black; color: black; }
const btn = document.querySelector("#btn");btn.addEventListener("click", () => { if (!customElements.get("custom-element")) { class CustomElement extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({ mode: "open" }); const template = document.getElementById("custom-element-template"); shadow.appendChild(template.content.cloneNode(true)); } } customElements.define("custom-element", CustomElement); } btn.remove();});
const btn = document.querySelector("#btn"); btn.addEventListener("click", () => { if (!customElements.get("custom-element")) { class CustomElement extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({ mode: "open" }); const template = document.getElementById("custom-element-template"); shadow.appendChild(template.content.cloneNode(true)); } } customElements.define("custom-element", CustomElement); } btn.remove(); });
Как пишется
СкопированоПсевдокласс используется как обычный селектор:
web-component:defined { /* стили, когда компонент зарегистрирован */}
web-component:defined { /* стили, когда компонент зарегистрирован */ }
Можно комбинировать с другими селекторами:
my-box:defined:hover { box-shadow: 0 0 10px rgba(0,0,0,0.2);}
my-box:defined:hover { box-shadow: 0 0 10px rgba(0,0,0,0.2); }
Как понять
СкопированоКогда вы вставляете на страницу кастомный элемент вроде <my
, он сначала появляется как неизвестный тег. До тех пор, пока скрипт не выполнится и не вызовет custom
, он считается неопределённым.
Псевдокласс :defined
позволяет разделить стили до и после определения. Это особенно удобно для:
- Плавной загрузки интерфейса
- Предотвращения странной отрисовки до инициализации
- Анимаций и переходов после готовности
Подсказки
Скопировано💡 Если компонент уже определён до вставки в DOM — :defined
сработает сразу.
💡 Полезно использовать :not
, чтобы стилизовать «заглушки» до загрузки компонентов.
💡 Работает только с кастомными тегами — вроде <my
. Не применимо к обычным HTML-тегам.
💡 Можно использовать как индикатор загрузки — например, показывать лоадер внутри неинициализированного компонента.