В Lit стили компонента можно определять локально с помощью
статического свойства styles, используя шаблонные литералы
с помощью css. Это позволяет инкапсулировать CSS внутри
компонента и избегать конфликтов с внешними стилями.
import { LitElement, html, css } from 'lit';
class MyGridComponent extends LitElement {
static styles = css`
:host {
display: block;
padding: 16px;
}
`;
render() {
return html`<div>Контент</div>`;
}
}
customElements.define('my-grid-component', MyGridComponent);
Стили определяются в :host для контейнера компонента и
применяются локально к его содержимому. Это позволяет свободно
использовать CSS Grid и Flexbox без влияния на остальную часть
страницы.
Flexbox позволяет гибко управлять расположением элементов внутри контейнера. В Lit его использование аналогично обычному CSS, но с преимуществами инкапсуляции.
class FlexExample extends LitElement {
static styles = css`
.flex-container {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
gap: 10px;
border: 1px solid #ccc;
padding: 10px;
}
.flex-item {
background-color: #f0f0f0;
padding: 8px 16px;
border-radius: 4px;
}
`;
render() {
return html`
<div class="flex-container">
<div class="flex-item">Элемент 1</div>
<div class="flex-item">Элемент 2</div>
<div class="flex-item">Элемент 3</div>
</div>
`;
}
}
customElements.define('flex-example', FlexExample);
Ключевые моменты Flexbox:
flex-direction задаёт направление элементов (строка или
колонка).justify-content управляет распределением пространства
по основной оси.align-items выравнивает элементы по поперечной
оси.gap создаёт промежутки между элементами без
использования margin.Grid позволяет создавать сложные сеточные макеты с точным управлением позиционированием элементов. В Lit это особенно удобно для структурированных компонентов.
class GridExample extends LitElement {
static styles = css`
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
gap: 15px;
border: 1px solid #ccc;
padding: 10px;
}
.grid-item {
background-color: #e0e0ff;
padding: 20px;
text-align: center;
border-radius: 6px;
}
`;
render() {
return html`
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
</div>
`;
}
}
customElements.define('grid-example', GridExample);
Основные возможности CSS Grid:
grid-template-columns и grid-template-rows
задают структуру сетки.repeat(n, 1fr) упрощает создание одинаковых
колонок.gap регулирует расстояние между ячейками.grid-column и grid-row.В Lit часто применяется комбинация Flexbox и Grid для создания гибких и адаптивных интерфейсов. Например, сетка может быть построена с Grid, а элементы внутри каждой ячейки выравниваться с помощью Flexbox.
class MixedLayout extends LitElement {
static styles = css`
.grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.grid-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #dff0d8;
padding: 20px;
border-radius: 8px;
}
`;
render() {
return html`
<div class="grid">
<div class="grid-item">
<div>Элемент A1</div>
<div>Элемент A2</div>
</div>
<div class="grid-item">
<div>Элемент B1</div>
<div>Элемент B2</div>
</div>
</div>
`;
}
}
customElements.define('mixed-layout', MixedLayout);
Комбинирование позволяет:
Lit поддерживает использование свойств для динамического управления стилями. Flex и Grid можно настраивать через свойства компонента:
class DynamicGrid extends LitElement {
static properties = {
columns: { type: Number }
};
static styles = css`
.grid-container {
display: grid;
gap: 10px;
}
`;
render() {
return html`
<div
class="grid-container"
style="grid-template-columns: repeat(${this.columns}, 1fr);"
>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
`;
}
}
customElements.define('dynamic-grid', DynamicGrid);
Такой подход позволяет создавать компоненты с полностью настраиваемым сеточным макетом, управляемым через свойства.
Медиазапросы работают в Lit так же, как в обычном CSS, что позволяет создавать адаптивные сетки:
class ResponsiveGrid extends LitElement {
static styles = css`
.grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 15px;
}
@media (max-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
.grid-item {
background-color: #ffe0e0;
padding: 20px;
border-radius: 5px;
}
`;
render() {
return html`
<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
</div>
`;
}
}
customElements.define('responsive-grid', ResponsiveGrid);
Использование медиазапросов совместно с Grid и Flexbox обеспечивает полноценную адаптивность компонентов Lit без внешних CSS-фреймворков.