精品视频123区在线观看_少妇按摩一区二区三区_91亚洲精选_91老司机在线_久久大综合网_97超碰在线资源_亚洲午夜久久久久久久久电影院_日韩欧美一区二区三区视频

二維碼
企資網

掃一掃關注

當前位置: 首頁 » 企業資訊 » 行業 » 正文

web前端性能優化_圖片加載的優化

放大字體  縮小字體 發布日期:2021-09-05 02:29:29    作者:企資小編    瀏覽次數:73
導讀

作者:麥樂來源:恒生LIGHT云社區圖像延遲加載想要得到更好的性能體驗,只靠資源壓縮與恰當的文件格式選型,是很難滿足期望的。我們還需要針對資源加載過程進行優化。什么是延遲加載?下圖是京東商城的手機端首頁,

作者:麥樂

來源:恒生LIGHT云社區

圖像延遲加載

想要得到更好的性能體驗,只靠資源壓縮與恰當的文件格式選型,是很難滿足期望的。我們還需要針對資源加載過程進行優化。

什么是延遲加載?

下圖是京東商城的手機端首頁,當元素沒有滑動到視線內時,圖片src屬性放置了一個很小的圖片,init_src屬性放置了真正的圖片,只要當該元素滑動到視線內部,才會將init_src屬性賦值給src去加載真實的圖片,這就是一個簡單的圖片延遲加載的過程。

傳統方式延遲加載

就是事件監聽的方式,通過監聽scroll事件與resize事件,并在事件的回調函數中去判斷,需要進行延遲加載的圖片是否進入視窗區域。

