SkateJS — это библиотека для создания веб-компонентов на JavaScript, которая обеспечивает строгую интеграцию с нативными возможностями браузера, включая Custom Elements и Shadow DOM. Одним из ключевых аспектов при разработке компонентов является семантическая разметка, позволяющая компонентам оставаться доступными, логически структурированными и легко интегрируемыми в любую страницу.
Компонент в SkateJS создаётся через функцию skate(), где
определяется его имя, свойства и
рэндеринг. Семантика напрямую зависит от того, какие
HTML-теги используются внутри рендера. Например, заголовки должны
использовать <h1>–<h6>, списки —
<ul> или <ol>, кнопки —
<button>.
import { skate } from 'skatejs';
import { h } from 'skatejs';
skate('my-card', {
render() {
return h('article', [
h('header', h('h2', 'Заголовок карточки')),
h('section', 'Основное содержание карточки'),
h('footer', 'Подвал карточки')
]);
}
});
Здесь компонент my-card использует семантически
правильные теги: article, header,
section, footer. Это важно для:
Свойства (props) в SkateJS могут влиять на семантическое поведение компонентов. Например, динамическая смена тега для заголовка:
skate('dynamic-heading', {
props: {
level: {
attribute: true,
default: 1,
type: Number
}
},
render(elem) {
const Tag = `h${elem.level}`;
return h(Tag, 'Динамический заголовок');
}
});
Использование переменной Tag позволяет менять
семантический уровень заголовка без нарушения структуры документа.
SkateJS по умолчанию поддерживает Shadow DOM, что влияет на видимость элементов для внешних стилей и скриптов. Семантическая разметка внутри Shadow DOM должна оставаться логически правильной:
skate('user-profile', {
shadow: true,
render() {
return h('section', [
h('header', h('h3', 'Имя пользователя')),
h('p', 'Описание профиля')
]);
}
});
Использование section и header сохраняет
семантику, даже если компонент инкапсулирован в Shadow DOM.
Семантика компонентов тесно связана с ARIA-атрибутами, которые делают интерфейсы доступными:
skate('modal-dialog', {
props: {
open: { attribute: true, type: Boolean }
},
render(elem) {
return h('div', {
role: 'dialog',
'aria-hidden': !elem.open
}, [
h('header', h('h2', 'Заголовок модального окна')),
h('section', 'Содержимое окна')
]);
}
});
role="dialog" указывает скринридерам, что это модальное
окно.aria-hidden скрывает компонент, если он закрыт.Правильная вложенность семантических элементов — критично для читабельности и доступности:
article может содержать header,
section и footer.section не должен использоваться для отдельных
предложений, только для логически связанных блоков.nav используется для навигационных ссылок, не для всех
ссылок страницы.Пример комплексного компонента:
skate('blog-post', {
render() {
return h('article', [
h('header', [
h('h1', 'Заголовок поста'),
h('p', 'Автор и дата публикации')
]),
h('section', 'Основной текст статьи с параграфами и списками'),
h('footer', [
h('p', 'Комментарии и ссылки для взаимодействия')
])
]);
}
});
Ключевые моменты при использовании SkateJS:
Соблюдение этих правил позволяет создавать модульные, доступные и логически понятные компоненты, полностью совместимые с современными стандартами веб-разработки.