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

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

            2020-5-16    seo達人

            什么是圖片懶加載

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


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


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


            lazyLoad


            為什么要做圖片懶加載

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


            總結出來就兩個點:


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


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


            懶加載原理

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


            所以可以從 img標簽的 src屬性入手,在沒進到可視區域的時候,就先不給 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>

            監聽 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));

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


            每次滑動都要執行一次循環,如果有1000多個圖片,性能會很差

            每次讀取 scrollTop 都會引起回流

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

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

            IntersectionObserver

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


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


            var observer = new IntersectionObserver(callback, options);

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


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


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


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

            // 當監聽的元素進入可視范圍內的會觸發回調

            if(IntersectionObserver) {

                // 創建一個 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');

                           // 當前圖片加載完之后需要去掉監聽

                            lazyImageObserver.unobserve(lazyImage);

                        }


                    })

                })

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

                   lazyImageObserver.observe(imgs[i]);

                }

            }

            源碼地址-codePen點擊預覽

            vue自定義指令-懶加載

            Vue自定義指令

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


            鉤子函數

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

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

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

            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 編譯生成的虛擬節點。

            oldVnode:上一個虛擬節點,僅在 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.dzxscac.cn

            存檔

            主站蜘蛛池模板: 无码av中文一二三区| www成人国产高清内射| 变态另类ts人妖一区二区| 韩日av网站| 久久狠狠色噜噜狠狠狠狠97| 国产老妇伦国产熟女老妇视频| 超caopor在线公开视频| 97超碰碰| 宅男噜噜噜66在线观看| 免费看男人j放进女人p的视频| 国产黑丝av| 中国精品18videosex性中国| 午夜成人无码免费看试看| 91视频播放器| 最近中文字幕完整版2019| 99久久精品精品6精品精品| 91小仙女jk白丝袜呻吟| 国产成人精品男人的天堂| 国产成 人 综合 亚洲网站| 天堂网亚洲| 绝顶丰满少妇av无码| 久久久久综合一区二区不卡| 99re5| 天堂网av一区二区三区| 亚洲精品一区二区三区四区久久| 亚洲黄色av网站| 国产成人AV性色在线影院| 国产av一码二码三码无码| 毛片网站视频| 极品人妻一区二区| 国产精品久久久久久久妇| 精品少妇3p| 又污又黄的视频| 白嫩日本少妇做爰| 成人做受视频试看120秒| 九九热国产视频| 亚洲成亚洲成网中文字幕| 三上悠亚的av片在线无码| 又黄又爽无遮挡| 男人天堂tv| 伊人久久大香线蕉无码|