light, shadow, flattened DOM
Shadow DOM
let root = host.attachShadow({mode: 'open'});
// โญ๏ธ shadow DOM
root.innerHTML = `
  <style> p { font-weight: bold; } </style>
  <p>Hello, John!</p>
`;Light DOM
The markup a user of your component writes. This DOM lives outside the component's shadow DOM. It is the element's actual children.
<better-button>
  <!-- โญ๏ธ light DOM -->
  <img src="gear.svg" slot="icon">
  <span>Settings</span>
</better-button>Flattened DOM
The result of the browser distributing the user's light DOM into your shadow DOM, rendering the final product. The flattened tree is what you ultimately see in the DevTools and what's rendered on the page.
the flattened DOM exists only for rendering and event-handling purposes. Itโs kind of โvirtualโ. Thatโs how things are shown. But the nodes in the document are actually not moved aroundโ๏ธ
The process of rendering slotted elements inside their slots is called โcompositionโ.
<user-card>
  #shadow-root
    <div>Name:
      <slot name="username">
        <!-- โญ๏ธ slotted element is inserted into the slot -->
        <span slot="username">John Smith</span>
      </slot>
    </div>
    <div>Birthday:
      <slot name="birthday">
        <span slot="birthday">01.01.2001</span>
      </slot>
    </div>
</user-card>Last updated
Was this helpful?