В FAST Element слоты представляют собой мощный механизм для организации и композиции компонентов, позволяя внедрять динамический контент внутрь веб-компонентов. Правильная стилизация контента слотов требует понимания нескольких ключевых аспектов: структурного назначения слотов, наследования стилей и применения CSS-переменных и псевдоклассов.
Слот (<slot>) служит местом для внедрения внешнего
контента в компонент. FAST Element поддерживает как именованные слоты,
так и слот по умолчанию. Пример структуры с именованным слотом:
import { FASTElement, html, css } from "@microsoft/fast-element";
const template = html<MyComponent>`
<div class="header">
<slot name="header"></slot>
</div>
<div class="content">
<slot></slot>
</div>
`;
const styles = css`
.header {
font-weight: bold;
padding: 10px;
background-color: var(--header-bg, #f0f0f0);
}
.content {
padding: 20px;
color: var(--content-color, #333);
}
`;
export class MyComponent extends FASTElement {}
FASTElement.define({
name: "my-component",
template,
styles,
});
В данном примере слот header позволяет вставлять
отдельный заголовок, тогда как слот по умолчанию принимает основной
контент компонента.
В FAST Element слоты можно стилизовать как обычные элементы, но важно учитывать контент внедрённый через слот находится вне Shadow DOM стиля компонента, поэтому прямое наследование CSS работает не всегда. Для решения применяются псевдоклассы слота:
::slotted(*) — позволяет задавать стили для всех
элементов, внедрённых в слот по умолчанию.::slotted(selector) — стилизует только элементы,
соответствующие селектору.Пример применения:
::slotted(p) {
font-size: 16px;
line-height: 1.5;
color: var(--slot-text-color, #555);
}
::slotted(.highlight) {
background-color: yellow;
}
Этот подход обеспечивает контроль над внешним контентом без необходимости модифицировать исходные стили передаваемых элементов.
Для именованных слотов синтаксис ::slotted не различает
имя слота напрямую. Для специфичной стилизации применяются
вспомогательные контейнеры внутри шаблона:
<div class="footer">
<slot name="footer"></slot>
</div>
.footer ::slotted(*) {
font-style: italic;
color: var(--footer-color, #777);
}
Таким образом, можно управлять стилями конкретного слота через его родительский контейнер.
FAST Element активно использует CSS-переменные для динамической настройки стилей. Стилизация слотов через переменные обеспечивает гибкость при интеграции компонентов в различные темы:
::slotted(*) {
color: var(--slot-color, #000);
font-family: var(--slot-font, Arial, sans-serif);
}
Изменяя значения CSS-переменных на уровне родительского компонента или документа, можно контролировать вид слотов без прямого вмешательства в Shadow DOM.
Для сложных компонентов рекомендуется комбинировать:
css
FAST Element.::slotted для
элементов внешнего контента.Это позволяет создавать компоненты, которые остаются изолированными, но при этом гибко подстраиваются под контекст приложения.
::slotted не поддерживает вложенные селекторы; можно
задавать стиль только для самого элемента, который внедрён в слот.::slotted, например ::slotted(p)::before не
работает. Для этого потребуется либо использовать класс на внешнем
элементе, либо управлять контентом через Shadow DOM.FAST Element позволяет управлять стилями слотов программно через обсерверы свойств или bindable CSS-переменные:
import { observable } from "@microsoft/fast-element";
export class MyComponent extends FASTElement {
@observable slotColor = "#ff0000";
}
::slotted(*) {
color: var(--dynamic-slot-color, #000);
}
В шаблоне CSS-переменная --dynamic-slot-color может
обновляться при изменении свойства slotColor, что позволяет
динамически менять внешний вид слота без перерисовки компонента.
::slotted.::slotted при работе с вложенными
элементами и псевдоэлементами.Эти принципы позволяют создавать гибкие, настраиваемые компоненты с управляемой стилизацией слотов, соблюдая изоляцию Shadow DOM и обеспечивая совместимость с внешним контентом.