Skeleton — это компонент библиотеки Material-UI (MUI), предназначенный для отображения загрузочных состояний элементов интерфейса. Он используется для улучшения пользовательского опыта, создавая визуальный индикатор загрузки вместо пустых блоков.
Для использования Skeleton необходимо импортировать компонент из MUI:
import Skeleton from '@mui/material/Skeleton';
Базовое применение выглядит следующим образом:
<Skeleton variant="text" width={210} />
<Skeleton variant="circular" width={40} height={40} />
<Skeleton variant="rectangular" width={210} height={118} />
Основные параметры:
variant — определяет форму скелета:
text — имитация текста;circular — круглый индикатор (например, для
аватаров);rectangular — прямоугольный блок (карточки,
изображения).width и height — размеры скелета. Могут
быть указаны в пикселях или процентах.
animation — анимация появления скелета:
pulse — плавное мерцание (по умолчанию);wave — волнообразная анимация;false — без анимации.Для отображения текста можно использовать вариант
text:
<Skeleton variant="text" width="80%" />
<Skeleton variant="text" width="60%" />
<Skeleton variant="text" width="40%" />
Использование разных ширин имитирует многострочный текст и создает ощущение реального контента. Для имитации заголовков удобно применять большие размеры:
<Skeleton variant="text" width={300} height={40} />
Для изображений или карточек применяют rectangular:
<Skeleton variant="rectangular" width={300} height={200} />
Для списков карточек удобно использовать Stack или
Grid:
import Grid from '@mui/material/Grid';
import Skeleton from '@mui/material/Skeleton';
<Grid container spacing={2}>
{[1, 2, 3, 4].map((item) => (
<Grid item key={item} xs={12} sm={6} md={3}>
<Skeleton variant="rectangular" height={150} />
<Skeleton variant="text" width="80%" />
<Skeleton variant="text" width="60%" />
</Grid>
))}
</Grid>
Такой подход имитирует полноценные карточки контента с изображением и текстом, создавая единый визуальный стиль загрузки.
Для аватаров и иконок применяется circular:
<Skeleton variant="circular" width={40} height={40} />
<Skeleton variant="circular" width={60} height={60} />
Для списка пользователей с аватарками и именами удобно комбинировать разные варианты:
<Grid container spacing={2} alignItems="center">
{[1, 2, 3].map((item) => (
<Grid item key={item} xs={12} display="flex" alignItems="center" gap={1}>
<Skeleton variant="circular" width={40} height={40} />
<Skeleton variant="text" width={120} />
</Grid>
))}
</Grid>
Skeleton поддерживает три типа анимации, которые задаются через проп
animation:
pulse — мерцающая анимация, создающая эффект
«дыхания»;wave — анимация волны, плавно проходящей слева
направо;false — статический индикатор без анимации.Пример с волной:
<Skeleton variant="rectangular" width={300} height={200} animation="wave" />
Часто Skeleton используют совместно с данными, загружаемыми из API:
const [data, setData] = React.useState(null);
React.useEffect(() => {
fetch('/api/items')
.then((res) => res.json())
.then((result) => setData(result));
}, []);
return (
<div>
{data
? data.map((item) => <div key={item.id}>{item.name}</div>)
: <Skeleton variant="text" width={210} />}
</div>
);
Этот подход позволяет отображать индикатор загрузки до появления реальных данных, предотвращая пустые места на странице.
Скелеты можно стилизовать с помощью sx или классов
MUI:
<Skeleton
variant="rectangular"
width={300}
height={200}
sx={{
bgcolor: 'grey.300',
borderRadius: 2
}}
/>
bgcolor — задает цвет фона;borderRadius — скругление углов, полезно для карточек с
мягкими краями;margin и padding — позволяют управлять
расположением скелета на странице.Для имитации параграфов удобно использовать несколько элементов
text с разной шириной:
<Box>
<Skeleton variant="text" width="90%" />
<Skeleton variant="text" width="80%" />
<Skeleton variant="text" width="95%" />
<Skeleton variant="text" width="70%" />
</Box>
Такой подход позволяет визуально создать эффект нескольких строк текста, как если бы контент уже был загружен.
Skeleton в MUI — это мощный инструмент для улучшения UX, позволяющий создавать предсказуемый и плавный пользовательский интерфейс, имитируя загрузку контента, карточек, аватаров и текста с различной анимацией и стилями.