国产精品爱久久久久久久小说,女人扒开腿让男人桶到爽 ,亚洲欧美国产双大乳头,国产成人精品综合久久久久,国产精品制服丝袜无码,免费无码精品黄av电影,黑色丝袜无码中中文字幕,乱熟女高潮一区二区在线

    實現(xiàn)一個Vue自定義指令懶加載

    2020-5-16    seo達人

    什么是圖片懶加載

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


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


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


    lazyLoad


    為什么要做圖片懶加載

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


    總結(jié)出來就兩個點:


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


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


    懶加載原理

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


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


    懶加載實現(xiàn)

    實現(xiàn)效果圖:


    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的嵌套關(guān)系有關(guān),應(yīng)該根據(jù)getboundingclientrect獲取

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

    IntersectionObserver

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


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


    var observer = new IntersectionObserver(callback, options);

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


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


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


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

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

    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點擊預(yù)覽

    vue自定義指令-懶加載

    Vue自定義指令

    下面的api來自官網(wǎng)自定義指令:


    鉤子函數(shù)

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

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

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

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

    unbind: 只調(diào)用一次,指令與元素解綁時調(diào)用。

    鉤子函數(shù)參數(shù)

    指令鉤子函數(shù)會被傳入以下參數(shù):


    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:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 "foo"。

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

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

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

    實現(xiàn) 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) {

    日歷

    鏈接

    個人資料

    藍藍設(shè)計的小編 http://www.dzxscac.cn

    存檔

    主站蜘蛛池模板: 性高潮久久久久久| 大香伊蕉在人线国产网站首页| 久久只有精品| v在线| 亚洲免费观看在线视频| 性色a∨人人爽网站hd| www.com国产| 牛人盗摄一区二区三区视频| 亚洲性无码av中文字幕| 人人妻人人澡人人爽欧美二区| 韩日欧美| 成人三级黄色| 久久久久夜夜夜精品国产| 国产色a∨在线看免费| 操屁股视频| 亚洲ⅴ国产v天堂a无码二区| 久久国产色av| 亚洲乱码卡一卡二卡| 国产一区二区三区久久| 久久精品日韩无码| 日韩欧群交p片内射中文| 粗大的内捧猛烈进出少妇视频| 美女网站全黄| 免费黄色91| 国语自产偷拍精品视频偷| 97久久久亚洲综合久久| 国产午夜一区二区| 欧美黑人性生活| 久久www免费人成人片| 一区二区三区午夜免费福利视频| 免费成人小视频| 小蝌蚪视频色| 黄网在线观看免费网站| 动漫啪啪高清区一区二网站 | 无遮挡无码h纯肉动漫在线观看 | 国产老熟女视频一区二区| 亚洲精品国产成人99久久6| 久久精品在线| 亚洲卡一卡二卡三| 国产高潮刺激叫喊视频| 国产精品第12页|