對於前端來說,最重要的莫過於用戶體驗了,這次我們聊一聊骨架屏 - Skeleton Screen
我們平常對於需要請求加載的內容,可能用的比較多的是loading動畫,比如在內容區域放一個菊花圖,當請求結束,並且render tree構造完成后,將菊花圖移除,展示用戶想看的內容。雖然這種方式沒啥缺點,但是現在更多的網站開始使用骨架屏代替,因為它能帶過來更好的用戶體驗。
我們看幾個例子:
jira
slack
上圖展示中,我們可以看到每個site從骨架圖到真實內容的一個變化。如果你細心一點你會發現,不同site對於骨架圖的block位置是不一致的:
- facebook將用戶固定的頭像,author,日期和一小部分文字作為骨架主體
- jira則是標題和logo對應的很整齊
- linkedin可以說完全沒有對齊,而是使用一種更加的展示骨架布局
- slack則是使用混合的loading方式,有骨架圖也有旋轉圓,不僅如此,slack並沒有全部使用同一種灰色值,不同的block的顏色代表的該區域的字體顏色,這又是一種切換順滑度的提升。
不過他們都有一個共同點,就是采用簡約的方式布局,我們可以以此為例,創造出獨一無二的風格,來提高用戶體驗和加強品牌的風格,我想這會比一個loading logo帶來更好的效果。
上面簡單的介紹了一下骨架圖,接下來我們來說一下具體實現吧。
優先我們實現一個簡單的帶有loading效果的骨架結構:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
@keyframes loading {
0% {
background-position: -400px 0
}
100% {
background-position: 400px 0
}
}
.box1 {
position: absolute;
margin: 0 auto;
left: 50%;
margin-left: -400px;
top: 0;
width: 800px;
height: 60px;
background-color: blue;
background-image: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%);
animation-duration: 1s;
animation-iteration-count: infinite;
animation-name: loading;
animation-timing-function: linear;
transition: 0.3s;
}
.bgMasker {
background-color: #fff;
}
.line1 {
background-color: #fff;
height: 20px;
position: absolute;
right: 0;
top: 0;
left: 60px;
}
.line2 {
background-color: #fff;
height: 20px;
position: absolute;
right: 700px;
top: 20px;
left: 60px;
}
.line3 {
background-color: #fff;
height: 20px;
position: absolute;
left: 400px;
right: 0;
top: 20px;
}
.line4 {
background-color: #fff;
height: 20px;
top: 40px;
position: absolute;
left: 60px;
right: 500px;
}
.line5 {
background-color: #fff;
height: 20px;
position: absolute;
left: 600px;
right: 0;
top: 40px;
}
</style>
</head>
<body>
<!-- 骨架 -->
<div class="box1">
<div class="bgMasker line1"></div>
<div class="bgMasker line2"></div>
<div class="bgMasker line3"></div>
<div class="bgMasker line4"></div>
<div class="bgMasker line5"></div>
</div>
</body>
</html>
有一點需要說一下,由於我們使用的是漸變色的動畫效果,所以我們的布局有一點的變化,我們采用的是整體加上背景色,然后內容使用定位和left,right來構成block的方式,具體內容請參考上面的代碼
效果如下:
然后我們做一下簡單的骨架圖和內容的切換,這里就不貼代碼了,切換有很多種實現方式,不固定思維。我這邊做了兩種,一種是直接切換,一種是淡入的切換,可以簡單參考一下:
- ssr,請求后用puppeteer插入script生成當前頁的骨架圖,或者build的時候直接生成(個人覺得應該是這種),然后插入到根元素內,然后數據加載后直接隱藏並展示真實數據
- 分塊,對於圖片,將采用最小大小尺寸 1 * 1的純色gif圖,然后進行拉伸
- 數據請求后對骨架進行隱藏等操作