JS如何實現頁面骨架屏 3種骨架屏方案優化加載用戶體驗

頁面骨架屏的實現主要有三種方案,分別是純css方案、JS+css方案和工具庫方案。1. 純css方案通過背景色、動畫等樣式模擬頁面結構,優點是實現簡單、性能好,但靈活性差、維護困難;2. js+css方案由js生成html結構、css控制樣式,靈活性高、維護性好,但需編寫js代碼,對性能有一定影響;3. 工具庫方案使用如vue-content-placeholders等第三方庫快速生成骨架屏,效率高、使用方便,但引入額外依賴會增加項目體積。選擇哪種方案取決于具體需求:簡單結構可用純css,復雜結構或需動態調整則用js+css或工具庫方案。

JS如何實現頁面骨架屏 3種骨架屏方案優化加載用戶體驗

頁面骨架屏,簡單來說,就是在頁面數據加載完成之前,先展示一個頁面的大致結構,讓用戶知道頁面正在加載,而不是一片空白。JS實現骨架屏的核心在于模擬頁面的基本結構,并在數據加載完成后替換為真實內容,提升用戶體驗。

JS如何實現頁面骨架屏 3種骨架屏方案優化加載用戶體驗

直接輸出解決方案即可

JS如何實現頁面骨架屏 3種骨架屏方案優化加載用戶體驗

