ホームページ >ウェブフロントエンド >フロントエンドQ&A >Webコンポーネントのカプセル化にShadow Domを使用するにはどうすればよいですか?
Webコンポーネントのカプセル化にShadow Domを使用します
Shadow Domは、真にカプセル化されたWebコンポーネントを作成する上で重要な部分です。これにより、ページの残りの部分からコンポーネントの内部構造(HTML、CSS、およびJavaScript)をカプセル化できます。これにより、スタイリングの対立や意図しない副作用が防止されます。要素上のattachShadow()
メソッドを使用してShadow Domを作成します。この方法では、オプションのShadowRootInit
オブジェクトを引数として使用します。これにより、Shadow Domのモードを指定できます。 2つのモードは次のとおりです。
'open'
(デフォルト):メインドキュメントのスタイルは、Shadow Domに影響を与える可能性があり、その逆も同様です。これにより、柔軟性が向上しますが、カプセル化が減少します。'closed'
:メインドキュメントのスタイルはシャドウドムに影響を与えることはできません。その逆も同様です。これにより、より強力なカプセル化が提供され、スタイルの出血と偶発的なオーバーライドが防止されます。Shadow Domを使用してWebコンポーネントを作成する例は次のとおりです。
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'closed' }); // Use 'open' if needed // Create internal HTML const div = document.createElement('div'); div.innerHTML = ` <style> :host { display: block; border: 1px solid black; } p { color: blue; } </style> <p>This is my component!</p> `; this.shadowRoot.appendChild(div); } } customElements.define('my-component', MyComponent);</code>
このコードはmy-component
カスタム要素を定義します。 attachShadow()
メソッドはShadow Domを作成し、スタイルを含む内部HTMLが追加されます。 :host
擬似セレクターを使用すると、カスタム要素自体をスタイリングできます。 mode: 'closed'
を使用したため、メインページのスタイルはこのコンポーネントの外観には影響しません。
他のカプセル化技術に対するシャドウドムの利点
一意のCSSクラス名やJavaScript名空間を使用するなど、他のカプセル化技術と比較して、Shadow Domにはいくつかの重要な利点があります。
シャドウDOMを使用したスタイリングコンポーネント
Shadow Dom内のスタイリングコンポーネントは簡単ですが、 :host
のことを理解する必要があります。
<style></style>
タグを使用してコンポーネントのShadow Domに直接スタイルを埋め込むことです。これにより、スタイルがローカライズされ、競合を防ぎます。:host
擬似セレクター:この擬似セレクターは、カスタム要素自体をターゲットにし、シャドウドム内からホスト要素をスタイリングできます。 Internal StyleSheetおよび:host
を使用した例:
<code class="html"><my-component style="--my-color: red;"></my-component> <style> my-component { /* styles applied to the outside of the shadow root */ } my-component::part(my-part) { /* styles applied to a specific part inside the shadow root */ } </style></code>
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); // or 'closed' this.shadowRoot.innerHTML = ` <style> :host { display: block; border: 1px solid var(--my-color, black); /* Default to black if not specified */ } p { color: blue; } </style> <p>This is my component!</p> `; } }</code>
この例は、CSS変数( --my-color
)を使用して外側からボーダー色をカスタマイズする方法を示しています。デフォルトの色は黒です。
外側からシャドウドン要素にアクセスして操作します
外側からシャドウDOM内の要素に直接アクセスして操作することは、カプセル化を破り、脆弱なコードにつながる可能性があるため、一般的に落胆します。ただし、必要になる可能性のある状況があります。ここにいくつかの方法があります:
querySelector
とquerySelectorAll
の使用: Shadow Dom内の要素のセレクターを知っている場合は、これらのメソッドを使用してアクセスできます。ただし、内部構造の変更によりコードが破損する可能性があるため、これは壊れやすいです。 querySelector
メソッドは、 shadowRoot
プロパティで呼び出す必要があります。shadowRoot
プロパティの使用:カスタム要素への参照がある場合は、 shadowRoot
プロパティにアクセスしてShadow Domを横断できます。 querySelector
を使用した要素へのアクセスの例:
<code class="javascript">const myComponent = document.querySelector('my-component'); const paragraph = myComponent.shadowRoot.querySelector('p'); paragraph.textContent = 'This text has been changed from the outside!';</code>
この例は、Shadow Dom内の<p></p>
要素に直接アクセスします。ただし、これは一般的に落胆しています。 MyComponent
クラスにメソッドを公開する方が、制御された保守可能な方法でテキストを更新できるようにする方がはるかに優れています。例えば:
<code class="javascript">class MyComponent extends HTMLElement { // ... (constructor as before) ... set textContent(newText) { this.shadowRoot.querySelector('p').textContent = newText; } }</code>
これでmyComponent.textContent = "New text";
を使用して、安全かつ予測可能にテキストを更新できます。
このアプローチはカプセル化を維持し、コードをより堅牢に保ちます。
以上がWebコンポーネントのカプセル化にShadow Domを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。