久久er99热精品一区二区三区,波多野结衣在线观看一区二区 ,成人做爰视频www网站小优视频,在线免费福利

二維碼
企資網(wǎng)

掃一掃關(guān)注

當前位置: 首頁 » 企業(yè)資訊 » 行業(yè) » 正文

web前端性能優(yōu)化_圖片加載的優(yōu)化

放大字體  縮小字體 發(fā)布日期:2021-09-05 02:29:29    作者:企資小編    瀏覽次數(shù):77
導讀

作者:麥樂來源:恒生LIGHT云社區(qū)圖像延遲加載想要得到更好的性能體驗,只靠資源壓縮與恰當?shù)奈募袷竭x型,是很難滿足期望的。我們還需要針對資源加載過程進行優(yōu)化。什么是延遲加載?下圖是京東商城的手機端首頁,

作者:麥樂

來源:恒生LIGHT云社區(qū)

圖像延遲加載

想要得到更好的性能體驗,只靠資源壓縮與恰當?shù)奈募袷竭x型,是很難滿足期望的。我們還需要針對資源加載過程進行優(yōu)化。

什么是延遲加載?

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

傳統(tǒng)方式延遲加載

就是事件監(jiān)聽的方式,通過監(jiān)聽scroll事件與resize事件,并在事件的回調(diào)函數(shù)中去判斷,需要進行延遲加載的圖片是否進入視窗區(qū)域。

