亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

jQuery滾動加載圖片實現原理

2024-05-06 16:26:18
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了jQuery滾動加載圖片實現原理,通過四個方面來說明懶加載技術的原理,感興趣的小伙伴們可以參考一下
 

本文主要通過以下幾方面來說明懶加載技術的原理,個人前端小菜,有錯誤請多多指出

一、什么是圖片滾動加載?

  通俗的講就是:當訪問一個頁面的時候,先把img元素或是其他元素的背景圖片路徑替換成一張大小為1*1px圖片的路徑(這樣就只需請求一次),只有當圖片出現在瀏覽器的可視區域內時,才設置圖片正真的路徑,讓圖片顯示出來。這就是圖片懶加載。

二、為什要使用這個技術?

  比如一個頁面中有很多圖片,如淘寶、京東首頁等等,如果一上來就發送這么多請求,頁面加載就會很漫長,如果js文件都放在了文檔的底部,恰巧頁面的頭部又依賴這個js文件,那就不好辦了。更為要命的是:一上來就發送百八十個請求,服務器可能就吃不消了(又不是只有一兩個人在訪問這個頁面)。

  因此優點就很明顯了:不僅可以減輕服務器的壓力,而且可以讓加載好的頁面更快地呈現在用戶面前(用戶體驗好)。

三、怎么實現?

關鍵點如下:

      1、頁面中的img元素,如果沒有src屬性,瀏覽器就不會發出請求去下載圖片(也就沒有請求咯,也就提高性能咯),一旦通過javascript設置了圖片路徑,瀏覽器才會送請求。有點按需分配的意思,你不想看,就不給你看,你想看了就給你看~

  2、如何獲取正真的路徑,這個簡單,現在正真的路徑存在元素的“data-url”(這個名字起個自己認識好記的就行)屬性里,要用的時候就取出來,再設置;

  3、開始比較之前,先了解一些基本的知識,比如說如何獲取某個元素的尺寸大小、滾動條滾動距離及偏移位置距離; 

1)屏幕可視窗口大?。?/strong>對應于圖中1、2位置處

    原生方法:window.innerHeight 標準瀏覽器及IE9+ || document.documentElement.clientHeight 標準瀏覽器及低版本IE標準模式 || document.body.clientHeight 低版本混雜模式

       jQuery方法: $(window).height()

2)瀏覽器窗口頂部與文檔頂部之間的距離,也就是滾動條滾動的距離:也就是圖中3、4處對應的位置;

    原生方法:window.pagYoffset——IE9+及標準瀏覽器 || document.documentElement.scrollTop 兼容ie低版本的標準模式 || document.body.scrollTop 兼容混雜模式;

        jQuery方法:$(document).scrollTop();

3)獲取元素的尺寸:對應于圖中5、6位置處;左邊jquery方法,右邊原生方法

    $(o).width() = o.style.width;

    $(o).innerWidth() = o.style.width+o.style.padding;

    $(o).outerWidth() = o.offsetWidth = o.style.width+o.style.padding+o.style.border;

    $(o).outerWidth(true) = o.style.width+o.style.padding+o.style.border+o.style.margin;

注意:要使用原生的style.xxx方法獲取屬性,這個元素必須已經有內嵌的樣式,如<div style="...."></div>;

如果原先是通過外部或內部樣式表定義css樣式,必須使用o.currentStyle[xxx] ||document.defaultView.getComputedStyle(0)[xxx]來獲取樣式值

4)獲取元素的位置信息:對應與圖中7、8位置處

    1)返回元素相對于文檔document頂部、左邊的距離;

    jQuery:$(o).offset().top元素距離文檔頂的距離,$(o).offset().left元素距離文檔左邊緣的距離

    原生:getoffsetTop(),高程上有具體說明,這邊就忽略了;

      順便提一下返回元素相對于第一個以定位的父元素的偏移距離,注意與上面偏移距的區別;

        jQuery:position()返回一個對象,$(o).position().left = style.left,$(o).position().top = style.top;

  4、知道如何獲取元素尺寸、偏移距離后,接下來一個問題就是:如何判斷某個元素進入或者即將進入可視窗口區域?下面也通過一張圖來說明問題。

jQuery滾動加載圖片實現原理

    1)外面最大的框為實際頁面的大小,中間淺藍色的框代表父元素的大小,對象1~8代表元素位于頁面上的實際位置;以水平方向來做如下說明!

    2)對象8左邊界相對于頁面左邊界的偏移距離(offsetLeft)大于父元素右邊界相對于頁面左邊界的距離,此時可判讀元素位于父元素之外;

    3)對象7左邊界跨過了父元素右邊界,此時:對象7左邊界相對于頁面左邊界的偏移距離(offsetLeft)小于 父元素右邊界相對于頁面左邊界的距離,因此對象7就進入了父元素可視區;

    4)在對象6的位置處,對象5的右邊界與頁面左邊界的距離 大于 父元素左邊界與頁面左邊界的距離;

    5)在對象5位置處時,對象5的右邊界與頁面左邊界的距離 小于 父元素左邊界與頁面左邊界的距離;此時,可判斷元素處于父元素可視區外;

    6)因此水平方向必須買足兩個條件,才能說明元素位于父元素的可視區內;同理垂直方向也必須滿足兩個條件;具體見下文的源碼;

