Аккордеоны представляют собой интерфейсный элемент, позволяющий
компактно отображать большое количество информации с возможностью
разворачивания и сворачивания отдельных блоков. В SvelteKit аккордеоны
реализуются с помощью реактивности и компонентов UI-библиотек, таких как
@skeletonlabs/skeleton или svelte-headless-ui.
Основные принципы работы:
<script lang="ts">
import { Accordion, AccordionItem, AccordionHeader, AccordionPanel } from '@skeletonlabs/skeleton';
</script>
<Accordion>
<AccordionItem>
<AccordionHeader>Раздел 1</AccordionHeader>
<AccordionPanel>
Содержимое первого раздела.
</AccordionPanel>
</AccordionItem>
<AccordionItem>
<AccordionHeader>Раздел 2</AccordionHeader>
<AccordionPanel>
Содержимое второго раздела.
</AccordionPanel>
</AccordionItem>
</Accordion>
Ключевые моменты:
Accordion – контейнер всего аккордеона, управляет
логикой открытия/закрытия элементов.AccordionItem – отдельный элемент аккордеона.AccordionHeader – кликабельная область, переключающая
видимость панели.AccordionPanel – блок, который отображается или
скрывается при клике на заголовок.SvelteKit позволяет управлять состоянием аккордеона через реактивные переменные:
<script lang="ts">
import { Accordion, AccordionItem, AccordionHeader, AccordionPanel } from '@skeletonlabs/skeleton';
let activeIndex: number | null = null;
</script>
<Accordion bind:active={activeIndex}>
<AccordionItem>
<AccordionHeader>Раздел 1</AccordionHeader>
<AccordionPanel>
Содержимое первого раздела.
</AccordionPanel>
</AccordionItem>
<AccordionItem>
<AccordionHeader>Раздел 2</AccordionHeader>
<AccordionPanel>
Содержимое второго раздела.
</AccordionPanel>
</AccordionItem>
</Accordion>
<p>Активный раздел: {activeIndex !== null ? activeIndex + 1 : 'нет'}</p>
bind:active синхронизирует открытый элемент с
переменной activeIndex.multiple={true}.Аккордеоны могут использовать встроенные анимации Svelte:
<AccordionPanel transition:slide>
Содержимое с плавной анимацией.
</AccordionPanel>
transition:slide — встроенный переход для плавного
раскрытия.Табы позволяют организовать интерфейс в виде нескольких панелей, каждая из которых доступна по клику на соответствующую вкладку.
<script lang="ts">
import { Tabs, TabList, Tab, TabPanels, TabPanel } from '@skeletonlabs/skeleton';
</script>
<Tabs>
<TabList>
<Tab>Вкладка 1</Tab>
<Tab>Вкладка 2</Tab>
</TabList>
<TabPanels>
<TabPanel>
Контент первой вкладки.
</TabPanel>
<TabPanel>
Контент второй вкладки.
</TabPanel>
</TabPanels>
</Tabs>
Объяснение компонентов:
Tabs – корневой контейнер, управляет активной
вкладкой.TabList – список заголовков вкладок.Tab – отдельная вкладка, кликая по которой меняется
активный TabPanel.TabPanels – контейнер для панелей контента.TabPanel – содержимое конкретной вкладки.Можно использовать реактивные переменные для контроля состояния:
<script lang="ts">
import { Tabs, TabList, Tab, TabPanels, TabPanel } from '@skeletonlabs/skeleton';
let activeTab = 0;
</script>
<Tabs bind:active={activeTab}>
<TabList>
<Tab>Вкладка 1</Tab>
<Tab>Вкладка 2</Tab>
</TabList>
<TabPanels>
<TabPanel>Контент первой вкладки</TabPanel>
<TabPanel>Контент второй вкладки</TabPanel>
</TabPanels>
</Tabs>
<p>Текущая вкладка: {activeTab + 1}</p>
bind:active позволяет синхронизировать активную вкладку
с переменной.activeTab.transition:fade или transition:slide.{#each} для
генерации вкладок и панелей из массива данных.В интерфейсах сложного уровня часто требуется комбинировать оба компонента:
<Accordion>
<AccordionItem>
<AccordionHeader>Раздел с вкладками</AccordionHeader>
<AccordionPanel>
<Tabs>
<TabList>
<Tab>Таб 1</Tab>
<Tab>Таб 2</Tab>
</TabList>
<TabPanels>
<TabPanel>Контент таба 1 внутри аккордеона</TabPanel>
<TabPanel>Контент таба 2 внутри аккордеона</TabPanel>
</TabPanels>
</Tabs>
</AccordionPanel>
</AccordionItem>
</Accordion>
Особенности:
Эта архитектура компонентов в SvelteKit UI обеспечивает мощный инструмент для организации информации, создавая интерфейсы, которые остаются компактными, интерактивными и легко расширяемыми.