骨架屏的實現方式有很多,這里介紹三種常見的方案,并分析它們的優缺點:

  1. 純CSS方案:

    JS如何實現頁面骨架屏 3種骨架屏方案優化加載用戶體驗

    這種方案完全依賴CSS來實現骨架屏的樣式。通過設置元素的背景色、形狀,模擬頁面的基本結構。

    • 優點: 實現簡單,無需額外的JS代碼,對性能影響較小。
    • 缺點: 靈活性較差,難以模擬復雜的頁面結構,維護性較差,修改樣式需要修改CSS。

    例如,可以先定義一些通用的骨架屏樣式:

    .skeleton-rect {   width: 100%;   height: 20px;   background-color: #eee;   margin-bottom: 10px;   animation: skeleton-loading 1.5s linear infinite; }  @keyframes skeleton-loading {   0% {     background-color: #eee;   }   50% {     background-color: #ddd;   }   100% {     background-color: #eee;   } }

    然后在HTML中使用這些樣式:

    <div class="skeleton-rect"></div> <div class="skeleton-rect"></div> <div class="skeleton-rect" style="width: 80%;"></div>

    這種方法簡單粗暴,但對于復雜的頁面,需要大量的CSS代碼來模擬,維護起來會比較麻煩。而且,純CSS方案無法動態調整骨架屏的形狀和大小,靈活性較差。

  2. JS + CSS方案:

    這種方案結合JS和CSS來實現骨架屏。JS負責生成骨架屏的HTML結構,CSS負責定義骨架屏的樣式。

    • 優點: 靈活性較高,可以根據不同的頁面結構生成不同的骨架屏,維護性較好。
    • 缺點: 需要編寫JS代碼,對性能有一定影響。

    例如,可以使用JS生成骨架屏的HTML結構:

    function generateSkeleton(container) {   const skeletonHTML = `     <div class="skeleton-item">       <div class="skeleton-avatar"></div>       <div class="skeleton-content">         <div class="skeleton-title"></div>         <div class="skeleton-text"></div>         <div class="skeleton-text"></div>       </div>     </div>   `;    container.innerHTML = skeletonHTML; }  const container = document.getElementById('content'); generateSkeleton(container);

    然后,使用CSS定義骨架屏的樣式:

    .skeleton-item {   display: flex;   padding: 16px;   border-bottom: 1px solid #eee; }  .skeleton-avatar {   width: 48px;   height: 48px;   border-radius: 50%;   background-color: #eee;   margin-right: 16px;   animation: skeleton-loading 1.5s linear infinite; }  .skeleton-content {   flex: 1; }  .skeleton-title {   width: 80%;   height: 20px;   background-color: #eee;   margin-bottom: 8px;   animation: skeleton-loading 1.5s linear infinite; }  .skeleton-text {   width: 100%;   height: 16px;   background-color: #eee;   margin-bottom: 4px;   animation: skeleton-loading 1.5s linear infinite; }  @keyframes skeleton-loading {   0% {     background-color: #eee;   }   50% {     background-color: #ddd;   }   100% {     background-color: #eee;   } }

    這種方法比純CSS方案更靈活,可以根據不同的頁面結構生成不同的骨架屏。但是,需要編寫JS代碼,會增加一些復雜度。

  3. 工具庫方案:

    使用現成的工具庫,例如vue-content-placeholders、react-placeholder等,可以快速生成骨架屏。

    • 優點: 使用簡單,效率高,可以快速生成各種復雜的骨架屏。
    • 缺點: 需要引入額外的依賴,可能會增加項目體積。

    例如,使用vue-content-placeholders:

    <template>   <content-placeholders v-if="loading">     <content-placeholders-img />     <content-placeholders-heading />     <content-placeholders-text :lines="3" />   </content-placeholders>   <div v-else>     <!-- 真實內容 -->   </div> </template>  <script> import ContentPlaceholders from 'vue-content-placeholders'; import ContentPlaceholdersImg from 'vue-content-placeholders/lib/ContentPlaceholdersImg.vue'; import ContentPlaceholdersHeading from 'vue-content-placeholders/lib/ContentPlaceholdersHeading.vue'; import ContentPlaceholdersText from 'vue-content-placeholders/lib/ContentPlaceholdersText.vue';  export default {   components: {     ContentPlaceholders,     ContentPlaceholdersImg,     ContentPlaceholdersHeading,     ContentPlaceholdersText   },   data() {     return {       loading: true     };   },   mounted() {     // 模擬數據加載     setTimeout(() => {       this.loading = false;     }, 2000);   } }; </script>

    這種方法使用起來非常方便,可以快速生成各種復雜的骨架屏。但是,需要引入額外的依賴,可能會增加項目體積。

哪種方案更好?這取決于你的具體需求。如果只是簡單的頁面結構,純CSS方案就足夠了。如果頁面結構比較復雜,或者需要動態調整骨架屏的形狀和大小,JS + CSS方案或工具庫方案更合適。

副標題1

骨架屏如何與真實內容無縫切換,避免閃爍?

避免閃爍的關鍵在于控制骨架屏的顯示和隱藏時機。通常,我們會在數據加載開始時顯示骨架屏,在數據加載完成后隱藏骨架屏并顯示真實內容。

一種常見的做法是使用v-if或v-show等指令來控制骨架屏的顯示和隱藏。例如,在Vue中:

<template>   <div v-if="loading">     <!-- 骨架屏 -->     <div class="skeleton-rect"></div>     <div class="skeleton-rect"></div>     <div class="skeleton-rect" style="width: 80%;"></div>   </div>   <div v-else>     <!-- 真實內容 -->     <h1>{{ title }}</h1>     <p>{{ content }}</p>   </div> </template>  <script> export default {   data() {     return {       loading: true,       title: '',       content: ''     };   },   mounted() {     // 模擬數據加載     setTimeout(() => {       this.title = 'Hello World';       this.content = 'This is the real content.';       this.loading = false;     }, 2000);   } }; </script>

在這個例子中,loading變量控制著骨架屏和真實內容的顯示和隱藏。當loading為true時,顯示骨架屏;當loading為false時,顯示真實內容。

為了避免閃爍,可以在CSS中添加一些過渡效果,讓骨架屏的隱藏和真實內容的顯示更加平滑。例如:

.skeleton-rect {   /* ... */   transition: opacity 0.3s ease-in-out; }  [v-cloak] {   display: none; /* 初始隱藏,防止未渲染的內容閃爍 */ }

此外,還可以使用一些技巧來優化切換效果,例如:

  • 使用相同的背景色: 讓骨架屏和真實內容的背景色保持一致,可以減少視覺上的跳躍感。
  • 使用模糊效果: 在骨架屏隱藏時,可以添加一個短暫的模糊效果,讓切換更加平滑。
  • 預加載: 提前加載真實內容,可以減少數據加載時間,從而減少骨架屏的顯示時間。

副標題2

如何根據不同的網絡環境調整骨架屏的顯示策略?

在網絡環境較差的情況下,數據加載時間可能會比較長,這時骨架屏的顯示時間也會相應延長。為了提升用戶體驗,可以根據不同的網絡環境調整骨架屏的顯示策略。

一種常見的做法是使用navigator.connection API來檢測網絡環境。這個API可以獲取當前設備的網絡連接信息,例如網絡類型、帶寬等。

if (navigator.connection) {   const type = navigator.connection.effectiveType; // "slow-2g" | "2g" | "3g" | "4g"    if (type === 'slow-2g' || type === '2g') {     // 網絡環境較差,延長骨架屏的顯示時間,或者顯示更簡單的骨架屏     console.log('Network is slow, using simplified skeleton.');   } else {     // 網絡環境較好,正常顯示骨架屏     console.log('Network is good, using normal skeleton.');   } }

根據網絡環境,可以采取以下策略:

  • 網絡環境較差:
    • 延長骨架屏的顯示時間,讓用戶有足夠的時間了解頁面正在加載。
    • 顯示更簡單的骨架屏,減少資源消耗。
    • 使用低質量的圖片或視頻,減少數據傳輸量。
  • 網絡環境較好:
    • 正常顯示骨架屏。
    • 預加載真實內容,減少數據加載時間。
    • 使用高質量的圖片或視頻,提升用戶體驗。

此外,還可以使用一些第三方庫來檢測網絡環境,例如network-information。這些庫通常提供了更豐富的功能和更準確的網絡信息。

副標題3

骨架屏對SEO有什么影響?如何優化?

骨架屏本身對SEO沒有直接的影響,因為搜索引擎爬蟲通常會等待頁面加載完成后再抓取內容。但是,骨架屏可以間接地影響SEO,通過提升用戶體驗來提高頁面排名。

一個良好的骨架屏可以減少用戶的等待時間,提高用戶的滿意度,從而降低跳出率,增加頁面停留時間。這些指標都會影響搜索引擎的排名算法

為了優化骨架屏對SEO的影響,可以采取以下策略:

  • 確保骨架屏的加載速度: 骨架屏的加載速度要盡可能快,避免阻塞頁面的渲染。可以使用CDN來加速骨架屏的資源加載。
  • 模擬真實內容的結構: 骨架屏應該盡可能模擬真實內容的結構,讓用戶對頁面內容有一個大致的了解。
  • 使用語義化的HTML: 在編寫骨架屏的HTML結構時,應該使用語義化的HTML標簽,例如

    等。這有助于搜索引擎理解頁面內容。
  • 避免過度使用骨架屏: 骨架屏只應該在數據加載期間顯示,數據加載完成后應該立即替換為真實內容。過度使用骨架屏可能會影響用戶體驗,并對SEO產生負面影響。
  • 測試和優化: 定期測試骨架屏的性能和用戶體驗,并根據測試結果進行優化。

總而言之,骨架屏是一種提升用戶體驗的有效手段,但同時也需要注意優化,才能對SEO產生積極的影響。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享