Вкладки — это удобный компонент для организации контента в интерфейсе. Они позволяют разделять страницы или секции приложения на логические блоки, облегчая навигацию и повышая UX.
В большинстве SvelteKit UI библиотек вкладки строятся вокруг трёх ключевых элементов:
Пример базовой структуры:
<Tabs let:activeTab>
<TabList>
<Tab>Первый</Tab>
<Tab>Второй</Tab>
<Tab>Третий</Tab>
</TabList>
<TabPanel>
<p>Контент первой вкладки</p>
</TabPanel>
<TabPanel>
<p>Контент второй вкладки</p>
</TabPanel>
<TabPanel>
<p>Контент третьей вкладки</p>
</TabPanel>
</Tabs>
Ключевой момент: компонент Tabs
управляет состоянием активной вкладки, передавая его через
let:activeTab. Это позволяет синхронизировать интерфейс с
другими компонентами.
Активная вкладка может задаваться двумя способами:
<script>
import { Tabs, TabList, Tab, TabPanel } from 'sveltekit-ui';
let active = 1; // активная вторая вкладка
</script>
<Tabs bind:activeTab={active}>
<TabList>
<Tab>Первый</Tab>
<Tab>Второй</Tab>
<Tab>Третий</Tab>
</TabList>
<TabPanel>Первый контент</TabPanel>
<TabPanel>Второй контент</TabPanel>
<TabPanel>Третий контент</TabPanel>
</Tabs>
Важно: использование bind:activeTab
позволяет управлять вкладками программно и синхронизировать состояние с
другими компонентами приложения.
SvelteKit UI библиотеки часто поддерживают ориентацию вкладок:
<Tabs orientation="vertical">
<TabList>
<Tab>Пункт 1</Tab>
<Tab>Пункт 2</Tab>
<Tab>Пункт 3</Tab>
</TabList>
<TabPanel>Контент 1</TabPanel>
<TabPanel>Контент 2</TabPanel>
<TabPanel>Контент 3</TabPanel>
</Tabs>
Подсказка: вертикальные вкладки требуют CSS-сетку или Flexbox для корректного отображения панели и контента рядом.
Вкладки можно создавать динамически из массива данных. Это особенно полезно для построения интерфейсов с переменным количеством секций.
<script>
const tabs = [
{ title: 'Главная', content: 'Главная страница' },
{ title: 'О нас', content: 'Информация о компании' },
{ title: 'Контакты', content: 'Контактная информация' }
];
</script>
<Tabs>
<TabList>
{#each tabs as tab}
<Tab>{tab.title}</Tab>
{/each}
</TabList>
{#each tabs as tab}
<TabPanel>{tab.content}</TabPanel>
{/each}
</Tabs>
Ключевой момент: структура TabList и
TabPanel должна сохранять синхронизацию по индексу массива,
иначе вкладки будут работать некорректно.
SvelteKit UI библиотеки предоставляют несколько способов стилизовать вкладки:
variant, size, color.Пример с кастомизацией:
<Tabs variant="pills" color="primary">
<TabList>
<Tab>
Главная <span class="badge">3</span>
</Tab>
<Tab>О нас</Tab>
<Tab>Контакты</Tab>
</TabList>
<TabPanel>Контент Главной</TabPanel>
<TabPanel>Контент О нас</TabPanel>
<TabPanel>Контент Контактов</TabPanel>
</Tabs>
Для оптимизации производительности можно загружать контент вкладки только при её активации:
<Tabs lazy>
<TabList>
<Tab>Данные</Tab>
<Tab>Отчёты</Tab>
</TabList>
<TabPanel>
<DataComponent />
</TabPanel>
<TabPanel>
<ReportsComponent />
</TabPanel>
</Tabs>
Особенность: при использовании lazy
компонент внутри TabPanel не будет монтироваться до момента
активации вкладки, что экономит ресурсы при больших объёмах данных.
SvelteKit позволяет синхронизировать вкладки с URL. Для этого активная вкладка может зависеть от query-параметра или хеша:
<script>
import { page } from '$app/stores';
import { derived } from 'svelte/store';
const activeTab = derived(page, $page => {
return $page.url.searchParams.get('tab') || '0';
});
</script>
<Tabs bind:activeTab={$activeTab}>
<TabList>
<Tab>Домой</Tab>
<Tab>Профиль</Tab>
<Tab>Настройки</Tab>
</TabList>
<TabPanel>Домашняя страница</TabPanel>
<TabPanel>Профиль пользователя</TabPanel>
<TabPanel>Настройки аккаунта</TabPanel>
</Tabs>
Преимущество: при обновлении страницы вкладка остаётся активной, а URL может использоваться для прямых ссылок на конкретные разделы интерфейса.
SvelteKit UI библиотеки обычно обеспечивают:
role="tablist" для контейнера вкладок.role="tab" для каждой вкладки с
aria-selected.role="tabpanel" для контента вкладки с
aria-labelledby.Это гарантирует корректное взаимодействие с экранными читалками и клавиатурной навигацией.
Вкладки в SvelteKit UI библиотеках обеспечивают гибкий, модульный и доступный способ организации интерфейса. Возможности динамического создания, кастомизации и интеграции с маршрутизацией делают их мощным инструментом для современных веб-приложений.