FAST Element предоставляет мощный механизм работы со стилями, позволяя управлять визуальным оформлением компонентов через Shadow DOM, CSS Custom Properties, а также собственные методы композиции стилей. Правильная организация стилей повышает повторное использование кода, упрощает поддержку и улучшает производительность интерфейса.
В FAST Element стили определяются с помощью функции css
из пакета @microsoft/fast-element:
import { FASTElement, css, html } from "@microsoft/fast-element";
const buttonStyles = css`
:host {
display: inline-block;
padding: 0.5rem 1rem;
font-family: Arial, sans-serif;
background-color: var(--button-background, #0078d4);
color: var(--button-color, #ffffff);
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
:host(:hover) {
background-color: var(--button-hover-background, #005a9e);
}
`;
Ключевые моменты:
:host указывает на корневой элемент компонента.var(--property)) обеспечивают
возможность переопределения стилей при использовании компонента.:hover, :focus)
полностью интегрирована.Стили связываются с компонентом через статическое свойство
styles:
class MyButton extends FASTElement {
// Логика компонента
}
MyButton.styles = buttonStyles;
customElements.define("my-button", MyButton);
Использование отдельного объекта для стилей позволяет легко комбинировать их с другими стилевыми блоками.
FAST Element поддерживает объединение нескольких CSS-файлов с помощью массива:
const baseStyles = css`
:host {
font-family: Arial, sans-serif;
border-radius: 4px;
}
`;
const themeStyles = css`
:host {
background-color: var(--theme-background, #f0f0f0);
color: var(--theme-color, #333333);
}
`;
class ThemedCard extends FASTElement {}
ThemedCard.styles = [baseStyles, themeStyles];
customElements.define("themed-card", ThemedCard);
Особенности композиции:
baseStyles),
так и тематические (themeStyles), что упрощает поддержку
различных визуальных тем.FAST Element поддерживает CSS-миксины, которые
позволяют применять наборы правил к различным компонентам. Миксины
создаются через функцию css и подключаются с помощью
свойства var():
const cardMixin = css`
--card-padding: 1rem;
--card-background: #ffffff;
--card-border-radius: 8px;
`;
const cardStyles = css`
:host {
padding: var(--card-padding);
background-color: var(--card-background);
border-radius: var(--card-border-radius);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
`;
class CardComponent extends FASTElement {}
CardComponent.styles = [cardMixin, cardStyles];
customElements.define("card-component", CardComponent);
Преимущества миксинов:
FAST Element использует Shadow DOM по умолчанию, что обеспечивает локальность стилей и предотвращает нежелательное влияние внешних CSS. Все правила, определённые внутри компонента, не влияют на глобальные стили страницы. Однако можно использовать глобальные CSS-переменные для настройки внешнего вида компонентов.
FAST Element позволяет динамически менять стили через
css и adoptedStyleSheets:
import { FASTElement, css } from "@microsoft/fast-element";
const dynamicStyles = css`
:host {
color: var(--dynamic-color, black);
}
`;
class DynamicText extends FASTElement {}
DynamicText.styles = dynamicStyles;
customElements.define("dynamic-text", DynamicText);
// Изменение CSS Custom Property в рантайме
document.querySelector("dynamic-text").style.setProperty("--dynamic-color", "red");
Особенности:
var(--property) позволяет менять стили
без модификации JS-кода.Для глобальных тем FAST Element поддерживает подключение стилей через
<style> в документе или глобальные CSS Custom
Properties. В компоненте можно использовать свойства, определённые на
уровне документа:
:root {
--primary-color: #0078d4;
--secondary-color: #e5e5e5;
}
Компонент может ссылаться на эти свойства:
:host {
background-color: var(--primary-color);
color: var(--secondary-color);
}
Это позволяет создать единый стиль для всей системы компонентов, при этом сохраняя локальную инкапсуляцию.
Композиция стилей в FAST Element объединяет возможности инкапсуляции, наследования и динамического переопределения, создавая мощный инструмент для построения сложных и гибких интерфейсов.