shadow DOM slots

Shadow DOM supports <slot> elements, that are filled by the content from light DOM.

browserweb componentsimplementshadow DOM ⟩ slots

  • if those descendants include a <slot> element, then the regular light DOM children of the host element are displayed as if they were children of that <slot>(they do not actually become part of the shadow DOM), replacing any shadow DOM content in the slot.

  • if shadow DOM does not include a <slot>, then any light DOM content of the host is never displayed.

  • if shadow DOM has a <slot>, but the shadow host has no light DOM children, then the shadow DOM content of the slot is displayed as a default.

if shadow DOM defines more than one and names those slots with a name attribute, then children of the shadow host can specify which slot they would like to appear in by specifying a slot="slotname" attribute.

Fallback Content

  • if we put something inside <slot>(in shadow DOM), it becomes the fallback content, browser shows it if there’s no corresponding element in light DOM. 👉 See tab 2️⃣ below.

Default Slot

  • The first unnamed <slot> in shadow DOM is a “default slot". It gets all nodes from the light DOM that aren’t slotted elsewhere. 👉 See tab 1️⃣ below.

Code Example

<user-card>
  <!-- ⭐️ light DOM: slotted elements -->
  <!-- ⭐️ only top-level children may have [slot="…"] attribute❗️ -->
  <span slot="username">John Smith</span>
  <span slot="birthday">2001.01.01</span>
</user-card>

Named Slots

  • for each<slot name="X"> in shadow DOM, the browser looks for[slot="X"] in the light DOM and insert it into the slot, the result is called flattened DOM. 👉 See code in "shadow DOM", "flattened DOM" tabs above.

  • if there are multiple elements in light DOM with the same[slot="X"], they are appended into the same<slot name="X"> (in shadow DOM), one after another.

Flattened DOM

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! 👉 See "flattened DOM" tab above.

The process of rendering slotted elements inside their slots is called “composition”.

Last updated