幾天前看到薄荷前端團隊分享的《前端骨架屏方案小結》,忽然回想起一年前看到的max bock寫的《Building Skeleton Screens with CSS Custom Properties》,翻譯整理寫下出此文,分享一下使用CSS自定義屬性構建骨架屏的技巧,先看骨架屏demo效果吧css
設計Web上的加載狀態經常被忽略或被認爲是過後考慮。性能不只是前端開發人員的職責,構建與慢速鏈接一塊兒工做的體驗也是設計挑戰。 雖然前端開發人員須要注意一些事情,好比壓縮和緩存,可是設計人員必須考慮UI處於「加載」或「離線」狀態時的外觀和行爲。前端
感知性能是衡量用戶感受速度的尺度。這個想法是用戶更有耐心,而且若是他們知道正在發生什麼,而且在內容實際存在以前可以預測內容,那麼他們會認爲系統更快。這在很大程度上與管理指望和保持用戶知情有關。
git
(Facebook的骨架屏)
github
(Slack的骨架屏)瀏覽器
.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屬性的值同樣。例如,例如:咱們能夠給頭像和標題 模擬24px的填充,以匹配真實內容卡的外觀。
緩存
.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;
}
複製代碼
這不只可讀性更好,並且之後更改一些值也更容易。另外,咱們還可使用一些變量(好比頭像大小、卡片填充)來定義實際卡片的樣式,並始終使其與骨架版本保持同步。添加一個媒體查詢來調整不一樣斷點的骨架部分如今也很是簡單:bash
@media screen and (min-width: 47em) {
:root {
--card-padding: 32px;
--card-height: 360px;
}
}
複製代碼
ps:瀏覽器對自定義屬性的支持很好,但不是100%。基本上,全部現代瀏覽器都有支持,IE / Edge有點晚了。對於這個特定用例,使用Sass變量很容易添加回退。服務器
固然你可使用:empty選擇器和僞元素來繪製骨架,所以它只適用於空卡片元素,一旦注入了內容,框架屏幕就會自動消失。
網絡
最後,感興趣的同窗可去我github下載這個骨架屏-demo源碼傳送門框架