四、擴展為jquery插件
使用方法:$("selector").scrollLoad({ 參數在代碼中有說明 })

(function($) { $.fn.scrollLoading = function(options) {  var defaults = {   // 在html標簽中存放的屬性名稱;   attr: "data-url",   // 父元素默認為window   container: window,   callback: $.noop  };  // 不管有沒有傳入參數,先合并再說;  var params = $.extend({}, defaults, options || {});  // 把父元素轉為jquery對象;  var container = $(params.container);  // 新建一個數組,然后調用each方法,用于存儲每個dom對象相關的數據;  params.cache = [];  $(this).each(function() {   // 取出jquery對象中每個dom對象的節點類型,取出每個dom對象上設置的圖片路徑   var node = this.nodeName.toLowerCase(), url = $(this).attr(params["attr"]);   //重組,把每個dom對象上的屬性存為一個對象;   var data = {    obj: $(this),    tag: node,    url: url   };   // 把這個對象加到一個數組中;   params.cache.push(data);  });  var callback = function(call) {   if ($.isFunction(params.callback)) {    params.callback.call(call);   }  };    //每次觸發滾動事件時,對每個dom元素與container元素進行位置判斷,如果滿足條件,就把路徑賦予這個dom元素!  var loading = function() {   // 獲取父元素的高度   var contHeight = container.outerHeight();   var contWidth = container.outerWidth();   // 獲取父元素相對于文檔頁頂部的距離,這邊要注意了,分為以下兩種情況;   if (container.get(0) === window) {    // 第一種情況父元素為window,獲取瀏覽器滾動條已滾動的距離;$(window)沒有offset()方法;    var contop = $(window).scrollTop();    var conleft = $(window).scrollLeft();   } else {    // 第二種情況父元素為非window元素,獲取它的滾動條滾動的距離;    var contop = container.offset().top;    var conleft = container.offset().left;   }   $.each(params.cache, function(i, data) {    var o = data.obj, tag = data.tag, url = data.url, post, posb, posl, posr;    if (o) {     //對象頂部與文檔頂部之間的距離,如果它小于父元素底部與文檔頂部的距離,則說明垂直方向上已經進入可視區域了;     post = o.offset().top - (contop + contHeight);     //對象底部與文檔頂部之間的距離,如果它大于父元素頂部與文檔頂部的距離,則說明垂直方向上已經進入可視區域了;     posb = o.offset().top + o.height() - contop;     // 水平方向上同理;     posl = o.offset().left - (conleft + contWidth);     posr = o.offset().left + o.width() - conleft;     // 只有當這個對象是可視的,并且這四個條件都滿足時,才能給這個對象賦予圖片路徑;     if ( o.is(':visible') && (post < 0 && posb > 0) && (posl < 0 && posr > 0) ) {      if (url) {       //在瀏覽器窗口內       if (tag === "img") {        //設置圖片src        callback(o.attr("src", url));       } else {        // 設置除img之外元素的背景url        callback(o.css("background-image", "url("+ url +")"));       }      } else {       // 無地址,直接觸發回調       callback(o);      }      // 給對象設置完圖片路徑之后,把params.cache中的對象給清除掉;對象再進入可視區,就不再進行重復設置了;      data.obj = null;     }    }   });  };  //加載完畢即執行  loading();  //滾動執行  container.bind("scroll", loading); };})(jQuery);

 

以上就是滾動加載圖片實現原理的詳細內容介紹,希望對大家的學習有所幫助。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线视频国产日韩| 庆余年2免费日韩剧观看大牛| 国产欧美日韩精品专区| 狠狠躁天天躁日日躁欧美| 国产999精品久久久影片官网| 亚洲自拍偷拍色片视频| 亚洲成色777777女色窝| 亚洲欧美国产精品专区久久| 亚洲美女精品成人在线视频| 日韩欧美一区视频| 91成人天堂久久成人| 欧美激情视频一区二区| 91精品国产综合久久香蕉| 国产香蕉一区二区三区在线视频| 国产精品亚洲片夜色在线| 亚洲中国色老太| 日韩成人网免费视频| 55夜色66夜色国产精品视频| 青草成人免费视频| 国产精品视频网址| 国产精品视频久久久久| 国产精品成人免费视频| 亚洲国产精品va在线观看黑人| 亚洲另类欧美自拍| 国产精品久久国产精品99gif| 疯狂欧美牲乱大交777| 7m精品福利视频导航| 超碰日本道色综合久久综合| 国产精品 欧美在线| 91av视频导航| 美女久久久久久久久久久| 在线看日韩av| 国产成人精品在线观看| 91久久久久久久久久久久久| 日本成熟性欧美| 精品动漫一区二区| 日韩电影在线观看免费| 国产日韩欧美夫妻视频在线观看| 国产一区在线播放| 成人黄色激情网| 日韩中文字幕在线观看| 久久久国产一区二区三区| 精品国产精品三级精品av网址| 欧美大全免费观看电视剧大泉洋| 日韩视频精品在线| 亚洲色图综合网| 国产ts一区二区| 欧美极品美女视频网站在线观看免费| 久久色在线播放| 国产小视频91| 国产成人aa精品一区在线播放| 国产成人综合av| 精品人伦一区二区三区蜜桃网站| 欧美日韩亚洲系列| 8050国产精品久久久久久| 91精品中文在线| 国产区精品在线观看| 亚洲免费小视频| 国产999精品| 国内精品久久久久影院 日本资源| 国产午夜精品全部视频播放| 日韩av在线免费| 久久精品国产欧美亚洲人人爽| 久久免费视频网| 国产精品色午夜在线观看| 国产成人精品视频在线| 欧美精品制服第一页| 日韩中文有码在线视频| 国产成人鲁鲁免费视频a| 精品久久久一区| 欧美激情在线观看| 欧美伊久线香蕉线新在线| 不卡在线观看电视剧完整版| 九九久久久久久久久激情| 国产精品夜间视频香蕉| 国产激情久久久| 海角国产乱辈乱精品视频| 国产午夜精品一区理论片飘花| 日韩中文字幕在线免费观看| 在线精品视频视频中文字幕| 91爱爱小视频k| 国产精品女人网站| 久久久av亚洲男天堂| www.欧美精品一二三区| 日韩精品中文字| 2018日韩中文字幕| 亚洲国产精彩中文乱码av| 亚洲夜晚福利在线观看| 久久夜色精品国产| 亚洲天堂视频在线观看| 久久精品国产99国产精品澳门| 国产精品露脸av在线| 69av视频在线播放| 国产亚洲精品久久久久久牛牛| 亚洲男人天堂古典| 欧美久久精品午夜青青大伊人| 欧美日韩亚洲天堂| 日韩av电影在线免费播放| 亚洲va久久久噜噜噜| 久久99精品久久久久久噜噜| 日韩av色综合| 久久久久久久久久久免费精品| 日韩av中文字幕在线免费观看| 欧美在线视频观看免费网站| 亚洲精品久久久久久下一站| 日韩欧美国产成人| 在线播放日韩专区| 91在线免费看网站| 亚洲美女精品久久| 国产一区二区三区中文| 日韩电影大片中文字幕| xxx成人少妇69| 欧美猛交ⅹxxx乱大交视频| 国产成人小视频在线观看| 亚洲福利在线观看| 亚洲精品国精品久久99热| 日韩电影免费在线观看| 欧美电影在线观看网站| 亚洲美女www午夜| 成人免费黄色网| 久99九色视频在线观看| 亚洲第一综合天堂另类专| 26uuu另类亚洲欧美日本老年| 久久精品欧美视频| 亲爱的老师9免费观看全集电视剧| 日韩精品视频在线播放| 日韩精品高清视频| 欧美性猛交xxxx免费看漫画| 国产精品9999| 久久久亚洲国产天美传媒修理工| 亚洲电影免费观看| 国产女精品视频网站免费| 久久精品国产69国产精品亚洲| 欧美精品性视频| 欧美黑人xxxⅹ高潮交| 国产日韩欧美一二三区| 久久91精品国产91久久久| 最近2019好看的中文字幕免费| 欧美另类交人妖| 伊人伊成久久人综合网站| 精品国产欧美成人夜夜嗨| 国产成人一区二区在线| 亚洲国产精品国自产拍av秋霞| 26uuu另类亚洲欧美日本一| 色综合久久久久久中文网| 色一区av在线| 国产成人精品国内自产拍免费看| 欧美精品精品精品精品免费| 中文字幕亚洲国产| 视频在线一区二区| 激情成人中文字幕| 国产精自产拍久久久久久| 亚洲深夜福利视频| 国产精品v片在线观看不卡| 欧美日韩在线视频首页| 琪琪第一精品导航| 69国产精品成人在线播放| 国产99久久精品一区二区| 日韩一区av在线| 欧美激情免费观看| 欧美性猛交xxxx免费看漫画| 久久久久久久影视| 国产成人精品久久二区二区| 精品国模在线视频|