Шторка
Шторка — модальная панель, которая выезжает с края экрана. Её ещё называют выдвижной или боковой панелью.
<tk-button onclick="document.getElementById('sheet').show()">Show filters</tk-button>
<tk-sheet id="sheet" heading="Filters" side="right">
<tk-checkbox>Unread</tk-checkbox>
<tk-checkbox>Starred</tk-checkbox>
<tk-button slot="footer" onclick="this.closest('tk-sheet').close()">Clear</tk-button>
<tk-button slot="footer" variant="primary" onclick="this.closest('tk-sheet').close()">Apply</tk-button>
</tk-sheet>Анатомия
| Часть | Что это |
|---|---|
| заголовок | heading: заголовок и доступное имя, обязателен |
| кнопка закрытия | встроена, справа вверху |
| тело | слот по умолчанию; прокручивается |
| подвал | слот footer: ваши кнопки, по правому краю; без кнопок скрыт |
| подложка | затемняет страницу и блокирует её |
part dialog |
панель |
Стороны
<tk-button onclick="document.getElementById('filters').show()">Show filters</tk-button>
<tk-sheet id="filters" heading="Filters" side="right">
<tk-checkbox>Unread</tk-checkbox>
<tk-checkbox>Starred</tk-checkbox>
<tk-button slot="footer" onclick="this.closest('tk-sheet').close()">Clear</tk-button>
<tk-button slot="footer" variant="primary" onclick="this.closest('tk-sheet').close()">Apply</tk-button>
</tk-sheet>side |
Форма |
|---|---|
right (по умолчанию) |
во всю высоту, ширина 440px |
left |
во всю высоту, ширина 440px |
top |
во всю ширину, высота по содержимому |
bottom |
во всю ширину, высота по содержимому |
- Панель выезжает со своей стороны и уезжает обратно при закрытии.
- Боковая шторка сужается под окно и оставляет
space-16(16px). Верхняя или нижняя растёт до высоты окна минус 16px, дальше прокручивается её тело. - Ширину боковой шторки меняет
--tk-sheet-size. Атрибутаsizeнет. - Длинное содержимое прокручивается в теле, а заголовок и подвал стоят на месте. У края, за которым есть ещё содержимое, оно плавно гаснет.
Открытие и закрытие
<tk-button onclick="document.getElementById('details').show()">View details</tk-button>
<tk-sheet id="details" heading="Order 1024" side="right">
<p>Shipped on 12 March to Ada Lovelace, London.</p>
</tk-sheet>show()открывает шторку, всегда модально.close(value)закрывает её, а в обработчикеcloseзначение лежит вreturnValue. Фокус возвращается к элементу, который открыл шторку.- Шторка закрывается так же, как
Dialog :Esc, кнопкой закрытия, кликом по подложке или вашими кнопками. Закрытие ничего не сохраняет. - Шторка с
<form>внутри не закрывается по клику на подложку, чтобы случайный клик не стёр работу.Escи кнопка закрытия по-прежнему закрывают её. - Чтобы спросить, прежде чем пропадут несохранённые изменения, слушайте
cancel:Escи клик по подложке сначала отправляют его, иpreventDefault()оставляет шторку открытой. Затем откройте поверх неёподтверждение «Сбросить изменения?». persistentотключаетEscи подложку. Кнопка закрытия и ваши кнопки работают по-прежнему. Оставьте это для задачи, которую обязательно нужно закончить.
Когда использовать
- Шторка — для вспомогательной панели или задачи, которой нужно место: фильтры, подробности о записи, настройки, длинная форма, навигация на узком экране.
- Для короткой задачи или решения по центру экрана берите
Dialog . - Для лёгкой панели рядом с кнопкой берите
Popover . Чтобы выбрать значение, беритеSelect илиCombobox . - Для навигации, которая всегда на экране, берите
Sidebar . На узком экране та же навигация уходит в шторку. - Шторка блокирует страницу. Никогда не открывайте её при загрузке страницы и ради информации, с которой ничего не сделать.
Текст
- Заголовок называет панель или задачу: «Фильтры», «Изменить профиль», «Заказ 1024».
- Кнопки подвала называют действие: «Применить», «Сохранить изменения». Одна
primary, справа. - Заглавная буква только в начале.
Подробнее в
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
| Шторка для фильтров или подробностей, которым нужно место | Шторка ради подсказки или быстрого выбора; для них есть popover и select |
| Оставлять кнопку закрытия | Прятать её и полагаться только на Esc |
Спрашивать «Сбросить изменения?» через cancel |
Включать persistent, чтобы защитить форму |
| Открывать шторку, когда её просят | Открывать её при загрузке страницы |
Связанные
Dialog : то же модальное окно, но по центру.Sidebar : навигация, которая всегда на экране; на узком экране её держит шторка.Popover : лёгкая панель, которая не блокирует страницу.Button : кнопки подвала.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
heading |
string | нет | заголовок и доступное имя; обязателен |
side |
top | right | bottom | left |
right |
край, у которого стоит шторка и с которого выезжает |
persistent |
boolean | false |
Esc и клик по подложке не закрывают шторку |
backdrop-blur |
boolean | false |
размывает страницу под подложкой |
backdrop-blur выключен по умолчанию, потому что размытие нагружает браузер. Где браузер не
умеет размывать, подложка просто затемняет.
Слоты
| Слот | Содержимое |
|---|---|
| по умолчанию | тело; в форме поставьте autofocus на первое поле |
footer |
кнопки, обычно tk-button |
Методы и свойства
| Имя | Что делает |
|---|---|
show() |
открывает шторку модально |
close(returnValue?) |
закрывает её; без значения закрывает как отказ |
returnValue |
значение последнего закрытия; "" после отказа |
open |
только для чтения, true, пока шторка открыта; атрибут open повторяет его, но ничего не открывает |
События
| Событие | Когда |
|---|---|
close |
после закрытия любым способом; смотрите returnValue |
cancel |
Esc или клик по подложке просят закрыть; preventDefault() оставляет шторку открытой |
Оба приходят на сам элемент и не всплывают, поэтому слушайте их на шторке.
CSS
::part(dialog): панель.--tk-sheet-size: ширина шторкиleftилиright. По умолчаниюmin(440px, 100vw - 16px).
Токены
| Часть | Токены |
|---|---|
| подложка | surface/backdrop; с backdrop-blur ещё blur-backdrop (8px) |
| панель | surface/raised, shadow-3, radius-20 на углах вдали от края; в контрастной теме рамка 1px border/default |
| заголовок | text/default, Heading Medium (20/24) |
| тело | text/default, Body Medium (16/24) |
| отступы | space-16 вокруг областей, space-8 между кнопками |
| выезд | duration-200, ease-emphasized |
| кнопки | токены |
В тёмной и контрастной теме подложка темнее. Значения по темам:
Доступность
Встроено:
- Нативный модальный
<dialog>сrole="dialog"; имя даёт заголовок. По странице за ним нельзя кликнуть, до неё не доходит Tab, её не читает скринридер. - При открытии фокус переходит внутрь, остаётся там и при закрытии возвращается к тому, что открыло шторку.
- Первый фокус получает элемент с
autofocus, иначе заголовок. - Пока шторка открыта, страница не прокручивается.
- При уменьшенной анимации шторка появляется и закрывается без выезда.
На вашей стороне:
- Поставьте
autofocusна первое поле формы. - Если после закрытия элемента, открывшего шторку, уже нет, переведите фокус сами в
обработчике
close. - Защищайте несохранённую работу через
cancelи подтверждение, а не черезpersistent.
| Клавиша | Действие |
|---|---|
Esc |
закрывает верхний слой: сначала открытое меню или select внутри шторки, потом саму шторку; с persistent не закрывает |
Tab / Shift+Tab |
перемещает фокус только внутри шторки |