Семантическая разметка является ключевым элементом современных веб-приложений. Она позволяет создавать компоненты, которые не только визуально структурированы, но и понятны для поисковых систем, вспомогательных технологий и других инструментов анализа контента. Фреймворк Lit предоставляет мощные средства для работы с семантикой благодаря шаблонной системе и реактивности.
Компоненты в Lit создаются с помощью класса, расширяющего
LitElement. Основной метод, отвечающий за рендеринг, — это
render(), возвращающий шаблон через функцию
html. Для обеспечения семантики используются корректные
HTML-теги и атрибуты.
Пример простого семантического компонента:
import { LitElement, html, css } from 'lit';
class ArticleCard extends LitElement {
static styles = css`
article {
border: 1px solid #ccc;
padding: 1rem;
margin: 1rem 0;
border-radius: 8px;
}
h2 {
margin-top: 0;
}
`;
static properties = {
title: { type: String },
content: { type: String }
};
render() {
return html`
<article>
<h2>${this.title}</h2>
<p>${this.content}</p>
</article>
`;
}
}
customElements.define('article-card', ArticleCard);
В данном примере <article> и
<h2> обеспечивают правильную семантическую структуру,
улучшая доступность и SEO.
Для элементов интерфейса, которые не имеют стандартной семантики, применяются ARIA-атрибуты. Lit позволяет динамически управлять атрибутами, обеспечивая корректное взаимодействие с экранными читалками.
Пример кнопки с ARIA:
import { LitElement, html, css } from 'lit';
class ToggleButton extends LitElement {
static properties = {
pressed: { type: Boolean }
};
constructor() {
super();
this.pressed = false;
}
toggle() {
this.pressed = !this.pressed;
}
render() {
return html`
<button
@click=${this.toggle}
aria-pressed="${this.pressed}">
${this.pressed ? 'Включено' : 'Выключено'}
</button>
`;
}
}
customElements.define('toggle-button', ToggleButton);
aria-pressed корректно отражает текущее состояние
кнопки, обеспечивая доступность.
Слоты позволяют создавать компоненты с гибкой семантической структурой. Контент, переданный через слот, сохраняет семантику и может включать заголовки, списки и другие HTML-элементы.
Пример компонента с именованными слотами:
import { LitElement, html, css } from 'lit';
class Panel extends LitElement {
static styles = css`
section {
border: 1px solid #999;
padding: 1rem;
border-radius: 5px;
}
header {
font-weight: bold;
margin-bottom: 0.5rem;
}
`;
render() {
return html`
<section>
<header><slot name="header"></slot></header>
<div><slot name="content"></slot></div>
</section>
`;
}
}
customElements.define('custom-panel', Panel);
Использование:
<custom-panel>
<span slot="header">Заголовок панели</span>
<p slot="content">Основное содержимое панели с семантической структурой.</p>
</custom-panel>
Слоты обеспечивают сохранение семантики переданного контента, сохраняя доступность и структуру документа.
Lit позволяет использовать реактивные свойства для динамического изменения семантики. Например, изменение атрибутов ARIA, классов или даже тегов на основе состояния компонента.
Пример динамической семантики:
import { LitElement, html, css } from 'lit';
class StatusMessage extends LitElement {
static properties = {
type: { type: String } // 'error', 'success', 'info'
};
constructor() {
super();
this.type = 'info';
}
render() {
const role = this.type === 'error' ? 'alert' : 'status';
return html`
<div role="${role}" class="${this.type}">
<slot></slot>
</div>
`;
}
}
customElements.define('status-message', StatusMessage);
Выбор роли alert или status улучшает
взаимодействие с пользователями экранных читалок и сохраняет
семантическую корректность интерфейса.
При создании форм Lit обеспечивает возможность правильного связывания
лейблов и полей ввода с использованием label,
fieldset и legend. Это критично для
доступности.
Пример формы:
import { LitElement, html, css } from 'lit';
class LoginForm extends LitElement {
render() {
return html`
<form>
<fieldset>
<legend>Авторизация</legend>
<label for="username">Имя пользователя:</label>
<input id="username" name="username" type="text" />
<label for="password">Пароль:</label>
<input id="password" name="password" type="password" />
<button type="submit">Войти</button>
</fieldset>
</form>
`;
}
}
customElements.define('login-form', LoginForm);
Использование семантических тегов и атрибутов обеспечивает корректное восприятие формы как пользователями, так и программными агентами.
article, section, header,
footer, nav).Соблюдение этих принципов позволяет создавать компоненты, которые не только функциональны и эстетичны, но и семантически корректны, повышая качество и доступность веб-приложений.