Web Components を実装した
customElements.define("my-element", class extends HTMLElement {
constructor() {
super();
this.attachShadow({mode: "open"});
}
attributeChangedCallback() {
this.#_attributeChangedCallback();
}
connectedCallback() {
this.#_connectedCallback();
}
});
Custom elements
CustomElementRegistry.define
CustomElementRegistry.define
my-element
要素を登録しています。(要素名には多少の制限があるようです)
The lifecycle callbacks
#attr;
#attr_old;
static get observedAttributes() {
return ["my-attr"];
}
attributeChangedCallback(name, oldValue, newValue) {
if ("my-attr" !== name) {
return;
}
this.#attr = newValue;
this.#attr_old = oldValue;
}
#connected = false;
connectedCallback() {
if (this.#connected) {
return;
}
this.#_init();
(new MutationObserver(this.#_init)).observe(this, this.#_options);
this.#connected = true;
}
attributeChangedCallback
attributeChangedCallback
observedAttributes
で指定した属性が追加、削除、変更されるたびに実行されます。
my-attr
属性を指定しています。古い値oldValue
と新しい値newValue
をそれぞれ#attr_old
プロパティと#attr
プロパティに設定します。
connectedCallback
connectedCallback
MutationObserver.observe
を呼び出しています。要素が変更されたときにコールバック関数this.#_init
を呼び出します。
Node.childNodes
等を使いたいときはconstructor
よりもconnectedCallback
で使うようにしています。constructor
ではエラーを吐くことがあったので。
Shadow DOM
this.attachShadow({mode: "open"}).appendChild(document.createElement("style")).textContent = `:host {
display: block;
}`;
const style = document.createElement("link");
style.rel = "stylesheet";
style.href = "style.css";
this.shadowRoot.appendChild(style);
Element.attachShadow
Element.attachShadow
Element.shadowRoot
への参照を返します。
Element.shadowRoot
Element.shadowRoot
ShadowRoot
オブジェクトです。
-
継承はするようです -
CSS custom propertiesも継承するようです
:host
擬似クラス
:host
擬似クラスmy-element
要素のスタイルに display: block
を加えています。
::part
擬似要素
::part
擬似要素