我們只需要關注三個屬性。

  • class屬性,稍后會在Javascript中使用類選擇器選取需要延遲加載處理的〈img〉標簽。
  • src屬性,加載前的占位符圖片,可用base64圖片或低分辨率的圖片。
  • data-src屬性,通過該自定義屬性保存圖片真實的URL外鏈。

    加入頁面中有多張這樣的圖片需要加載。具體的Javascript實現邏輯如下,在文檔的DOMContentLoaded事件中,添加延遲加載處理邏輯,首先獲取class屬性名為lazy的所有〈img〉標簽,將這些標簽暫存在一個名為lazyImages的數組中,表示需要進行延遲加載但還未加載的圖片集合。當一個圖片被加載后,便將其從lazyImages數組中移除,直到lazyImages數組為空時,表示所有待延遲加載的圖片均已經加載完成,此時便可將頁面滾動事件移除。

    這里使用了getBoundingClientRect()函數獲取元素的相對位置.

            rectObject = object.getBoundingClientRect();

    rectObject.top:元素上邊到視窗上邊的距離;

    rectObject.right:元素右邊到視窗左邊的距離;

    rectObject.bottom:元素下邊到視窗上邊的距離;

    rectObject.left:元素左邊到視窗左邊的距離;

    對于只可上下滾動的頁面,判斷一個圖片元素是否出現在屏幕視窗中的方法其實顯而易見,即當元素上邊緣距屏幕視窗頂部的top值小于整個視窗的高度window.innerHeight時,預加載的事件處理代碼如下:

    document.addEventListener(DOMContentLoaded, function() {      const imags = [].slice.call(document.querySelector('.lazy'))      const active = false; // 限制函數被頻繁調動      function load() {        if(active === false) {          active = true          setTimeout(() => {            imags.forEach((img) => {              const objPos = img.getBoundingClientRect();              if(objPos.top <= window.innerHeight && objPos.bottom >=0 && img.display !== 'done') {                img.src = img.dataset.src;                img.classList.remove('lazy')                imags.filter((i) => (i !== img))                if(imags.length === 0) {                  document.removeEventListener('scroll', load)                  window.removeEventListener('resize', load)                  window.removeEventListener('orientationchange', load)                }                }            })            active = false          }, 200)        }      }      document.addEventListener('scroll', load)      window.addEventListener('resize', load)      window.addEventListener('orientationchange', load)    })

    這種方式的有點就是兼容性比較好,缺點是頻繁地進行計算必然會影響性能,代碼也會比較繁瑣。

    實現圖片的延遲加載:Intersection Observer方式

    現代瀏覽器已大多支持了Intersection Observer API,用一句話簡述:每當因頁面滾動或窗口尺寸發生變化,使得目標元素(target)與設備視窗或其他指定元素產生交集時,便會觸發通過Intersection Observer API配置的回調函數,在該回調函數中進行延遲加載的邏輯處理,會比傳統方式顯得更加簡潔而高效。

    簡單來說,目標元素的可見性變化時,就會調用觀察器的回調函數 callback

    callback一般會觸發兩次。一次是目標元素剛剛進入視口(開始可見),另一次是完全離開視口(開始不可見)。

     document.addEventListener(DOMContentLoaded, function() {        const imags = [].slice.call(document.querySelector('.lazy'))        if(window.IntersectionObserver && window.IntersectionObserverEntry && window.IntersectionObserverEntry.prototype.intersectionRatio) {          var lazyImgObserver = new IntersectionObserver((entries, observer) => {            entries.forEach((entry)=> {              if(entry.isIntersecting) {                var lazyImg = entry.target;                lazyImg.src = lazyImg.dataset.src;                lazyImg.classList.remove('lazy');                lazyImgObserver.unobserve(lazyImg)              }            })          })          imags.forEach((img) => {            lazyImgObserver.observe(img)          })        }         })

    這種方式判斷元素是否出現在視窗中更為簡單直觀,應在實際開發中盡量使用,但其問題是并非所有瀏覽器都能兼容。

    (1)做好盡量完備瀏覽器兼容性檢查,對于兼容Intersection Observer API的瀏覽器,采用這種方式進行處理,而對于不兼容的瀏覽器,則切換回傳統的實現方式進行處理。 (2)使用相應兼容的polyfill插件,在W3C官方GitHub賬號下就有提供。

    實現圖片的延遲加載:CSS類名方式

    這種實現方式通過CSS的background-image屬性來加載圖片,與判斷〈img〉標簽src屬性是否有要請求圖片的URL不同,CSS中圖片加載的行為建立在瀏覽器對文檔分析基礎之上。

      document.addEventListener(DOMContentLoaded, function() {        const imags = [].slice.call(document.querySelector('.lazy'))        if(window.IntersectionObserver && window.IntersectionObserverEntry && window.IntersectionObserverEntry.prototype.intersectionRatio) {          var lazyImgObserver = new IntersectionObserver((entries, observer) => {            entries.forEach((entry)=> {              if(entry.isIntersecting) {                var lazyImg = entry.target;                lazyImg.classList.add('visible');                lazyImgObserver.unobserve(lazyImg)              }            })          })          imags.forEach((img) => {            lazyImgObserver.observe(img)          })        }         })

    這種方式限制于需要提前寫好css樣式。

    原生的延遲加載支持

    除了上述通過開發者手動實現延遲加載邏輯的方式,從Chrome 75版本開始,已經可以通過〈img〉和〈iframe〉標簽的loading屬性原生支持延遲加載了,loading屬性包含以下三種取值。

    ● lazy:進行延遲加載。 ● eager:立即加載。 ● auto:瀏覽器自行決定是否進行延遲加載。

    測試:image標簽就是 img

    <!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta http-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>document</title>  <!-- <script src=nnzzn/skin/m04blueskin/image/nopic.gif -->  <!-- <script src=nnzzn/skin/m04blueskin/image/nopic.gif -->  <!-- <link rel="stylesheet" href="css/index.css"> -->  <style>    img {      width: 700px;      height: 200px;      display: block;    }  </style></head><body>      <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />    <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />    <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" />  <imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" /><imgage loading="lazy" src=nnzzn/skin/m04blueskin/image/nopic.gif alt="photo" /></body></html>

    可以看到,首次加載的個數是13個,首屏一般只能放下4個左右,13個以后的img滾動到視線內部會自動去加載。

    實踐發現有以下幾個特點:

    1. Lazy loading加載數量與屏幕高度有關,高度越小加載數量越少,但并不是線性關系。
    2. Lazy loading加載數量與網速有關,網速越慢,加載數量越多,但并不是線性關系。
    3. Lazy loading加載沒有緩沖,滾動即會觸發新的圖片資源加載。
    4. Lazy loading加載在窗口resize尺寸變化時候也會觸發,例如屏幕高度從小變大的時候。
    5. Lazy loading加載也有可能會先加載后面的圖片資源,例如頁面加載時滾動高度很高的時候。

    與Javascript有關的幾個行為特征:

    1. 判斷瀏覽器是否支持原生loading,最好使用'loading' in XXX判斷。
    2. 獲取loading屬性值可以直接img.loading;
    3. 原生loading不可寫,不可訪問例如HTMLImageElement.prototype.loading會報錯Illegal invocation。
    4. 如果要使用,注意做兼容性處理。
  •  
    (文/企資小編)
    免責聲明
    本文僅代表作發布者:企資小編個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

    粵ICP備16078936號

    微信

    關注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯系
    客服

    聯系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    成人精品视频在线播放| a在线视频观看| 精品少妇一区二区三区视频免付费 | 日韩精品一区二区三区四区| 久久久久88色偷偷免费| 亚洲啊v在线观看| 精品自拍视频| 麻豆电影在线播放| av网站网址| 中文字幕人成高视频| 国产区一区二区三| 亚洲第一成人网站| 嫩草av久久伊人妇女超级a| 欧美精品成人一区二区在线观看| 久久久久久亚洲精品| 欧洲精品在线观看| 最近日韩中文字幕| 国产麻豆精品久久一二三| 91精品一区国产高清在线gif| 在线日韩三级| 99爱在线视频| 精品无吗乱吗av国产爱色| 自拍电影在线观看| 日韩一级免费视频| 中文字幕一区在线播放| 中日韩精品一区二区三区| 欧美女人性生活视频| 先锋影音日韩| αv一区二区三区| 国产亚洲va综合人人澡精品| 精品国产免费视频| 97热在线精品视频在线观看| 在线中文字幕视频| www91在线观看| 蜜臀久久久久久999| 精品无码久久久久| 一级片久久久久| 丰满少妇一区二区三区专区 | 91网站免费观看| 欧美xxxx18国产| 亚洲人成网站色ww在线| 精品国产污污免费网站入口| 精品美女国产在线| 国产精品www.| 911精品美国片911久久久| 日日噜噜夜夜狠狠视频欧美人| 国产91对白在线播放| 日本电影二区| 成人在线播放网址| 成人黄色免费网| 青青草原在线亚洲| 日韩国产激情在线| 国产乱码一区二区三区四区| 最近中文字幕第一页| 免费大片在线观看www| 26uuu精品一区二区在线观看| 黑人另类av| 人妻无码中文字幕免费视频蜜桃| 老牛影视av一区二区在线观看| 色香蕉成人二区免费| 欧美另类老女人| 免费黄色a级片| 美女视频免费观看网站在线| 成人一区而且| 久久动漫网址| 久久久国产午夜精品| 欧美成人中文字幕| 妺妺窝人体色www在线下载| 亚洲午夜一级| 作爱视频免费观看视频在线播放激情网| 女同互忝互慰dv毛片观看| 牛牛精品视频在线| 韩日精品视频| 91精品国产91久久久久久吃药| 日韩av在线中文| 怡红院男人的天堂| 男人精品网站一区二区三区| www.4438全国最大| 丝袜美腿亚洲一区| 国产在线精品一区二区中文| 中文字幕 欧美 日韩| 免费av一级片| 欧美xxxx黑人又粗又长| 成人四虎影院| 在线精品视频一区二区三四| 99久久精品免费看国产一区二区三区| 91福利免费观看| 性插视频在线观看| 亚洲黄色中文字幕| 一本大道久久加勒比香蕉| 国产乱人伦偷精品视频免下载| 精品亚洲国产成人av制服丝袜| 在线播放精品一区二区三区| 超碰97人人人人人蜜桃| 国产精品毛片一区视频播 | av中文字幕网址| 加勒比av在线播放| jizz性欧美10| 在线观看一区二区精品视频| 国产精品中文字幕久久久| 亚洲制服在线观看| 18以下岁禁止1000部免费| 国产精品综合网| 国产一区免费观看| 黄色激情视频网址| av综合网址| 欧美系列日韩一区| 精选一区二区三区四区五区| 国产又粗又猛又色又| 91精品秘密在线观看| 91精品国产91久久久久| av黄色在线免费观看| 青春草在线观看| 亚洲国产第一| 欧美日韩xxxxx| 日本aⅴ中文| 日本a级片电影一区二区| 888av在线| 国产伦一区二区三区色一情| 99久久99久久精品国产片桃花| 日本一区二区在线观看视频| 国产欧美一级| 色呦呦一区二区| 99re6热只有精品免费观看| 自拍欧美一区| 另类人妖一区二区av| 玉米视频成人免费看| www久久久久| 丝袜美腿小色网| 国产一区二区三区四区二区| 正在播放亚洲1区| 99中文字幕在线| 国产精品专区免费| 国产视频三级在线观看播放| 凹凸日日摸日日碰夜夜爽1| 老汉色影院首页| 成人在线一级片| 成人毛片视频免费看| 日本视频三区| 亚洲视频资源| 久久99国产乱子伦精品免费| 欧美精三区欧美精三区| 国产精品成人久久久久| 97国产精东麻豆人妻电影 | 精品无人区无码乱码毛片国产| 国产精品无码在线播放 | 男女污污视频在线观看| 天堂在线观看免费视频| 日韩av电影免费| 日韩精品成人在线观看| 国产精品自拍三区| 5858s免费视频成人| 亚洲最大福利网| 天堂va欧美va亚洲va老司机| 囯产精品一品二区三区| 三级在线视频| 色综合久久网| 亚洲一区视频在线观看视频| 久久久久久久网站| 黄色一级片播放| 一本久道久久综合无码中文| 一二三区在线观看| 窝窝社区一区二区| 国产精品久久久久久久久搜平片| 爱福利视频一区| 欧美黑人在线观看| 无码人妻熟妇av又粗又大| 伊人发布在线| 久久国产电影| 欧美午夜性色大片在线观看| 国产主播欧美精品| 亚洲第一页av| 丰满岳乱妇dvd日本| 欧美激情三级| 国产精品水嫩水嫩| 欧美伊久线香蕉线新在线| 中文字幕丰满乱码| 欧美色第一页| 国产精久久一区二区| 国产精品系列在线| 国产精品久久综合av爱欲tv| 国产一区二区不卡视频| 欧美另类z0zx974| h视频免费高清在线观看| 亚州精品视频| 欧美性生活大片免费观看网址| www国产亚洲精品| 九九精品视频免费| а√天堂www在线а√天堂视频| 91综合久久| 欧美一区二区私人影院日本| 久久久久久久免费视频| 亚洲一区二区激情| 男女视频在线| 99国内精品久久| 5278欧美一区二区三区| 免费观看一级一片| 91大神网址| 亚洲国产清纯| 亚洲欧美一区二区精品久久久|