如何實現優美的骨架屏


對於前端來說,最重要的莫過於用戶體驗了,這次我們聊一聊骨架屏 - Skeleton Screen

我們平常對於需要請求加載的內容,可能用的比較多的是loading動畫,比如在內容區域放一個菊花圖,當請求結束,並且render tree構造完成后,將菊花圖移除,展示用戶想看的內容。雖然這種方式沒啥缺點,但是現在更多的網站開始使用骨架屏代替,因為它能帶過來更好的用戶體驗。
我們看幾個例子:

facebook

jira

linkedin

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的方式,具體內容請參考上面的代碼

效果如下:

然后我們做一下簡單的骨架圖和內容的切換,這里就不貼代碼了,切換有很多種實現方式,不固定思維。我這邊做了兩種,一種是直接切換,一種是淡入的切換,可以簡單參考一下:


餓了么骨架圖方案

  1. ssr,請求后用puppeteer插入script生成當前頁的骨架圖,或者build的時候直接生成(個人覺得應該是這種),然后插入到根元素內,然后數據加載后直接隱藏並展示真實數據
  2. 分塊,對於圖片,將采用最小大小尺寸 1 * 1的純色gif圖,然后進行拉伸
  3. 數據請求后對骨架進行隱藏等操作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM