フレームワークを整える
中級Web Components を整える。
= ライブラリなしで独自の HTML タグを作って動かす練習場
サンプルコード(クリックでエディタに挿入)
「▶ 実行」を押すと、ここに描画結果が表示されます。
CONSOLE
console.log の出力とエラーがここに出ます。
HTMLタブが「使う側」(実際に画面に置くタグ)、JSタブが「コンポーネントの定義」です。無限ループを書くとプレビューが固まることがあります。そのときは「■ 停止」を押してください。
Web Components は「定義・属性・slot・イベント」の4点セット。
どれもブラウザ標準の customElements と Shadow DOM の機能で、ライブラリなしで書けます。
- ①
定義と描画 — class extends HTMLElement
connectedCallback()は要素が画面に現れたときに呼ばれます。ここでattachShadow()して Shadow DOM を作り、中身を描きます。 - ②
属性 — observedAttributes・attributeChangedCallback
static observedAttributesに列挙した属性だけが監視対象になり、変化するたびにattributeChangedCallbackが呼ばれて再描画できます。 - ③
slot — 名前付き slot と ::slotted
使う側が渡した子要素を、
<slot name="...">で決まった場所に差し込みます。::slotted()は、差し込まれた要素だけをスタイルできる特別なセレクタです。 - ④
イベント — CustomEvent と composed
内部の状態が変わったことは
dispatchEvent(new CustomEvent(...))で外側に伝えます。Shadow DOM の外まで届けるにはcomposed: trueが必要です。
Lit は、この Web Components を書きやすくする薄い層。
Lit はここで書いた customElements・Shadow DOM の上に、状態管理・再描画・テンプレート記法を足すだけのライブラリです。
| 観点 | Web Components(素) | Lit |
|---|---|---|
| 要素の登録 | customElements.define(同じ) | customElements.define(同じ) |
| 再描画 | 自分で render() を呼び直す | プロパティが変わると自動で呼ばれる |
| テンプレート | innerHTML に文字列を組み立てる | html`` タグ付きテンプレートで書く |
| 依存ライブラリ | 無し | lit(軽量) |
ここで書いたコードがそのまま動くのは、Lit も内部で customElements と Shadow DOM を使っているからです。 Lit での書き方は /lit/ の Playground で確認できます。
Shadow DOM の CSS 隔離・ブラウザ対応
-
Shadow DOM の内側に書いた
<style>は、外側のページの CSS の影響を受けません。逆に、外側のページにp { color: red; }と書いても、Shadow DOM の中の<p>には効きません。 - この「隔離」のおかげで、社内の別チームが作った部品を貼り付けても、お互いの CSS が衝突しません。
- Custom Elements v1 と Shadow DOM v1 は、Chrome・Edge・Firefox・Safari の最新版に標準搭載されています(ポリフィル不要)。
このページについて
ここで動くのは本物のブラウザのエンジンです。外部ライブラリは読み込みません。 書いたコードと実行結果は端末内で完結し、外部へ送信しません(送信ゼロ)。 プレビューはサンドボックス化した iframe で、このページや端末のデータには触れません。
このツールについて
Web Components は、ライブラリを使わずブラウザ標準の機能だけで「独自の HTML タグ」を作る仕組みです。ここでは customElements.define と Shadow DOM を実際に書いて、動きを確認できます。
customElements と Shadow DOM だけで、独自の HTML タグを作って動かす練習場。Lit の前段としても。
主な機能
- ライブラリなし・ブラウザ標準機能だけで動く
- 4課題(定義/属性/slot/イベント)
- Shadow DOM の CSS 隔離を実際に確認できる
- /lit/ と相互リンク・送信ゼロ
よくある質問
Q. Web Components に外部ライブラリは必要ですか?
A. 不要です。customElements.define と Shadow DOM は主要なブラウザに標準で搭載されています。
Q. Lit との違いは何ですか?
A. Lit はこの Web Components の上に、状態が変わると自動で再描画する仕組みとテンプレート記法を足す薄いライブラリです。素の書き方は /lit/ のページと見比べられます。
Q. Shadow DOM の中の要素は、外側のページの CSS の影響を受けますか?
A. 受けません。Shadow DOM は CSS を隔離するため、外側の p { color: red } のような指定は中の要素に効きません。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。