99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

實現一個Vue自定義指令懶加載

2020-5-16    seo達人

什么是圖片懶加載

當我們向下滾動的時候圖片資源才被請求到,這也就是我們本次要實現的效果,進入頁面的時候,只請求可視區(qū)域的圖片資源這也就是懶加載。


比如我們加載一個頁面,這個頁面很長很長,長到我們的瀏覽器可視區(qū)域裝不下,那么懶加載就是優(yōu)先加載可視區(qū)域的內容,其他部分等進入了可視區(qū)域在加載。


這個功能非常常見,你打開淘寶的首頁,向下滾動,就會看到會有圖片不斷的加載;你在百度中搜索圖片,結果肯定成千上萬條,不可能所有的都一下子加載出來的,很重要的原因就是會有性能問題。你可以在Network中查看,在頁面滾動的時候,會看到圖片一張張加載出來。


lazyLoad


為什么要做圖片懶加載

懶加載是一種網頁性能優(yōu)化的方式,它能極大的提升用戶體驗。就比如說圖片,圖片一直是影響網頁性能的主要元兇,現在一張圖片超過幾兆已經是很經常的事了。如果每次進入頁面就請求所有的圖片資源,那么可能等圖片加載出來用戶也早就走了。所以,我們需要懶加載,進入頁面的時候,只請求可視區(qū)域的圖片資源。


總結出來就兩個點:


1.全部加載的話會影響用戶體驗


2.浪費用戶的流量,有些用戶并不像全部看完,全部加載會耗費大量流量。


懶加載原理

圖片的標簽是 img標簽,圖片的來源主要是 src屬性,瀏覽器是否發(fā)起加載圖片的請求是根據是否有src屬性決定的。


所以可以從 img標簽的 src屬性入手,在沒進到可視區(qū)域的時候,就先不給 img 標簽的 src屬性賦值。


懶加載實現

實現效果圖:


imgLazyLoad


<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <meta name="viewport" content="width=device-width, initial-scale=1.0">

   <title>Document</title>

   <style>

       div {

           display: flex;

           flex-direction: column;

       }

       img {

           width: 100%;

           height: 300px;

       }

   </style>

</head>

<body>

   <div>

       <img data-src="https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657907683.jpeg">

       <img data-src="https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657913523.jpeg">

       <img data-src="https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657925550.jpeg">

       <img data-src="https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657930289.jpeg">

       <img data-src="https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657934750.jpeg">

       <img data-src="https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657918315.jpeg">

   </div>

</body>


</html>

監(jiān)聽 scroll 事件判斷元素是否進入視口

const imgs = [...document.getElementsByTagName('img')];

let n = 0;


lazyload();


function throttle(fn, wait) {

   let timer = null;

   return function(...args) {

       if(!timer) {

           timer = setTimeout(() => {

               timer = null;

               fn.apply(this, args)

           }, wait)

       }

   }

}

 

function lazyload() {

   var innerHeight = window.innerHeight;

   var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

   for(let i = n; i < imgs.length; i++) {

       if(imgs[i].offsetTop < innerHeight + scrollTop) {

           imgs[i].src = imgs[i].getAttribute("data-src");

           n = i + 1;

       }

       

   }

}

window.addEventListener('scroll', throttle(lazyload, 200));

可能會存在下面幾個問題:


每次滑動都要執(zhí)行一次循環(huán),如果有1000多個圖片,性能會很差

每次讀取 scrollTop 都會引起回流

scrollTop跟DOM的嵌套關系有關,應該根據getboundingclientrect獲取

滑到最后的時候刷新,會看到所有的圖片都加載了

IntersectionObserver

Intersection Observer API提供了一種異步觀察目標元素與祖先元素或文檔viewport的交集中的變化的方法。


創(chuàng)建一個 IntersectionObserver對象,并傳入相應參數和回調用函數,該回調函數將會在目標(target)元素和根(root)元素的交集大小超過閾值(threshold)規(guī)定的大小時候被執(zhí)行。


var observer = new IntersectionObserver(callback, options);

IntersectionObserver是瀏覽器原生提供的構造函數,接受兩個參數:callback是可見性變化時的回調函數(即目標元素出現在root選項指定的元素中可見時,回調函數將會被執(zhí)行),option是配置對象(該參數可選)。


返回的 observer是一個觀察器實例。實例的 observe 方法可以指定觀察哪個DOM節(jié)點。


具體的用法可以 查看 MDN文檔


