Haunted — это библиотека для создания веб-компонентов на основе
функционального подхода, построенного поверх Web Components и Hooks,
похожих на React. Одним из ключевых аспектов разработки компонентов
является возможность динамически изменять стили элементов в зависимости
от состояния или пропсов. Haunted предоставляет гибкие механизмы для
этого, позволяя интегрировать CSS прямо в компоненты или использовать
классические подходы с атрибутами class и
style.
Инлайн-стили — это самый прямой способ управления
внешним видом элемента. В Haunted стиль может зависеть от состояния,
создаваемого с помощью useState или других хуков.
import { html, component, useState } from 'haunted';
function ColorBox() {
const [active, setActive] = useState(false);
const styles = `
width: 100px;
height: 100px;
background-color: ${active ? 'green' : 'red'};
transition: background-color 0.3s;
`;
return html`
<div style="${styles}" @click="${() => setActive(!active)}"></div>
`;
}
customElements.define('color-box', component(ColorBox));
Ключевые моменты:
active.Для более сложных компонентов лучше использовать динамические классы, управляемые состоянием. Haunted поддерживает синтаксис условного добавления классов через JavaScript.
import { html, component, useState } from 'haunted';
function Button() {
const [pressed, setPressed] = useState(false);
const className = pressed ? 'button pressed' : 'button';
return html`
<button class="${className}" @click="${() => setPressed(!pressed)}">
Нажми меня
</button>
`;
}
customElements.define('dynamic-button', component(Button));
const className = `button ${pressed ? 'pressed' : ''} ${disabled ? 'disabled' : ''}`;
classnames или писать собственные функции.<style> внутри компонентаHaunted поддерживает использование локальных стилей
через тег <style> внутри шаблона компонента. Такой
подход позволяет изолировать CSS и делает стили
компонент-ориентированными.
function Card({ highlighted }) {
return html`
<style>
.card {
padding: 20px;
border-radius: 8px;
background-color: white;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
transition: transform 0.2s;
}
.card.highlighted {
transform: scale(1.05);
box-shadow: 0 4px 10px rgba(0,0,0,0.2);
}
</style>
<div class="card ${highlighted ? 'highlighted' : ''}">
Контент карточки
</div>
`;
}
CSS-переменные идеально подходят для динамического изменения стилей без изменения классов:
function ThemedBox({ color }) {
return html`
<style>
.box {
width: 150px;
height: 150px;
background-color: var(--box-color, gray);
transition: background-color 0.3s;
}
</style>
<div class="box" style="--box-color: ${color}"></div>
`;
}
Для динамических компонентов важно учитывать плавность переходов. Haunted не ограничивает стандартные CSS-анимации и transition:
function FadeBox() {
const [visible, setVisible] = useState(true);
return html`
<style>
.fade {
opacity: ${visible ? 1 : 0};
transition: opacity 0.5s;
width: 100px;
height: 100px;
background-color: blue;
}
</style>
<div class="fade"></div>
<button @click="${() => setVisible(!visible)}">Toggle</button>
`;
}
<style>.useMemo (или аналогичные подходы в
Haunted).Динамические стили в Haunted — это комбинация реактивных состояний, классов, CSS-переменных и scoped CSS, позволяющая создавать визуально богатые и гибкие веб-компоненты без глобального загрязнения стилей.