0Pricing
HTML Academy · レッスン

組み込み要素の拡張

is属性で既存の要素をカスタマイズします

「組み込み要素の拡張」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。

カスタム要素の2つの種類

仕様では、自律型カスタム要素(HTMLElement を拡張し、<my-card> として使用)と、カスタマイズされた組み込み要素(特定の組み込みクラスを拡張し、<button is="my-button"> として使用)が定義されています。カスタマイズされた組み込み要素は、組み込み要素のセマンティクスをそのまま継承できます。

組み込み要素を拡張する理由

自律型の <my-button> には、組み込みの <button> の動作が一切ありません。Enter/Space によるアクティベーション、フォームへの参加、支援技術向けの role="button" などが提供されません。カスタマイズされたボタン(is="my-button")なら、これらすべてを自動的に継承します。

クラスの拡張

HTMLElement ではなく、特定の HTML クラスを拡張します:class MyButton extends HTMLButtonElement {}。要素はフォーム送信、フォーカス管理、無効状態などの組み込み動作をすべて維持し、その上に独自の拡張を追加できます。

class MyButton extends HTMLButtonElement {
  connectedCallback() {
    this.style.fontWeight = "bold";
  }
}

extends オプションで登録する

customElements.define("my-button", MyButton, { extends: "button" })。第3引数は、要素が拡張する組み込みタグをレジストリに伝えます。これを指定しないと、登録時に例外が発生します。

is 属性

既存のタグに is 属性を付けて、カスタマイズされた組み込み要素を使用します:<button is="my-button">Click</button>。代わりに <my-button> と記述すると、自律型要素が作成され、組み込みの動作が失われます。

Safari はサポートしていない

Safari はアクセシビリティ上の懸念を理由に、カスタマイズされた組み込み要素の実装を拒否しています。Chrome、Edge、Firefox では動作しますが、Safari では is 属性が無視され、要素は通常の <button> として動作します。Safari のサポートが必要な場合は、公式のポリフィルを使用してください。

ポリフィルの選択肢

@ungap/custom-elements ポリフィルを使うと、Safari でカスタマイズされた組み込み要素のサポートを復元できます。小さく、メンテナンスも十分に行われています。is 属性パターンを諦めずにクロスブラウザー対応を行う必要がある場合に組み込んでください。

自律型要素という代替案

ポリフィルなしで Safari に対応する必要がある場合は、代わりに自律型要素を作成し、必要な動作を手動で再現してください。role="button"、tabindex="0"、Enter/Space 用のキーボードハンドラーを追加し、ElementInternals API でフォームに関連付けます。

フォーム関連付け API

自律型要素は、static formAssociated = true を設定し、this.attachInternals() を使うことでフォーム送信に参加できます。返される ElementInternals オブジェクトには、フォームと完全に統合するための setFormValue と setValidity が用意されています。

どちらを選ぶか

組み込み要素に近い動作をするコンポーネント(高機能なボタンやスマートな入力欄)で、プラットフォームが Chrome/Firefox であるか、ポリフィルの使用を許容できる場合は、カスタマイズされた組み込み要素を選んでください。カードやダイアログなど、対応する組み込み要素がないまったく新しいコンポーネントには、自律型要素を選びます。

落とし穴:自律型ボタン

Web Components で最もよくある間違いは、<my-button> を自律型要素として作成することです。この要素はフォームを送信せず、Enter/Space に応答せず、ボタンとして読み上げられません。HTMLButtonElement を拡張するか、本物のボタンが持つすべての動作を慎重に再現してください。

知識チェック

ボタンのようなコンポーネントで、HTMLElement(自律型)ではなく HTMLButtonElement(カスタマイズされた組み込み要素)を拡張する実用上の利点は何ですか。

まとめ

カスタマイズされた組み込み要素は、特定の HTML クラス(HTMLButtonElement、HTMLInputElement)を拡張し、is 属性を使って使用します。すべてのネイティブ動作を継承し、{ extends: "button" } オプションで登録します。Safari はネイティブではサポートしていないため、完全なクロスブラウザー対応が必要な場合は、ポリフィルを使うか、手動で動作を再現する自律型要素を使用してください。

よくある質問

「組み込み要素の拡張」レッスンは無料ですか?

はい。「組み込み要素の拡張」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。

「組み込み要素の拡張」で何を学びますか?

is属性で既存の要素をカスタマイズします ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

HTML Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「組み込み要素の拡張」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このHTML Academyレッスンでコードを書いて実行できますか?

はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. customElements.defineで要素を定義する
  2. connectedCallbackとdisconnectedCallback
  3. 監視対象属性とattributeChangedCallback
  4. 組み込み要素の拡張
← HTML Academyに戻る