dom_dom0700_010

Shadow DOM のスタイルは原則として外部へ漏れない。外部から内部の一部をスタイルする必要があるときは ( A ) 擬似要素で公開部品を指定するか、スロット経由の子には ( B ) 擬似クラス(セレクタ)を使う。

解答

A: ::part
B: ::slotted()

解説

コンポーネント側で part 属性を付与すると、利用側は ::part(name) でスタイル可能。スロットに入るライト DOM の要素には ::slotted(selector) を使って限定的にスタイルを当てられます。

使用例(サンプルコード)

[ html ]

<x-badge><span class="txt">Hi</span></x-badge>
<style>
  x-badge::part(label){ background: gold; }        /* 公開パートを外から装飾 */
  x-badge::slotted(.txt){ text-transform: uppercase; } /* スロット経由の子 */
</style>
<script>
  customElements.define('x-badge', class extends HTMLElement{
    constructor(){
      super();
      const r = this.attachShadow({mode:'open'});
      r.innerHTML = `
        <style>.wrap{padding:4px;border-radius:4px}</style>
        <span class="wrap" part="label"><slot></slot></span>`;
    }
  });
</script>