日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用高斯模糊的效果逐步加載圖片(仿Medium)

用過 Medium 的用戶不會不記得它的圖片加載方式——純色-高斯模糊-加載完成并顯示。

成都創(chuàng)新互聯(lián)公司專注于渭南企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。渭南網(wǎng)站建設(shè)公司,為渭南等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

這是一種很優(yōu)雅的圖片預(yù)加載的方式(因為 Medium 的圖片質(zhì)量都很高,如果全部一下加載的話,需要的時間難以想象,所以,這是一種很棒的做法)。從***次打開 Medium 這個網(wǎng)站開始,我就被這種技術(shù)給吸引住了——好吧,直到今天才去研究它。

在 Medium 網(wǎng)站,打開任何一篇文章,然后,我們來 inspect 一下:

 
 
  1.         id="512a"  
  2.         class="graf--figure graf--layoutCroppedHeightPreview graf-after--h3" 
  3.      
  4.         
  5.              style="padding-bottom: 30%;" 
  6.         >
 
  •         
  •              data-image-id="1*dZnfeZiXxf2BgN3VSQuOlA.jpeg"  
  •              data-width="3600"  
  •              data-height="3600"  
  •              data-scroll="native" 
  •         > 
  •             
  •                  crossorigin="anonymous"  
  •                  class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" 
  •             > 
  •             
  •                     width="75"  
  •                     height="22" 
  •             > 
  •             
  •                  data-src="https://cdn-images-1.medium.com/fit/t/1600/480/1*dZnfeZiXxf2BgN3VSQuOlA.jpeg"  
  •                  src="https://cdn-images-1.medium.com/fit/t/1600/480/1*dZnfeZiXxf2BgN3VSQuOlA.jpeg" 
  •             > 
  •              
  •         
  •  
  •     
  •  
  •   
  • 可以看到,Medium 為每一張圖片都設(shè)置了這么長的一段 HTML。這樣做的目的就是為了讓這個圖片的逐步加載過程能夠平滑如一,同時還能在一定程度上提升用戶體驗。就算圖片沒有加載出來,顯示給用戶的是一個高斯模糊的圖片,其實也不失美感。

    那么,這個圖片的逐步加載過程具體是什么樣的呢?

    1. 渲染一個 div 容器,這個容器就是用來顯示最終展示給用戶的圖片的。通過對容器設(shè)置一個百分比的 padding-bottom 來讓其比例和大小與最終圖片的比例和大小相同,這樣,就能避免圖片加載出來的時候?qū)е碌捻撁娴闹嘏?
    2. 使用 img 標(biāo)簽來加載一張原圖質(zhì)量的 10% ~ 20% 左右的圖片,這張圖片的質(zhì)量很低,而且很小,所以可以馬上加載出來;
    3. 一旦小圖加載完成,就開始使用 canvas 來進(jìn)行繪制,添加模糊效果,同時,開始請求最終要加載的大圖;
    4. 當(dāng)最終的大圖也加載完成之后,顯示大圖,隱藏掉 canvas。

    以上就是 Medium 的做法。

    我們可以自己來實現(xiàn)這個效果,實現(xiàn)過程如下:

    1. 渲染一個容器,保持與原圖的比例和尺寸相同,填充一個較淺的背景色;
    2. 先加載小圖,同時使用模糊效果;
    3. 小圖加載完成,開始請求大圖;
    4. 大圖加載完成,顯示大圖,隱藏小圖。

    所以,綜合來看,其實并不復(fù)雜。

    首先,我們可以把大圖和小圖的 URL 和尺寸都存起來,通過標(biāo)簽的 data 屬性去動態(tài)獲取。所以,我們的 HTML 可以像下面這樣寫:

     
     
    1.         class="blur-img-container" 
    2.         data-real-width="1174" 
    3.         data-real-height="670" 
    4.         data-src="images/sm2.jpeg" 
    5.         src="https://cdn-images-1.medium.com/max/2000/1*0WwtDkE1q6HGZwD6Kn9SuQ.jpeg" 
    6. >  

    其中各個參數(shù)代表的含義是:

    • data-real-width: 大圖的寬度
    • data-real-height: 大圖的高度
    • data-src: 小圖的 URL
    • src: 大圖的 URL

    同時,我們需要定義一些 CSS 的 class 來對大圖和小圖進(jìn)行處理:

     
     
    1. .blur-img-container { 
    2.     position: relative; 
    3.     background: #eeeeee; 
    4.     background-size: cover; 
    5.     overflow: hidden; 
    6.  
    7. .blur-img-container img { 
    8.     position: absolute; 
    9.     top: 0; 
    10.     left: 0; 
    11.     width: 100%; 
    12.     height: 100%; 
    13.     opacity: 0; 
    14.     transition: all 0.4s ease-in-out; 
    15.  
    16. .blur-img-container .thumb-loaded { 
    17.     opacity: 1; 
    18.     filter: blur(10px); 
    19.     transform: scale(1); 
    20.  
    21. .blur-img-container .large-loaded { 
    22.     opacity: 1; 
    23.  
    24. .blur-img-container .thumb-hidden { 
    25.     opacity: 0; 
    26. }  

    然后,我們的重點在于 JavaScript 的處理。

    • 需要動態(tài)的設(shè)置每個圖片的容器的 padding-bottom 以防止頁面發(fā)生重排;
    • 通過 image 的 onload 事件來控制其樣式和進(jìn)度

    ***點,動態(tài)設(shè)置我們的容器的 padding-bottom??梢酝ㄟ^計算寬高比然后換算成百分比:

     
     
    1. elem.style.paddingBottom = `${(realHeight / realWidth) * 100}%`; 

    第二點,使用圖像的 onload 事件來控制加載的進(jìn)度:

     
     
    1. let thumb = new Image(); 
    2. thumb.src = thumbSrc; 
    3. thumb.onload = () => { 
    4.     // 小圖加載完成,顯示小圖,設(shè)置樣式 
    5.     setStyle(thumb, 'thumb-loaded'); 
    6. }; 
    7. elem.appendChild(thumb); 
    8.  
    9. let realImg = new Image(); 
    10. realImg.src = lgSrc; 
    11. realImg.onload = () => { 
    12.     // 大圖加載完成,顯示大圖,隱藏小圖 
    13.     setStyle(realImg, 'large-loaded'); 
    14.     setStyle(thumb, 'thumb-hidden'); 
    15. }; 
    16.  
    17. // 將大圖添加到頁面中 
    18. elem.appendChild(realImg);  

    其實,只要把上面兩點主要的功能做好了,我們的這個效果基本上就實現(xiàn)了。

    可以通過我的 GitHub Repo 來查看完整的源代碼和例子 blur-image。

    同時,我將這個小功能封裝成了一個 package,需要的朋友可以通過 npm install blur-image 或者 bower install blur-image 進(jìn)行安裝和使用。具體的安裝和使用方法可以查看文檔。


    名稱欄目:使用高斯模糊的效果逐步加載圖片(仿Medium)
    URL網(wǎng)址:http://www.5511xx.com/article/cdseios.html