Раскрывающийся блок
Collapsible показывает или скрывает один блок содержимого по нажатию на кнопку.
Standard shipping arrives in 3 to 5 business days.
<tk-collapsible> <span slot="trigger">Show delivery details</span> <p>Standard shipping arrives in 3 to 5 business days.</p> </tk-collapsible>
Анатомия
| Часть | Что это |
|---|---|
tk-collapsible |
сам элемент |
слот trigger |
текст кнопки, обязателен; он же доступное имя |
| слот по умолчанию | содержимое, видно, когда блок открыт |
part trigger |
кнопка <button> со стрелкой после текста; одна остановка Tab |
part panel |
содержимое |
Кнопка шириной ровно со свой текст. Содержимое идёт под ней, от края элемента; его раскладку вы задаёте сами.
Состояния
Proxy and cache settings.
Sign-ins and exports.
<tk-collapsible open><span slot="trigger">Advanced options</span><p>Proxy and cache settings.</p></tk-collapsible> <tk-collapsible disabled><span slot="trigger">Audit log</span><p>Sign-ins and exports.</p></tk-collapsible>
При наведении и нажатии кнопка подсвечивается. При фокусе с клавиатуры вокруг неё появляется рамка.
open: блок открыт с самого начала. Дальше он переключается сам; свойствоopenможно читать и задавать из кода.disabled: блок нельзя открыть или закрыть, а кнопка выпадает из порядка Tab.
Управление вручную
Чтобы сначала загрузить содержимое или проверить условие, слушайте tk-toggle и вызовите
preventDefault(), а когда всё готово, задайте open. В event.detail.open — состояние,
в которое переходит блок. Содержимое всегда есть на странице, поэтому тяжёлое содержимое
удобно подставлять так, при первом открытии.
<tk-collapsible id="report"><span slot="trigger">Full report</span><div id="report-body"></div></tk-collapsible>
<script>
const el = document.getElementById('report');
el.addEventListener('tk-toggle', async (e) => {
if (!e.detail.open) return;
e.preventDefault();
await loadReport();
el.open = true;
});
</script>«Показать ещё» и «Свернуть»
Текст кнопки ваш. Чтобы менять его, обновляйте его по tk-toggle:
<tk-collapsible id="more"><span slot="trigger">Show more</span><p>The rest of the description.</p></tk-collapsible>
<script>
const el = document.getElementById('more');
el.addEventListener('tk-toggle', (e) => {
el.querySelector('[slot="trigger"]').textContent = e.detail.open ? 'Show less' : 'Show more';
});
</script>Когда использовать
- Collapsible — для одного блока, который может быть скрыт с самого начала: дополнительные настройки, длинное описание, условия доставки.
- Если кнопка должна быть заголовком, берите
Accordion , например для стопки разделов с названиями. Аккордеон из одного раздела тоже уместен. Если обернуть collapsible в<h3>, внутрь заголовка попадёт и содержимое. - Для вложенных данных берите
Tree . - Чтобы переключаться между видами одной области, берите
Tab bar . - Не прячьте то, что обязательно нужно увидеть: важные инструкции, ошибку, обязательное поле.
Текст
- Скажите, что откроется: «Показать условия доставки», а не «Ещё».
- Пара подписей должна сочетаться, например «Показать ещё» и «Свернуть», и соответствовать состоянию.
- Заглавная буква только в начале, без точки в конце.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
| Один блок «показать или скрыть» | Собирать аккордеон из нескольких таких блоков |
| Сказать, что откроется: «Показать условия доставки» | «Ещё» без объекта |
| Аккордеон, когда кнопка — название раздела | Оборачивать tk-collapsible в заголовок |
| «Свернуть», пока блок открыт | «Показать ещё» на открытом блоке |
Загрузить содержимое по tk-toggle, потом открыть |
Отключать кнопку на время загрузки |
Связанные
Accordion : разделы с названиями, кнопки — заголовки.Sidebar : группы навигации в нём сделаны на collapsible.Tab bar : переключение между видами одной области.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
open |
boolean | false |
содержимое видно; свойство живое |
disabled |
boolean | false |
не переключается; кнопка выпадает из порядка Tab |
Слоты
| Слот | Содержимое |
|---|---|
trigger |
текст кнопки, обязателен |
| по умолчанию | содержимое |
События
tk-toggle срабатывает, когда пользователь открывает или закрывает блок, до смены
состояния. detail.open — новое состояние. Событие всплывает. preventDefault()
отменяет смену, и open вы задаёте сами.
Методы
focus() переводит фокус на кнопку.
CSS
::part(trigger): кнопка<button>.::part(panel): содержимое.
Токены
| Элемент | Токен |
|---|---|
| текст кнопки | text/default; отключённый text/disabled |
| стрелка | icon/secondary, icon-size-16; отключённая text/disabled |
| наведение, нажатие | state/hover, state/press, с radius-8 |
| рамка фокуса | border/accent/focus, снаружи кнопки |
| текст содержимого | text/default |
Кнопка набрана стилем Label Large (16/24, medium), отступы space-4 сверху и снизу,
space-8 по бокам и space-8 перед стрелкой. Открытое содержимое начинается на space-8
ниже кнопки. Значения по темам:
Доступность
Встроено:
- Кнопка — нативный
<button>, который сообщает, раскрыто ли содержимое. - Скрытое содержимое скрыто и от скринридеров, и на него нельзя перейти фокусом.
- Стрелка скрыта от скринридеров; состояние никогда не передаётся одной иконкой.
- Отключённый блок озвучивается как недоступный.
- При настройке «уменьшить движение» блок открывается и закрывается без анимации.
На вашей стороне:
- Напишите текст, который говорит, что откроется: он и есть имя кнопки.
- Если содержимое — раздел страницы с названием, берите аккордеон: его кнопка — настоящий заголовок, а многие пользователи скринридеров перемещаются по заголовкам.
| Клавиша | Действие |
|---|---|
Tab |
переводит на кнопку, затем в открытое содержимое |
Enter / Space |
открывает или закрывает блок |