Скелет уместен на первой загрузке блока или страницы. Для ожидания внутри одного действия — отправки формы, сохранения — возьмите проп
loadingу CdsButton или CdsProgressCircle. Если данных нет вовсе, покажите CdsEmptyState.
Анатомия
Скелет — это контейнер и вложенные «косточки»: каждая косточка повторяет форму одного элемента будущего контента. Тип list-item-avatar-two-line, actions раскрывается в круг под аватар, две строки текста и две кнопки.
Вариации
Типы
Свойство type берёт готовую структуру из каталога: article — заголовок и абзац, card — картинка с заголовком, table — шапка, строки и подвал.
Своя структура
Тип можно описать строкой: перечисление через запятую собирает косточки подряд, @N повторяет косточку N раз. Массив строк работает так же, как перечисление через запятую.
Каталог типов
Все встроенные типы и их структуры. Любой из них можно вставить в свою строку как косточку — heading, table-row@3.
Размеры
Свойства width, height, min-width и max-width задают размеры контейнера — косточки растягиваются по нему. Задавайте скелету те же размеры, что и у будущего контента, чтобы вёрстка не прыгала при подстановке данных.
Подмена контента
Положите контент в слот по умолчанию: пока loading истинно, на его месте виден скелет, после — сам контент, без обёртки. Свойство loading-text задаёт aria-label — скринридер объявит, что именно загружается.
Без анимации
Свойство boilerplate выключает мерцание. Такой скелет — заготовка для макетов и статичных прототипов, на боевом экране он не показывает ожидание.
Рекомендации
Сценарии использования
Список участников
Пока список грузится, type="list-item-avatar-two-line@3" держит место под три записи: аватар и две строки текста в каждой. Слот отдаёт готовый список, как только данные пришли, поэтому в шаблоне не нужен v-if.
Таблица договоров
Скелет из table-heading, table-row@3 повторяет шапку и строки таблицы, а loading-text объясняет ожидание озвучке. Число строк совпадает с размером страницы данных — после загрузки высота блока не меняется.
Каркас страницы
На первой загрузке страницы блоки грузятся независимо, поэтому у каждого свой скелет: список разделов — list-item@4, содержимое — heading, paragraph, paragraph. Готовый блок появляется сразу, не дожидаясь соседа.
API
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
boilerplate | boolean | undefined | false | Режим заготовки: отключает анимацию мерцания (для прототипирования). |
height | string | number | undefined | — | Высота компонента |
loading | boolean | undefined | false | Показывать скелет вместо контента слота во время загрузки. |
loadingText | string | undefined | — | Текст для aria-label во время загрузки. |
maxHeight | string | number | undefined | — | Максимальная высота компонента |
maxWidth | string | number | undefined | — | Максимальная ширина компонента |
minHeight | string | number | undefined | — | Минимальная высота компонента |
minWidth | string | number | undefined | — | Минимальная ширина компонента |
theme | string | 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' | Тип скелета: предопределённый пресет либо произвольная строка (или массив строк) структуры. |
width | string | number | undefined | — | Ширина компонента |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Контент, отображаемый вместо скелета после завершения загрузки. |