Кратко
СкопированоСвойство .shadow возвращает корневой узел Shadow DOM, если он был создан через .attach с mode. В противном случае — возвращает null.
Пример
Скопировано
<my-box></my-box><script> class MyBox extends HTMLElement { constructor() { super() this.attachShadow({ mode: 'open' }) this.shadowRoot.innerHTML = `<p>Это из теневого DOM</p>` } } customElements.define('my-box', MyBox) document.addEventListener('DOMContentLoaded', () => { const el = document.querySelector('my-box') console.log(el.shadowRoot) // 👉 ShadowRoot {...} })</script>
<my-box></my-box>
<script>
class MyBox extends HTMLElement {
constructor() {
super()
this.attachShadow({ mode: 'open' })
this.shadowRoot.innerHTML = ``
}
}
customElements.define('my-box', MyBox)
document.addEventListener('DOMContentLoaded', () => {
const el = document.querySelector('my-box')
console.log(el.shadowRoot) // 👉 ShadowRoot {...}
})
</script>
Как пишется
Скопировано
const shadow = element.shadowRoot
const shadow = element.shadowRoot
Если Shadow DOM не был создан или создан с mode — вернётся null.
Как понять
СкопированоТеневой DOM изолирует разметку и стили внутри компонента. Но доступ к нему возможен, только если он открыт (mode).
Если вы пишете:
this.attachShadow({ mode: 'closed' })
this.attachShadow({ mode: 'closed' })
То element всегда будет null, даже если Shadow DOM существует.
Подсказки
Скопировано💡 Вы можете использовать shadow для динамического обновления содержимого внутри компонента:
this.shadowRoot.querySelector('p').textContent = 'Новый текст'
this.shadowRoot.querySelector('p').textContent = 'Новый текст'
💡 В дебаггере браузера shadow удобно смотреть прямо в DOM-панели — откройте компонент и разверните вложенный #shadow.
- Chrome 53, поддерживается
- Edge 79, поддерживается
- Firefox 63, поддерживается
- Safari 10, поддерживается