Скелетон
Скелетон — серая фигура на месте содержимого, пока оно загружается. Из таких фигур собирают макеты загрузки.
<div style="display: flex; gap: var(--space-12); align-items: center"> <tk-skeleton shape="circle" style="flex: none"></tk-skeleton> <div style="flex: 1"><tk-skeleton lines="2"></tk-skeleton></div> </div>
Анатомия
| Часть | Что это |
|---|---|
tk-skeleton |
одна фигура; скрыта от скринридеров, фокуса не получает |
| полоса, круг или прямоугольник | серая заливка |
| строки | при lines больше 1 — полосы друг под другом; последняя шириной 60% |
Фигуры
<tk-skeleton></tk-skeleton> <tk-skeleton lines="3"></tk-skeleton> <tk-skeleton shape="circle"></tk-skeleton> <tk-skeleton shape="rect" style="height: 140px"></tk-skeleton>
shape |
Заменяет | Размер |
|---|---|---|
text (по умолчанию) |
строку текста | по окружающему шрифту, подходит к любому стилю текста |
circle |
аватар или иконку | 32px, как Avatar по умолчанию; задайте одну сторону, чтобы изменить |
rect |
картинку, карточку, поле | во всю ширину; высоту задайте в CSS |
- Размер задавайте в CSS: через
style, класс или сетку и flex вокруг. Атрибутов размера нет. - Повторяйте настоящее содержимое: ту же сетку, промежутки, блоки и число строк. Тогда ничего не прыгнет, когда содержимое придёт.
linesставит полосы текста с шагом строк шрифта и укорачивает последнюю, чтобы блок читался как абзац. Работает только сtext. Чтобы задать каждой строке свою ширину, возьмите несколько отдельных полос.
Углы
У полос текста radius-4, у прямоугольников radius-8, у кругов radius-full. Чтобы
повторить другие углы содержимого, задайте --tk-skeleton-radius.
<tk-skeleton shape="rect" style="height: 140px; --tk-skeleton-radius: var(--radius-12)"></tk-skeleton> <tk-skeleton shape="rect" style="height: 32px; width: 96px; --tk-skeleton-radius: var(--radius-full)"></tk-skeleton>
Макеты
Карточка с картинкой и текстом:
<div aria-busy="true"> <tk-skeleton shape="rect" style="height: 140px"></tk-skeleton> <tk-skeleton lines="3" style="margin-block-start: var(--space-12)"></tk-skeleton> </div>
- Список: повторите строку из начала этой страницы. Разделители и иконки строк оставьте настоящими.
- Таблица: по одной полосе на ячейку под настоящими заголовками, с разной шириной в каждом столбце, чтобы столбцы читались.
Состояния
<tk-skeleton lines="2"></tk-skeleton> <tk-skeleton lines="2" effect="none"></tk-skeleton>
pulse(по умолчанию): фигура мягко гаснет и проявляется. Фигуры, добавленные одновременно, пульсируют в такт.effect="none": неподвижная заливка. Пригодится, когда на экране много фигур и пульсировать они будут все разом.- При сокращённой анимации все скелетоны неподвижны.
Когда использовать
- Скелетоны — для первой загрузки области с содержимым: списка, карточек, таблицы, блока текста. Расставляйте их так, как встанет настоящее содержимое.
- Для действия, которое запустил пользователь, например сохранения или отправки, есть
Spinner илиProgress bar . - Заменяйте только изменчивое содержимое. Навигация, заголовок страницы и заголовки столбцов показываются сразу.
- Не ставьте скелетоны в уведомления, меню, диалоги, другие индикаторы загрузки и обычно в кнопки. Для второстепенного хватит пустого места.
- Показывайте их не дольше нескольких секунд. Если ждать дольше, скажите словами, что происходит.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
| Скелетон по тому же макету, что и содержимое | Макет, на который содержимое не ляжет |
| Заменять только изменчивое содержимое | Скелетоны в уведомлениях, меню, диалогах или статичном тексте |
aria-busy на загружающейся области |
Давать скелетону имя или объявлять его |
| То же число строк и те же размеры блоков | Одна полоса на всю карточку |
effect="none", когда фигур на экране много |
Десятки фигур, пульсирующих разом |
| Скелетоны для короткой первой загрузки | Держать их во время долгого ожидания |
Связанные
Spinner : отклик на действие, которое выполняется.Progress bar иProgress ring : ход работы на известной шкале.Empty state : что показать, если область загрузилась пустой.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
shape |
text | circle | rect |
text |
фигура |
lines |
number | 1 |
только для text: сколько полос |
effect |
pulse | none |
pulse |
пульсирует или неподвижна |
Слоты
Нет.
События
Нет.
CSS
--tk-skeleton-radius: радиус углов для любой фигуры.
Атрибута loading нет: показывайте скелетоны, пока идёт загрузка, и убирайте, когда пришло
содержимое.
Токены
| Часть | Токен |
|---|---|
| заливка | surface/sunken |
| углы | radius-4 (text), radius-8 (rect), radius-full (circle) |
| пульсация | duration-2000, ease-in-out |
Доступность
Встроено:
- У каждого скелетона
aria-hidden="true", нет роли и фокуса. Скринридеру он ничего не сообщает.
На вашей стороне:
- Поставьте
aria-busy="true"на загружающуюся область и уберите, когда содержимое придёт. - Если об ожидании нужно сообщить, добавьте в область сообщение с
role="status", видимое или визуально скрытое, и обновите его, когда загрузка закончится или не удастся.
Loading results
<section aria-busy="true" aria-label="Results"> <p role="status">Loading results</p> <tk-skeleton lines="3"></tk-skeleton> </section>
Серая заливка декоративная, поэтому требования к контрасту на неё не распространяются.