Кратко
СкопированоСвойство .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, поддерживается