ShadowRoot
ShadowRoot は Shadow DOM API のインターフェイスで、文書の DOM ツリーから分離してレンダリングされた部分ツリーのルートノードを指します。
要素のシャドウルートへの参照は Element.shadowRoot プロパティで受け取ることができます。これは Element.attachShadow() で mode オプションが open に設定されて作成されたときに提供されます。
プロパティ
ShadowRoot.activeElement読取専用-
フォーカスを持っているシャドウツリー内の
Elementを返します。 ShadowRoot.delegatesFocus読取専用 Non-standard 非推奨-
シャドウが取り付けられたときに
delegatesFocusが設定されていたかどうかを示す論理値を返します (Element.attachShadow()を参照)。 ShadowRoot.fullscreenElement読取専用-
このシャドウツリーで現在全画面モードになっている要素です。
ShadowRoot.host読取専用-
ShadowRootが取り付けられた DOM 要素への参照を返します。 ShadowRoot.innerHTMLNon-standard-
ShadowRootの内部の DOM ツリーへの参照を設定したり返却したりします。 ShadowRoot.mode読取専用-
ShadowRootのモードでopenまたはclosedの値を取ります。これはシャドウルートの内部の機能に JavaScript からアクセスできるかどうかを定義します。 ShadowRoot.pictureInPictureElement読取専用-
シャドウツリー内で現在ピクチャインピクチャモードで表示されている
Elementを返します。 ShadowRoot.pointerLockElement読取専用-
ポインターがロックされている間、マウスイベントのターゲットとして設定されている
Elementを返します。 ロックが保留中か、ポインターがロックされていないか、ターゲットがほかのツリーにある場合はnullを返します。 ShadowRoot.styleSheets読取専用-
シャドウツリーに明示的にリンクされている、または埋め込まれている
CSSStyleSheetオブジェクトのStyleSheetListを返します。
イベントハンドラー
ShadowRoot.onslotchange-
イベントハンドラーで、
slotchangeイベントが発行されたときに呼び出されるコードを表します。
メソッド
ShadowRoot.getAnimations()-
現在有効なすべての
Animationオブジェクトのうち、ターゲット要素がシャドウツリーの子孫であるものの配列を返します。 ShadowRoot.getSelection()-
ユーザーによって選択されたテキストの範囲または現在のキャレットの位置を表現する
Selectionオブジェクトを返します。 ShadowRoot.elementFromPoint()-
指定された座標における最上位の要素を返します。
ShadowRoot.elementsFromPoint()-
指定された座標における全要素からなる配列を返します。
例
以下のコードは、サイズと色の属性が指定された四角形の要素を作る life-cycle-callbacks の例です。 (ライブでも確認)
<custom-square> 要素のクラス定義の中に、外部関数である updateStyle() を呼び出すライフサイクルコールバックが含まれています。updateStyle() は要素のサイズと色を適用します。this (カスタム要素自身) を引数として関数に渡していることが分かるでしょう。
js
connectedCallback() {
console.log('四角形のカスタム要素がページに追加されました。');
updateStyle(this);
}
attributeChangedCallback(name, oldValue, newValue) {
console.log('四角形のカスタム要素の属性が変更されました。');
updateStyle(this);
}
updateStyle() 関数の中では、Element.shadowRoot を利用してシャドウ DOM への参照を取得しています。シャドウ DOM 内では、標準的な DOM の探索手法を用いて <style> を探し、CSS を更新しています。
js
function updateStyle(elem) {
var shadow = elem.shadowRoot;
var childNodes = shadow.childNodes;
for(var i = 0; i < childNodes.length; i++) {
if(childNodes[i].nodeName === 'STYLE') {
childNodes[i].textContent =
'div {' +
'width: ' + elem.getAttribute('l') + 'px;' +
'height: ' + elem.getAttribute('l') + 'px;' +
'background-color: ' + elem.getAttribute('c') + ';' +
'}';
}
}
}
仕様書
| Specification |
|---|
| DOM Standard # interface-shadowroot |
ブラウザーの互換性
BCD tables only load in the browser