El <slot>
es un elemento de HTML5 utilizado en combinación con la API de Web Components, específicamente dentro de los Shadow DOM. Su propósito principal es crear puntos de distribución donde pueden insertarse nodos del Light DOM dentro del Shadow DOM, permitiendo así la creación de componentes web más flexibles y reutilizables.
<slot>
name: Este atributo opcional permite dar un nombre específico al <slot>
, lo que es útil para que diferentes partes del contenido puedan ser insertadas en ubicaciones específicas dentro del Shadow DOM. Si no se establece un nombre, el <slot>
se considera "anónimo" y contendrá contenido por defecto no especificado con el atributo slot
.
global attributes: Al igual que la mayoría de los elementos HTML, <slot>
puede admitir atributos globales como class
, id
, style
, tabindex
, title
, etc. Estos atributos pueden ser útiles para aplicar estilos o funcionalidad específica a los slots.
Ejemplo del elemento <slot>
con su atributo name
:
<slot name="header"></slot>
<slot>
en HTML5: Ejemplos<slot>
Supongamos que estás creando un componente my-element
que tiene un Shadow DOM con un slot
por defecto.
Componente HTML (my-element
)
<template id="my-element-template">
<style>
/* Estilos específicos para el Shadow DOM */
p { color: blue; }
</style>
<p>Static content inside the shadow DOM.</p>
<slot></slot>
</template>
<script>
class MyElement extends HTMLElement {
constructor() {
super();
const template = document.getElementById('my-element-template').content;
const shadowDom = this.attachShadow({ mode: 'open' });
shadowDom.appendChild(template.cloneNode(true));
}
}
customElements.define('my-element', MyElement);
</script>
Uso del componente en el DOM principal
<my-element>
<p>Light DOM content that gets slotted in.</p>
</my-element>
En este ejemplo, el contenido <p>Light DOM content that gets slotted in.</p>
se inserta dentro del slot por defecto del Shadow DOM de my-element
.
<slot>
con nombresPara casos más complejos, se pueden utilizar múltiples slots con nombres:
Componente HTML (named-element
)
<template id="named-element-template">
<style>
/* Estilos específicos para el Shadow DOM */
.header { color: red; }
.content { color: green; }
</style>
<div class="header">
<slot name="header"></slot>
</div>
<div class="content">
<slot name="content"></slot>
</div>
</template>
<script>
class NamedElement extends HTMLElement {
constructor() {
super();
const template = document.getElementById('named-element-template').content;
const shadowDom = this.attachShadow({ mode: 'open' });
shadowDom.appendChild(template.cloneNode(true));
}
}
customElements.define('named-element', NamedElement);
</script>
Uso del componente en el DOM principal
<named-element>
<p slot="header">This is the header content.</p>
<p slot="content">This is the main content.</p>
</named-element>
En este ejemplo, el contenido se distribuye en diferentes partes del Shadow DOM de named-element
según el valor del atributo slot
en los elementos del Light DOM.
En resumen, el elemento <slot>
facilita la composición y reutilización de componentes web al permitir que el contenido dinámico del Light DOM se inserte en lugares específicos del Shadow DOM, impulsando prácticas de diseño modular en el desarrollo web.