Кратко
Скопировано<slot>
— это HTML-элемент, который используется внутри Shadow DOM, чтобы указать, где должен отображаться внешний контент, переданный компоненту. Это ключевой элемент механизма вставки содержимого в Web Components.
Пример
Скопировано<template id="custom-card-template"> <style> ::slotted(h2) { color: #FF8630; } ::slotted(p) { color: #2E9AFF; } </style> <div class="card"> <slot name="title">Пустая карточка</slot> <slot></slot> </div></template><div class="container"> <custom-card> <h2 slot="title">Какой-то заголовок</h2> <p>Описание какой-то карточки с заголовком.</p> </custom-card> <custom-card></custom-card></div>
<template id="custom-card-template"> <style> ::slotted(h2) { color: #FF8630; } ::slotted(p) { color: #2E9AFF; } </style> <div class="card"> <slot name="title">Пустая карточка</slot> <slot></slot> </div> </template> <div class="container"> <custom-card> <h2 slot="title">Какой-то заголовок</h2> <p>Описание какой-то карточки с заголовком.</p> </custom-card> <custom-card></custom-card> </div>
class CustomCard extends HTMLElement { constructor() { super(); const template = document.getElementById('custom-card-template'); const clone = template.content.cloneNode(true); this.attachShadow({ mode: 'open' }); this.shadowRoot.appendChild(clone); }}customElements.define('custom-card', CustomCard);
class CustomCard extends HTMLElement { constructor() { super(); const template = document.getElementById('custom-card-template'); const clone = template.content.cloneNode(true); this.attachShadow({ mode: 'open' }); this.shadowRoot.appendChild(clone); } } customElements.define('custom-card', CustomCard);
Как пишется
Скопировано<slot></slot>
<slot></slot>
Имеет единственный атрибут name
— задаёт имя слота, по которому в него можно вставить контент.
Как понять
СкопированоТег <slot>
играет роль контейнера-заглушки внутри компонента. Снаружи вы передаёте элементы, помечая их атрибутом slot
, а внутри компонента, <slot>
показывает, где эти элементы появятся.
Если слот не имеет name
, он называется слотом по умолчанию, и в него попадают все элементы, не указавшие имя слота.
Если слот пуст, а пользователь не передал ничего — он будет вообще невидим, но вы можете задать дефолтный контент внутри:
<slot>Ничего не передали</slot>
<slot>Ничего не передали</slot>
Подсказки
Скопировано💡 Элемент <slot>
работает только внутри Shadow DOM.
💡 Используйте :
в CSS, чтобы стилизовать переданный внутрь контент.
💡 Можно использовать несколько <slot>
с разными name
, чтобы вставлять контент в нужные места.
💡 По умолчанию браузеры применяют к <slot>
стиль display
, чтобы сам элемент не влиял на разметку, а только передавал вложенный контент.
💡 Событие slotchange
срабатывает, когда содержимое слота изменяется. Например, если в компонент добавили или удалили элемент, привязанный к этому слоту.
- Chrome 53, поддерживается
- Edge 79, поддерживается
- Firefox 63, поддерживается
- Safari 10, поддерживается