我們只需要關(guān)注三個屬性。

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

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

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

            rectObject = object.getBoundingClientRect();

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

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

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

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

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

    document.addEventListener(DOMContentLoaded, function() {      const imags = [].slice.call(document.querySelector('.lazy'))      const active = false; // 限制函數(shù)被頻繁調(diào)動      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)    })

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

    實現(xiàn)圖片的延遲加載:Intersection Observer方式

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

    簡單來說,目標元素的可見性變化時,就會調(diào)用觀察器的回調(diào)函數(shù) callback

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

     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)          })        }         })

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

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

    實現(xiàn)圖片的延遲加載:CSS類名方式

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

      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樣式。

    原生的延遲加載支持

    除了上述通過開發(fā)者手動實現(xiàn)延遲加載邏輯的方式,從Chrome 75版本開始,已經(jīng)可以通過〈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>

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

    實踐發(fā)現(xiàn)有以下幾個特點:

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

    與Javascript有關(guān)的幾個行為特征:

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

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

    粵ICP備16078936號

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

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

    反饋

    用戶
    反饋

    久久er99热精品一区二区三区,波多野结衣在线观看一区二区 ,成人做爰视频www网站小优视频,在线免费福利
    午夜精品一区二区三区电影天堂 | 欧美三级在线视频| 精彩视频一区二区| 国产精品天天看| 91麻豆精品国产91久久久久久| 国产精品性做久久久久久| 亚洲一区二区三区四区在线免费观看 | 777午夜精品免费视频| 成人性生交大片免费看在线播放| 亚洲午夜视频在线观看| 日韩精品最新网址| 欧美日韩亚洲高清一区二区| 不卡的电视剧免费网站有什么| 裸体健美xxxx欧美裸体表演| 亚洲精品国久久99热| 2020国产成人综合网| 日韩一级黄色片| 777午夜精品免费视频| 欧美在线999| 99国内精品久久| 国产精品影音先锋| 久久机这里只有精品| 久久综合综合久久综合| 日本午夜精品视频在线观看 | 精品欧美黑人一区二区三区| 91高清在线观看| 91福利视频网站| 欧美日韩一区二区在线视频| 欧美日韩国产在线观看| 欧美日韩三级一区二区| 欧美日韩一区二区三区视频| 欧美日韩一区二区在线观看视频| 91美女片黄在线| 91精品1区2区| 欧美不卡在线视频| 久久男人中文字幕资源站| 国产欧美一区二区三区鸳鸯浴| 国产精品乱人伦| 秋霞午夜鲁丝一区二区老狼| 99综合影院在线| 精品国产99国产精品| 亚洲女人的天堂| 国产在线精品一区二区不卡了| 在线免费精品视频| 久久久久久一二三区| 婷婷亚洲久悠悠色悠在线播放| 高清在线不卡av| 精品欧美黑人一区二区三区| 亚洲成人精品在线观看| 91麻豆国产精品久久| 久久精品一区四区| 日本sm残虐另类| 欧美精品乱码久久久久久| 怡红院av一区二区三区| 成人深夜福利app| 亚洲国产精品精华液ab| 国产99久久久国产精品潘金 | ●精品国产综合乱码久久久久 | 国产成人精品影院| 国产欧美一区二区精品秋霞影院| 秋霞国产午夜精品免费视频| 91精品福利在线一区二区三区 | 日本麻豆一区二区三区视频| 欧美精品在线观看播放| 午夜av一区二区三区| 91免费观看视频在线| 亚洲精品乱码久久久久久黑人 | jlzzjlzz亚洲日本少妇| 亚洲男人的天堂在线aⅴ视频| 99免费精品视频| 一区二区三区中文在线观看| 在线免费观看日本一区| 天天做天天摸天天爽国产一区| 欧美一区午夜精品| 国产乱码精品一区二区三区忘忧草| 2021中文字幕一区亚洲| 91网页版在线| 蜜乳av一区二区三区| 久久伊人中文字幕| 91美女视频网站| 久久精品国产一区二区三| 国产欧美一区视频| 日本韩国欧美三级| 久久99精品国产.久久久久| 国产精品麻豆一区二区| 欧美二区在线观看| av中文字幕亚洲| 秋霞av亚洲一区二区三| 国产精品无圣光一区二区| 欧美日韩高清一区二区三区| 国产精品一二二区| 亚洲mv在线观看| 亚洲欧美日韩国产另类专区| 日韩丝袜情趣美女图片| 91久久奴性调教| 国产在线观看免费一区| 天堂在线亚洲视频| 日韩理论片中文av| 久久精品人人做人人爽人人| 欧美日韩国产片| 日本韩国一区二区| av在线一区二区| 成人永久aaa| 国产在线精品视频| 久久精品国产一区二区三| 亚洲成av人影院| 亚洲午夜一区二区三区| 亚洲激情图片qvod| 国产成人亚洲综合色影视| 狠狠色狠狠色综合| 久久国产精品色| 免费成人在线观看视频| 日本怡春院一区二区| 午夜一区二区三区视频| 丝袜亚洲另类欧美综合| 丝袜脚交一区二区| 日韩高清不卡一区二区| 蜜桃一区二区三区在线观看| 日韩精品成人一区二区三区| 日韩激情视频在线观看| 麻豆视频一区二区| 精品一区二区免费视频| 国产一区二区精品久久99| 国产精品白丝jk黑袜喷水| 成人国产亚洲欧美成人综合网| 福利一区福利二区| 91麻豆自制传媒国产之光| 欧美午夜不卡视频| 日韩欧美成人一区| 中文字幕av资源一区| 亚洲欧美激情小说另类| 日韩主播视频在线| 韩国av一区二区| 欧美午夜精品久久久久久孕妇| 91精品国产综合久久久蜜臀粉嫩| 精品国产99国产精品| 亚洲欧洲成人精品av97| 亚洲一区日韩精品中文字幕| 韩国精品久久久| 欧美日韩视频专区在线播放| 欧美本精品男人aⅴ天堂| 亚洲精品老司机| 国内精品在线播放| 欧美午夜电影一区| 中文字幕va一区二区三区| 五月激情六月综合| a级精品国产片在线观看| 欧美一二三区在线观看| 亚洲一区二区三区在线| 懂色av一区二区三区免费看| 欧美精品vⅰdeose4hd| 国产精品久久久99| 国产精品99精品久久免费| 欧美白人最猛性xxxxx69交| 亚洲国产综合色| 91亚洲国产成人精品一区二区三| 欧美一级二级三级蜜桃| 亚洲午夜久久久久久久久久久| 播五月开心婷婷综合| 久久精品人人做人人爽人人| 久久9热精品视频| 欧美精品777| 美女国产一区二区| 日韩免费性生活视频播放| 日本不卡不码高清免费观看| 欧美日韩在线不卡| 天天色综合天天| 欧美日韩高清一区二区三区| 亚洲国产日产av| 3atv在线一区二区三区| 麻豆一区二区三| 精品第一国产综合精品aⅴ| 激情综合一区二区三区| 精品乱码亚洲一区二区不卡| 一本色道a无线码一区v| 欧美精品一区二区三区四区 | 一区在线观看免费| 色综合久久88色综合天天免费| 亚洲天堂av一区| 欧美午夜电影网| 久久精品噜噜噜成人88aⅴ| 久久精品人人做| 97久久人人超碰| 午夜不卡在线视频| 久久久亚洲高清| 色网站国产精品| 麻豆成人91精品二区三区| 国产精品你懂的在线| 欧美日韩精品久久久| 国产成人一区二区精品非洲| 亚洲精品伦理在线| 精品精品国产高清a毛片牛牛 | 97久久精品人人做人人爽50路 | 国产精品一卡二卡在线观看| 在线观看亚洲成人| 久久久久国产精品免费免费搜索| 91麻豆123| 欧美亚洲丝袜传媒另类| 一本一道久久a久久精品| 色八戒一区二区三区|