Компонент Collapsible предназначен для создания интерактивных секций с возможностью скрытия и раскрытия контента. Он широко используется для FAQ, боковых панелей, аккордеонов и любых интерфейсов, где требуется экономия пространства без потери информации. В SvelteKit Collapsible реализуется через декларативную привязку состояния, а также через события, обеспечивая высокую степень кастомизации.
Базовая структура Collapsible включает три ключевых элемента:
<Collapsible>):
обертка, управляющая состоянием видимости содержимого.<CollapsibleTrigger>):
элемент, по которому пользователь кликает для открытия или закрытия
секции.<CollapsibleContent>):
скрываемая часть интерфейса, которая появляется при активации
триггера.Пример базовой разметки:
<Collapsible bind:open>
<CollapsibleTrigger>
Показать детали
</CollapsibleTrigger>
<CollapsibleContent>
<p>Здесь содержится дополнительная информация, которая скрыта по умолчанию.</p>
</CollapsibleContent>
</Collapsible>
bind:open позволяет привязать состояние видимости к
переменной, что даёт возможность управлять Collapsible программно.<CollapsibleTrigger> автоматически обрабатывает
клики и переключает состояние open.<CollapsibleContent> использует анимации для
плавного раскрытия и скрытия.Состояние Collapsible хранится в булевом значении open.
Его можно привязать к переменной для синхронизации с другими частями
приложения:
<script>
let isOpen = false;
</script>
<Collapsible bind:open={isOpen}>
<CollapsibleTrigger>Подробнее</CollapsibleTrigger>
<CollapsibleContent>
<p>Контент, управляемый через переменную isOpen.</p>
</CollapsibleContent>
</Collapsible>
<button on:click={() => isOpen = !isOpen}>
Переключить вручную
</button>
Использование двусторонней привязки позволяет:
SvelteKit UI обеспечивает полную кастомизацию стилей через классы и пропсы. Основные возможности:
<CollapsibleTrigger class="bg-blue-500 text-white px-4 py-2 rounded">
Развернуть
</CollapsibleTrigger>
<CollapsibleContent class="overflow-hidden transition-all duration-300">
<p>Плавное раскрытие с transition-all.</p>
</CollapsibleContent>
<CollapsibleTrigger class="flex items-center justify-between">
Развернуть
<span>{open ? '▲' : '▼'}</span>
</CollapsibleTrigger>
Здесь состояние open можно использовать для
динамического отображения иконок или изменения стиля.
Collapsible поддерживает вложенность и аккордеонные списки, где открыта может быть только одна секция одновременно. Для реализации аккордеона используется массив состояний или контекст:
<script>
let activeIndex = null;
const items = ['Секция 1', 'Секция 2', 'Секция 3'];
</script>
{#each items as item, i}
<Collapsible bind:open={activeIndex === i} on:click={() => activeIndex = activeIndex === i ? null : i}>
<CollapsibleTrigger>{item}</CollapsibleTrigger>
<CollapsibleContent>
<p>Содержимое {item}</p>
</CollapsibleContent>
</Collapsible>
{/each}
bind:open с индексом обеспечивает
автоматическое закрытие других секций.Collapsible генерирует события, которые можно использовать для расширенного контроля:
on:open — срабатывает при раскрытии
контента.on:close — срабатывает при
скрытии.on:toggle — срабатывает при любом
изменении состояния.Пример обработки событий:
<Collapsible on:open={() => console.log('Открыто')} on:close={() => console.log('Закрыто')}>
<CollapsibleTrigger>Информация</CollapsibleTrigger>
<CollapsibleContent>
<p>Контент с обработкой событий.</p>
</CollapsibleContent>
</Collapsible>
Компонент Collapsible учитывает ARIA-атрибуты:
aria-expanded на триггере автоматически меняется при
переключении.aria-hidden при скрытии.Пример доступного триггера:
<CollapsibleTrigger aria-label="Развернуть секцию">
Развернуть
</CollapsibleTrigger>
{#if open} для экономии ресурсов.<Collapsible>
<CollapsibleTrigger>Показать</CollapsibleTrigger>
{#if open}
<CollapsibleContent>
<p>Контент рендерится только при раскрытии.</p>
</CollapsibleContent>
{/if}
</Collapsible>
Компонент Collapsible в SvelteKit UI обеспечивает:
bind:open.Он является универсальным инструментом для создания динамичных, интерактивных и отзывчивых интерфейсов с гибким управлением контентом.