カスタム要素(Custom Elements)
目次
概要
カスタム要素(custom elements)は、Webコンポーネント(Web Components) と呼ばれる技術群のひとつです。JavaScript を用いて独自の要素を定義することができます。
カスタム要素のバージョンには、document.registerElement() を用いる v0 と、window.customElements() を用いる v1 がありますが、ここでは、新しい v1 について説明します。Chrome 59 や Opera 47 などでサポートされています。
カスタム要素には、新規の要素を定義する「自律カスタム要素」と、既存の要素をカスタマイズする「カスタマイズドビルトイン要素」があります。
カスタム要素名は、標準の要素名との重複を避けるために、必ずハイフン(-)を含める必要があります。
自律カスタム要素(autonomous custom element)
下記は、name 属性の値に応じて 「Hello, {name属性}!」と表示する新規のカスタム要素 <hello-element> を定義しています。
HTML
<script> class HelloElement extends HTMLElement { // コンストラクタ // 必ず親コンストラクタ super() を呼び出すこと。 // 属性値 _name を初期化 constructor() { super(); this._name = null; } // 監視する属性名のリストを返却する static get observedAttributes() { return ["name"]; } // 監視する属性が設定・変更された際に呼び出される // _name 属性を変更し、レンダリングする attributeChangedCallback(name, oldValue, newValue) { this._name = newValue; this._updateRendering(); } // 要素が挿入された際に呼び出される connectedCallback() { this._updateRendering(); } // name属性のゲッター get name() { return this._name; } // name属性のセッター set name(v) { this.setAttribute("name", v); } // レンダリング // Hello, {name属性}! と表示する _updateRendering() { this.textContent = 'Hello, ' + this._name + '!'; } } // 上記で定義したクラスを用いて、カスタム要素 <hello-element> を定義する customElements.define("hello-element", HelloElement); </script> // カスタム要素を使用する <hello-element name="Tanaka"></hello-element>
表示
カスタマイズドビルトイン要素(customized built-in element)
カスタム要素は新規に作成する他、既存の要素を拡張して作成することもできます。下記の例では、既存の button 要素に対して、plastic-button というカスタム効果を加えています。
HTML
<script> class PlasticButton extends HTMLButtonElement { constructor() { super(); this.addEventListener("click", () => { // アニメーションなどの効果を記述する }); } } customElements.define("plastic-button", PlasticButton, { extends: "button" }); </script> <button is="plastic-button">Click Me!</button>
関連
Webコンポーネント, Shadow DOM, HTMLインポート, HTMLテンプレートリンク
- https://html.spec.whatwg.org/multipage/custom-elements.html
- https://www.w3.org/TR/custom-elements/
- https://w3c.github.io/webcomponents/spec/custom/
Copyright (C) 2017 杜甫々
初版:2017年11月19日 最終更新:2017年11月19日
https://www.tohoho-web.com/ex/custom-elements.html