const imgs = [...document.getElementsByTagName('img')];

// 當監(jiān)聽的元素進入可視范圍內的會觸發(fā)回調

if(IntersectionObserver) {

    // 創(chuàng)建一個 intersection observer

    let lazyImageObserver = new IntersectionObserver((entries, observer) => {

        entries.forEach((entry, index) => {

            let lazyImage = entry.target;

            // 相交率,默認是相對于瀏覽器視窗

            if(entry.intersectionRatio > 0) {

               lazyImage.src = lazyImage.getAttribute('data-src');

               // 當前圖片加載完之后需要去掉監(jiān)聽

                lazyImageObserver.unobserve(lazyImage);

            }


        })

    })

    for(let i = 0; i < imgs.length; i++) {

       lazyImageObserver.observe(imgs[i]);

    }

}

源碼地址-codePen點擊預覽

vue自定義指令-懶加載

Vue自定義指令

下面的api來自官網自定義指令:


鉤子函數

bind: 只調用一次,指令第一次綁定到元素時調用。在這里可以進行一次性的初始化設置。

inserted: 被綁定元素插入父節(jié)點時調用 (僅保證父節(jié)點存在,但不一定已被插入文檔中)。

update: 所在組件的 VNode 更新時調用,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新

componentUpdated: 指令所在組件的 VNode 及其子 VNode 全部更新后調用。

unbind: 只調用一次,指令與元素解綁時調用。

鉤子函數參數

指令鉤子函數會被傳入以下參數:


el:指令所綁定的元素,可以用來直接操作 DOM。

binding:一個對象,包含以下 property:


name:指令名,不包括 v- 前綴。

value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。

oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。

expression:字符串形式的指令表達式。例如 v-my-directive="1 + 1" 中,表達式為 "1 + 1"。

arg:傳給指令的參數,可選。例如 v-my-directive:foo 中,參數為 "foo"。

modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }。

vnode:Vue 編譯生成的虛擬節(jié)點。

oldVnode:上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。

實現 v-lazyload 指令

<!DOCTYPE html>

