Accordion — это компонент интерфейса, позволяющий сгруппировать контент в раскрывающиеся панели. Каждая панель может быть открыта или закрыта, обеспечивая компактное представление большого объема информации. В SvelteKit UI реализация аккордеона строится с учетом реактивности и простоты интеграции с остальными компонентами приложения.
Стандартный Accordion состоит из двух основных частей:
AccordionItem — отдельная панель с заголовком и содержимым.
AccordionHeader и AccordionPanel — логическая разметка внутри каждой панели:
AccordionHeader — кликабельный элемент, который
управляет состоянием панели.AccordionPanel — скрываемый блок контента, который
появляется при открытии панели.Пример базовой структуры:
<Accordion>
<AccordionItem>
<AccordionHeader>Заголовок панели 1</AccordionHeader>
<AccordionPanel>
<p>Содержимое панели 1</p>
</AccordionPanel>
</AccordionItem>
<AccordionItem>
<AccordionHeader>Заголовок панели 2</AccordionHeader>
<AccordionPanel>
<p>Содержимое панели 2</p>
</AccordionPanel>
</AccordionItem>
</Accordion>
В SvelteKit UI Accordion может быть контролируемым и неконтролируемым:
Пример контролируемого Accordion:
<script>
import { Accordion, AccordionItem, AccordionHeader, AccordionPanel } from 'sveltekit-ui';
let openIndex = 0;
function toggle(index) {
openIndex = openIndex === index ? -1 : index;
}
</script>
<Accordion>
{#each [0,1,2] as i}
<AccordionItem>
<AccordionHeader on:click={() => toggle(i)}>Панель {i + 1}</AccordionHeader>
<AccordionPanel hidden={openIndex !== i}>
<p>Содержимое панели {i + 1}</p>
</AccordionPanel>
</AccordionItem>
{/each}
</Accordion>
Ключевые моменты:
hidden или условная отрисовка через {#if}
позволяет полностью удалять из DOM закрытые панели, экономя
ресурсы.SvelteKit UI позволяет создавать вложенные аккордеоны для сложных интерфейсов. Важно правильно управлять уникальными идентификаторами и состоянием:
<Accordion>
<AccordionItem>
<AccordionHeader>Основная панель</AccordionHeader>
<AccordionPanel>
<Accordion>
<AccordionItem>
<AccordionHeader>Подпанель 1</AccordionHeader>
<AccordionPanel>Содержимое подпанели 1</AccordionPanel>
</AccordionItem>
<AccordionItem>
<AccordionHeader>Подпанель 2</AccordionHeader>
<AccordionPanel>Содержимое подпанели 2</AccordionPanel>
</AccordionItem>
</Accordion>
</AccordionPanel>
</AccordionItem>
</Accordion>
Особенности:
SvelteKit UI использует нативные Svelte переходы для плавного открытия и закрытия панелей. Стандартный способ:
<AccordionPanel transition:slide>
<p>Контент с плавным открытием</p>
</AccordionPanel>
slide — стандартный переход для раскрытия по
высоте.transition:fade или комбинированные эффекты через
animate:flip.Accordion поддерживает кастомизацию через классы и CSS-переменные:
<Accordion class="my-accordion">
<AccordionItem>
<AccordionHeader class="header-custom">Заголовок</AccordionHeader>
<AccordionPanel class="panel-custom">
Контент с кастомными стилями
</AccordionPanel>
</AccordionItem>
</Accordion>
<style>
.my-accordion {
border: 1px solid #ccc;
border-radius: 8px;
}
.header-custom {
background: #f0f0f0;
padding: 12px;
cursor: pointer;
}
.panel-custom {
padding: 16px;
background: #fff;
}
</style>
Советы по стилизации:
Для доступности Accordion необходимо:
button для
заголовков).aria-expanded и aria-controls
для каждой панели:<AccordionHeader
role="button"
aria-expanded={openIndex === 0}
aria-controls="panel-0"
>
Панель 1
</AccordionHeader>
<AccordionPanel id="panel-0" hidden={openIndex !== 0}>
Контент панели 1
</AccordionPanel>
Accordion хорошо сочетается с динамическими списками и формами:
<script>
let items = [
{ title: 'Панель 1', content: 'Данные 1' },
{ title: 'Панель 2', content: 'Данные 2' }
];
</script>
<Accordion>
{#each items as item}
<AccordionItem>
<AccordionHeader>{item.title}</AccordionHeader>
<AccordionPanel>
<input type="text" value={item.content} />
</AccordionPanel>
</AccordionItem>
{/each}
</Accordion>
aria-атрибуты и
семантическую разметку.Эта структура позволяет создавать мощные, удобные и доступные Accordion-компоненты в SvelteKit UI, легко интегрируемые в динамические и сложные интерфейсы.