написать впереди
Несколько дней назад я увидел «поделился фронтенд-командой Mint».Краткое изложение решения каркасного экрана переднего плана", вдруг вспомнилось "макс бок", написанное максом боком, которое я видел год назадBuilding Skeleton Screens with CSS Custom Properties", перевел и систематизировал эту статью и поделился навыками использования пользовательских свойств CSS для создания экрана-скелета. Давайте сначала посмотрим на демонстрационный эффект экрана-скелета.
О проектировании состояний загрузки в Интернете часто забывают или считают его второстепенным. Производительность — это не только обязанность разработчика переднего плана, создание приложений, которые работают с медленными соединениями, — это также задача проектирования. В то время как разработчики интерфейсов должны заботиться о таких вещах, как сжатие и кэширование, дизайнеры должны учитывать, как будет выглядеть и вести себя пользовательский интерфейс, когда он «загружен» или «оффлайн».
иллюзия скорости
Воспринимаемая производительностьЭто мера воспринимаемой пользователем скорости. Идея состоит в том, что пользователи более терпеливы, и если они знают, что происходит, и могут предсказать контент до того, как он действительно появится, они будут думать, что система работает быстрее. Во многом это связано с управлением ожиданиями и информированием пользователей.
(Скелетный экран Facebook)
(скелетный экран Slack)
пример
Рисование скелетов с помощью CSS
.skeleton {
background-repeat: no-repeat;
background-image:
radial-gradient(circle 16px, white 99%, transparent 0), /* 第3层 头像 */
linear-gradient(white 40px, transparent 0), /* 第2层 标题 */
linear-gradient(gray 100%, transparent 0); /* 第1层 卡片背景 */
}
.skeleton {
background-size:
32px 32px, /* 头像 */
200px 40px, /* 标题 */
100% 100%; /* 卡片背景 */
}
Завершающим этапом является размещение элемента на карточке. Это похоже на position:absolute, означающее, что свойства left и top имеют одинаковое значение. Например, мы можем имитировать отступы в 24 пикселя для аватаров и заголовков, чтобы они соответствовали внешнему виду реальных карточек контента.
.skeleton {
background-position:
24px 24px, /* 头像 */
24px 200px, /* 标题 */
0 0; /* 卡片背景 */
}
Разбейте его с помощью настраиваемых атрибутов
.skeleton {
/*
定义单独的属性
*/
--card-height: 340px;
--card-padding:24px;
--card-skeleton: linear-gradient(gray var(--card-height), transparent 0);
--title-height: 32px;
--title-width: 200px;
--title-position: var(--card-padding) 180px;
--title-skeleton: linear-gradient(white var(--title-height), transparent 0);
--avatar-size: 32px;
--avatar-position: var(--card-padding) var(--card-padding);
--avatar-skeleton: radial-gradient(
circle calc(var(--avatar-size) / 2),
white 99%,
transparent 0
);
/*
现在我们可以把背景分解成单独的形状
*/
background-image:
var(--avatar-skeleton),
var(--title-skeleton),
var(--card-skeleton);
background-size:
var(--avatar-size),
var(--title-width) var(--title-height),
100% 100%;
background-position:
var(--avatar-position),
var(--title-position),
0 0;
}
Это не только более читабельно, но и позволяет позже изменить некоторые значения. Кроме того, мы можем использовать некоторые переменные (например, размер аватара, отступы карты), чтобы определить стиль фактической карты и всегда синхронизировать ее со скелетной версией. Добавление медиа-запроса для настройки частей скелета для разных точек останова теперь также очень просто:
@media screen and (min-width: 47em) {
:root {
--card-padding: 32px;
--card-height: 360px;
}
}
ps: Браузерная поддержка пользовательских свойств хороша, но не на 100%. В принципе, все современные браузеры поддерживают, IE/Edge немного запаздывает. Для этого конкретного случая использования легко добавить запасные варианты, используя переменные Sass.
Добавить анимацию
Конечно, вы можете использовать селектор :empty и псевдоэлементы для рисования скелета.Таким образом, это работает только для пустых элементов карты, как только содержимое вводится, экран кадра автоматически исчезает..
Наконец, заинтересованные студенты могут зайти на мой github, чтобы загрузить этоSkeleton screen-демонстрационный портал с исходным кодом