<html lang="en">

   <head>

       <meta charset="UTF-8" />

       <meta name="viewport" content="width=device-width, initial-scale=1.0" />

       <title>Document</title>

       <style>

           img {

               width: 100%;

               height: 300px;

           }

       </style>

   </head>

   <body>

       <div id="app">

           <p v-for="item in imgs" :key="item">

               <img v-lazyload="item">

           </p>

       </div>

   </body>

   <script src="https://cdn.jsdelivr.net/npm/vue"></script>

   <script>

       Vue.directive("lazyload", {

           // 指令的定義

           bind: function(el, binding) {

日歷

鏈接

個人資料

藍藍設計的小編 http://www.lapeinture.cn

存檔

日本伦理片网站| 欧美日本韩国| 国产高清视频免费观看| 国产成a人片在线观看视频| 麻豆污视频| 九九免费精品视频| 欧美国产日韩一区二区三区| 亚欧乱色一区二区三区| 一本高清在线| 一级女性全黄久久生活片| 午夜欧美福利| 日韩在线观看视频网站| 九九干| 日韩欧美一及在线播放| 成人免费网站久久久| 国产国语对白一级毛片| 日本特黄特黄aaaaa大片| 一级毛片看真人在线视频| 日本特黄特色aa大片免费| 国产极品精频在线观看| 韩国妈妈的朋友在线播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 色综合久久久久综合体桃花网| 可以免费在线看黄的网站| 国产亚洲精品成人a在线| 国产高清在线精品一区二区| 成人免费网站视频ww| 青青青草视频在线观看| 麻豆污视频| 欧美1卡一卡二卡三新区| 91麻豆国产级在线| 一级毛片视频免费| 成人av在线播放| 久久福利影视| 国产伦理精品| 久久精品免视看国产明星| 日本伦理片网站| 日本特黄特色aa大片免费| 精品在线免费播放| 日韩中文字幕在线观看视频| 国产韩国精品一区二区三区| 国产国产人免费视频成69堂| 国产成人精品综合在线| 日韩av片免费播放| 国产成人精品综合久久久| 日本特黄一级| 四虎影视库国产精品一区| 中文字幕97| 99久久精品国产片| 青草国产在线| 91麻豆国产福利精品| 天天做日日爱夜夜爽| 四虎精品在线观看| 亚洲第一色在线| 国产亚洲男人的天堂在线观看| a级精品九九九大片免费看| 999久久66久6只有精品| 九九久久国产精品| 国产亚洲免费观看| 999久久久免费精品国产牛牛| 欧美爱色| 一级毛片视频免费| 久久国产影院| 国产成人啪精品| 午夜欧美福利| 精品国产一区二区三区精东影业 | 九九久久国产精品大片| 日韩男人天堂| 一本伊大人香蕉高清在线观看| 九九精品在线| 久久国产影院| 高清一级毛片一本到免费观看| 国产高清视频免费| 久久精品欧美一区二区| 日本特黄特黄aaaaa大片| 青青久久国产成人免费网站| 国产激情视频在线观看| 青青久在线视频| 一级毛片看真人在线视频| 免费的黄色小视频| 国产精品1024永久免费视频| 日韩一级黄色| 999精品视频在线| 99久久精品国产国产毛片| 欧美18性精品| 国产麻豆精品高清在线播放| 欧美一级视频免费观看| 青青久在线视频| 999久久66久6只有精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产一区二区福利久久| 日本特黄特黄aaaaa大片| 日本伦理片网站| 国产伦久视频免费观看 视频| 91麻豆国产级在线| 国产成人精品综合在线| 国产麻豆精品hdvideoss| 午夜在线影院| 国产91精品露脸国语对白| 天天做人人爱夜夜爽2020| 91麻豆精品国产片在线观看| 麻豆网站在线免费观看| 麻豆系列国产剧在线观看| 国产不卡在线观看视频| 欧美激情影院| 国产亚洲免费观看| 成人高清视频免费观看| 国产视频一区二区三区四区| 免费一级生活片| 免费一级片在线观看| 亚洲 国产精品 日韩| 99色精品| 精品国产一区二区三区久 | 精品视频一区二区| 日韩字幕在线| 成人免费一级纶理片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩专区在线播放| 国产原创中文字幕| 精品视频一区二区三区| 一级毛片视频在线观看| 一级毛片看真人在线视频| 免费一级片在线观看| 亚洲第一页乱| 高清一级做a爱过程不卡视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日日夜人人澡人人澡人人看免| 欧美a免费| 亚洲天堂免费| 欧美激情影院| 精品国产亚洲一区二区三区| 久久精品免视看国产明星| 亚洲www美色| 精品国产香蕉在线播出| 免费毛片基地| 国产a视频| 日韩专区一区| 欧美电影免费| 午夜激情视频在线观看| 欧美激情在线精品video| 韩国毛片免费大片| 国产国产人免费视频成69堂| 精品视频一区二区三区| 日韩中文字幕一区| 国产不卡福利| 午夜在线亚洲| 国产成人啪精品| 欧美激情一区二区三区在线播放| 精品美女| 亚州视频一区二区| 日韩一级精品视频在线观看| 日韩一级黄色片| 久久99这里只有精品国产| 日韩男人天堂| 国产极品白嫩美女在线观看看| 国产伦久视频免费观看视频| 久久福利影视| 尤物视频网站在线观看| 国产成人啪精品视频免费软件| 欧美激情一区二区三区在线| 国产国产人免费视频成69堂| 国产网站在线| 日韩中文字幕在线播放| 麻豆网站在线免费观看| 精品国产三级a∨在线观看| 国产美女在线一区二区三区| 一本高清在线| 国产激情视频在线观看| 亚洲 欧美 91| 国产伦精品一区二区三区在线观看| 韩国毛片 免费| 亚洲精品中文一区不卡| 亚洲精品中文字幕久久久久久| 欧美大片a一级毛片视频| 国产综合91天堂亚洲国产| 国产亚洲精品成人a在线| 亚洲精品影院久久久久久| 免费国产在线视频| 麻豆污视频| 香蕉视频三级| 精品视频一区二区三区| 精品国产一区二区三区免费| 免费毛片基地| 一级女人毛片人一女人| 韩国三级香港三级日本三级| 日韩在线观看视频网站| 日韩在线观看免费| 欧美另类videosbestsex高清| 精品国产亚洲人成在线| 日本免费乱理伦片在线观看2018| 日韩在线观看视频网站| 国产亚洲男人的天堂在线观看| 99热精品一区| 亚洲精品影院| 一本伊大人香蕉高清在线观看| 国产一区免费观看| 国产视频久久久久| 999久久狠狠免费精品| 国产精品1024永久免费视频| 久久精品人人做人人爽97|