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

首頁 > 編程 > JavaScript > 正文

jQuery滾動加載圖片實現原理

2019-11-20 11:01:29
字體:
來源:轉載
供稿:網友

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

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

  通俗的講就是:當訪問一個頁面的時候,先把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、知道如何獲取元素尺寸、偏移距離后,接下來一個問題就是:如何判斷某個元素進入或者即將進入可視窗口區域?下面也通過一張圖來說明問題。

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

本文已被整理到了《jquery圖片加載方法匯總》 ,歡迎大家學習閱讀。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品生活片| 亚洲国产欧美一区二区三区同亚洲| 国产精品高潮在线| 久久久人成影片一区二区三区观看| 一区二区成人精品| 欧美高清在线视频观看不卡| 国产美女91呻吟求| 91视频九色网站| 日韩高清av一区二区三区| 国产日韩一区在线| 欧美一区第一页| 国产精品国产福利国产秒拍| 最近2019中文字幕一页二页| 最新日韩中文字幕| 国产精品高潮呻吟久久av黑人| 欧美激情在线视频二区| 久久免费高清视频| 日韩一区二区精品视频| 中文字幕日韩在线播放| 91影视免费在线观看| 精品调教chinesegay| 国产午夜精品美女视频明星a级| 欧美国产激情18| 日韩电影免费在线观看| 国产精品第1页| 91网站在线看| 国内精品中文字幕| 91精品久久久久久久久久久久久| 中文字幕欧美日韩在线| 久久久久久国产三级电影| 欧美午夜影院在线视频| 欧美日韩中文字幕日韩欧美| 91九色国产在线| 欧美极品美女视频网站在线观看免费| 欧美激情乱人伦一区| 亚洲第五色综合网| 91sao在线观看国产| 97香蕉久久夜色精品国产| 精品亚洲va在线va天堂资源站| 91高清视频免费观看| 日韩中文字幕网站| 91亚洲精品一区二区| 久久精品国产亚洲一区二区| 欧美中文字幕视频在线观看| 在线电影av不卡网址| 欧美丝袜一区二区三区| 欧美日韩视频免费播放| 欧美www在线| 美女视频黄免费的亚洲男人天堂| 欧美色播在线播放| 国产一区视频在线播放| 国产一区二区三区毛片| 91精品在线国产| 久久人体大胆视频| 亚洲的天堂在线中文字幕| 亚洲欧美中文日韩v在线观看| 欧美成人精品不卡视频在线观看| 欧美日韩成人精品| 97超级碰碰人国产在线观看| 日韩欧美在线一区| 91精品国产综合久久香蕉922| 91在线免费网站| 欧美在线播放视频| 51色欧美片视频在线观看| 国产精品亚洲视频在线观看| 色av吧综合网| 91tv亚洲精品香蕉国产一区7ujn| 亚洲国产日韩精品在线| 日韩精品福利在线| 国产视频一区在线| 精品福利在线视频| 亚洲丝袜在线视频| 亚洲欧美中文在线视频| 久久久999国产精品| 中文字幕日韩免费视频| 色老头一区二区三区在线观看| 久久激情五月丁香伊人| 国产成人精品久久久| 国产精品99导航| 亚洲欧美国产va在线影院| 日韩高清电影免费观看完整| 久久久久久尹人网香蕉| 欧美日韩亚洲精品一区二区三区| 国产精品自产拍高潮在线观看| 精品中文字幕在线| 国产乱人伦真实精品视频| 欧美黄色片在线观看| 久久久综合免费视频| 高清一区二区三区日本久| xxx成人少妇69| 久久精品国产一区二区三区| 色在人av网站天堂精品| 国产v综合v亚洲欧美久久| 日韩av免费在线播放| 一区二区亚洲欧洲国产日韩| www欧美xxxx| 国产精品美女免费| 亚洲国产日韩欧美在线99| 91色中文字幕| 91精品国产综合久久久久久久久| 日韩视频亚洲视频| 欧美日韩亚洲一区二区三区| 亚洲精品720p| 亚洲自拍偷拍一区| 奇米四色中文综合久久| 亚洲人成免费电影| 日韩中文在线观看| 亚洲欧美另类人妖| 日本国产一区二区三区| 久久久女人电视剧免费播放下载| 奇米成人av国产一区二区三区| 欧美最近摘花xxxx摘花| 欧美一级免费看| 成人网址在线观看| 亚洲精品影视在线观看| 日韩中文在线观看| 日韩在线观看av| 国产欧美在线看| 精品国产一区二区在线| 久久免费视频在线| 岛国av一区二区| 日韩成人在线电影网| 久久久久国产精品一区| 国产在线观看不卡| 久久久久久免费精品| 久久精品视频播放| 欧美最猛性xxxxx(亚洲精品)| 日韩影视在线观看| 91久热免费在线视频| 91tv亚洲精品香蕉国产一区7ujn| 精品久久久久久久大神国产| 人人澡人人澡人人看欧美| 欧美激情亚洲国产| 国产精品对白刺激| 亚洲一区二区在线播放| 亚洲精品国产精品久久清纯直播| 91香蕉嫩草影院入口| 国产91精品视频在线观看| 日韩精品在线视频美女| 97在线观看免费| 日日狠狠久久偷偷四色综合免费| 亚洲欧美福利视频| 97热在线精品视频在线观看| 国产精品久久久久99| 久久综合亚洲社区| 国产成人在线一区| 欧美大片在线看免费观看| 精品久久久久久中文字幕一区奶水| 亚洲欧美一区二区三区情侣bbw| 国产一区在线播放| 97国产在线视频| 亚洲国语精品自产拍在线观看| 欧美激情在线视频二区| 97热精品视频官网| 亚洲日韩中文字幕| 国产欧美日韩高清| 欧美性在线视频| 亚洲最大成人免费视频| 人人澡人人澡人人看欧美| 亚洲人成亚洲人成在线观看| 日韩a**站在线观看| 亚洲女同精品视频| 中文字幕免费精品一区| 动漫精品一区二区|