幾天前看到薄荷前端團隊分享的《前端骨架屏方案小結》,忽然回想起一年前看到的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源碼傳送門框架