Skip to content

CdsSkeletonLoader

Скелет показывает форму будущего контента, пока данные загружаются: вместо пустого экрана пользователь сразу видит, где появятся заголовок, текст и кнопки. Готовые типы (type) собираются из «косточек» — заготовок под аватар, строку текста, кнопку или таблицу.

Storybook GitLab
Покрытие тестами: 94% — хорошее покрытие
API в спеках
12 / 12 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
18 юнит · 0 браузерных
Известные баги
1 зафиксированы тестом it.fails
Покрытие кода
94.1% строк · 85.2% ветвей замер v4.0.0-alpha.13
A11y (axe)
нарушений нет в 11 историях замер v4.0.0-alpha.11

Скелет уместен на первой загрузке блока или страницы. Для ожидания внутри одного действия — отправки формы, сохранения — возьмите проп loading у CdsButton или CdsProgressCircle. Если данных нет вовсе, покажите CdsEmptyState.

Анатомия ​

Скелет — это контейнер и вложенные «косточки»: каждая косточка повторяет форму одного элемента будущего контента. Тип list-item-avatar-two-line, actions раскрывается в круг под аватар, две строки текста и две кнопки.

Вариации ​

Типы ​

Свойство type берёт готовую структуру из каталога: article — заголовок и абзац, card — картинка с заголовком, table — шапка, строки и подвал.

Sandbox Storybook

Своя структура ​

Тип можно описать строкой: перечисление через запятую собирает косточки подряд, @N повторяет косточку N раз. Массив строк работает так же, как перечисление через запятую.

Sandbox Storybook

Каталог типов ​

Все встроенные типы и их структуры. Любой из них можно вставить в свою строку как косточку — heading, table-row@3.

Storybook

Размеры ​

Свойства width, height, min-width и max-width задают размеры контейнера — косточки растягиваются по нему. Задавайте скелету те же размеры, что и у будущего контента, чтобы вёрстка не прыгала при подстановке данных.

Sandbox Storybook

Подмена контента ​

Положите контент в слот по умолчанию: пока loading истинно, на его месте виден скелет, после — сам контент, без обёртки. Свойство loading-text задаёт aria-label — скринридер объявит, что именно загружается.

Sandbox Storybook

Без анимации ​

Свойство boilerplate выключает мерцание. Такой скелет — заготовка для макетов и статичных прототипов, на боевом экране он не показывает ожидание.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Список участников ​

Пока список грузится, type="list-item-avatar-two-line@3" держит место под три записи: аватар и две строки текста в каждой. Слот отдаёт готовый список, как только данные пришли, поэтому в шаблоне не нужен v-if.

Sandbox Storybook

Таблица договоров ​

Скелет из table-heading, table-row@3 повторяет шапку и строки таблицы, а loading-text объясняет ожидание озвучке. Число строк совпадает с размером страницы данных — после загрузки высота блока не меняется.

Sandbox Storybook

Каркас страницы ​

На первой загрузке страницы блоки грузятся независимо, поэтому у каждого свой скелет: список разделов — list-item@4, содержимое — heading, paragraph, paragraph. Готовый блок появляется сразу, не дожидаясь соседа.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
boilerplateboolean | undefinedfalseРежим заготовки: отключает анимацию мерцания (для прототипирования).
heightstring | number | undefined—Высота компонента
loadingboolean | undefinedfalseПоказывать скелет вместо контента слота во время загрузки.
loadingTextstring | undefined—Текст для aria-label во время загрузки.
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
themestring | undefined—Тема компонента
type(string & {}) | "text" | "block" | "article" | "button" | "table" | "divider" | "subtitle" | "chip" | "avatar" | "actions" | "heading" | "sentences" | "paragraph" | "card" | "card-avatar" | "date-picker" | "date-picker-options" | "date-picker-days" | "list-item" | "list-item-avatar" | "list-item-two-line" | "list-item-avatar-two-line" | "list-item-three-line" | "list-item-avatar-three-line" | "table-heading" | "table-thead" | "table-tbody" | "table-row-divider" | "table-row" | "table-tfoot" | readonly ((string & {}) | "text" | "block" | "article" | "button" | "table" | "divider" | "subtitle" | "chip" | "avatar" | "actions" | "heading" | "sentences" | "paragraph" | "card" | "card-avatar" | "date-picker" | "date-picker-options" | "date-picker-days" | "list-item" | "list-item-avatar" | "list-item-two-line" | "list-item-avatar-two-line" | "list-item-three-line" | "list-item-avatar-three-line" | "table-heading" | "table-thead" | "table-tbody" | "table-row-divider" | "table-row" | "table-tfoot")[] | undefined'block'Тип скелета: предопределённый пресет либо произвольная строка (или массив строк) структуры.
widthstring | number | undefined—Ширина компонента

Слоты

ИмяТипОписание
defaultanyКонтент, отображаемый вместо скелета после завершения загрузки.