Стилизация контента слотов

В 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 позволяет вставлять отдельный заголовок, тогда как слот по умолчанию принимает основной контент компонента.

Стилизация слотов через CSS

В 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);
}

Таким образом, можно управлять стилями конкретного слота через его родительский контейнер.

Наследование CSS-переменных

FAST Element активно использует CSS-переменные для динамической настройки стилей. Стилизация слотов через переменные обеспечивает гибкость при интеграции компонентов в различные темы:

::slotted(*) {
  color: var(--slot-color, #000);
  font-family: var(--slot-font, Arial, sans-serif);
}

Изменяя значения CSS-переменных на уровне родительского компонента или документа, можно контролировать вид слотов без прямого вмешательства в Shadow DOM.

Комбинирование локальных и глобальных стилей

Для сложных компонентов рекомендуется комбинировать:

  1. Локальные стили компонента через css FAST Element.
  2. Стили слотов через ::slotted для элементов внешнего контента.
  3. Глобальные CSS-переменные для управления цветами, шрифтами и отступами.

Это позволяет создавать компоненты, которые остаются изолированными, но при этом гибко подстраиваются под контекст приложения.

Ограничения и особенности

  • ::slotted не поддерживает вложенные селекторы; можно задавать стиль только для самого элемента, который внедрён в слот.
  • Нельзя напрямую изменять псевдоэлементы внедрённого контента через ::slotted, например ::slotted(p)::before не работает. Для этого потребуется либо использовать класс на внешнем элементе, либо управлять контентом через Shadow DOM.
  • Наследование стилей ограничено правилами Shadow DOM: внутренние стили компонента не распространяются на внешний контент слота.

Динамическая стилизация через FAST APIs

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.
  • Использовать CSS-переменные для настройки цветовой схемы и шрифтов, обеспечивая повторное использование компонентов.
  • Проверять ограничения ::slotted при работе с вложенными элементами и псевдоэлементами.

Эти принципы позволяют создавать гибкие, настраиваемые компоненты с управляемой стилизацией слотов, соблюдая изоляцию Shadow DOM и обеспечивая совместимость с внешним контентом.