国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript實現圖片延遲加載方法匯總(三種方法)

2019-11-20 11:40:48
字體:
來源:轉載
供稿:網友

看到一些大型網站,頁面如果有很多圖片的時候,當你滾動到相應的行時,當前行的圖片才即時加載的,這樣子的話頁面在打開只加可視區(qū)域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁面加載的速度,對于比較長的頁面來說,這個方案是比較好的。原理是這樣:頁面可見區(qū)域以下的圖片先不加載,等到用戶向下滾動到圖片位置時,再進行加載。這樣做的好處在哪里?――當頁面有好幾屏內容時,有可能用戶只看前幾屏的內容,這樣我們就可以只加載用戶需要看的圖片,減少服務器向用戶瀏覽器發(fā)送圖片文件所產生的負荷,下面通過三種方法給大家介紹js實現圖片延時加載。

js實現圖片延遲加載方法一:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>  <head>   <title>lazyImage2.html</title>   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   <meta http-equiv="description" content="this is my page">   <meta http-equiv="content-type" content="text/html; charset=UTF-8">   <!--<link rel="stylesheet" type="text/css" href="./styles.css" mce_href="styles.css">-->  </head>  <body style="text-align:center" mce_style="text-align:center">  <p>  </p><p> </p><p> </p><p> </p><p> </p>   <div style="height:1290px;width:800px;border:1px;background:gray;"></div>   <div style="height:150px;width:800px;border:1px;background:green;"></div>   <img class="lazy" src="images/sprite.gif" mce_src="images/sprite.gif" alt="images/lazyloadImg.jpg" />   <script type="text/javascript"><!--       var temp = -1;//用來判斷是否是向下滾動(向上滾動就不需要判斷延遲加載圖片了)       window.onscroll = function() {       var imgElements = document.getElementsByTagName("img");       var lazyImgArr = new Array();       var j = 0;       for(var i=0; i<imgElements.length; i++) {        if(imgElements[i].className == "lazy"){         lazyImgArr[j++] = imgElements[i];        }       }               var scrollHeight = document.body.scrollTop;//滾動的高度       var bodyHeight = document.body.offsetHeight;//body(頁面)可見區(qū)域的總高度       if(temp < scrollHeight) {//為true表示是向下滾動,否則是向上滾動,不需要執(zhí)行動作。        for(var k=0; k<lazyImgArr.length; k++) {        var imgTop = lazyImgArr[k].offsetTop;//1305(圖片縱坐標)        if((imgTop - scrollHeight) <= bodyHeight) {         lazyImgArr[k].src = lazyImgArr[k].alt;         lazyImgArr[k].className = "notlazy"                }       }       temp = scrollHeight;      }     }; // --></script>  </body> </html>

js實現網頁圖片延時加載方法二:

再沒貼代碼之前先給大家講下js實現圖片延時加載的原理。

實現原理:

把所有需要延時加載的圖片改成如下的格式:

<img lazy_src="圖片路徑" border="0"/>

然后在頁面加載時,把所有使用了lazy_src的圖片都保存到數組里,然后在滾動時計算可視區(qū)域的top,然后把延時加載的圖片中top小于當前可視區(qū)域(即圖片出現在可視區(qū)域內)的圖片的src的值用lazy_src的來替換(加載圖片):

JS代碼:

lazyLoad = (function() {  var map_element = {};  var element_obj = [];  var download_count = 0;  var last_offset = -1;  var doc_body;  var doc_element;  var lazy_load_tag;  function initVar(tags) {    doc_body = document.body;    doc_element = document.compatMode == 'BackCompat' ? doc_body : document.documentElement;    lazy_load_tag = tags || ["img", "iframe"];  };  function initElementMap() {    var all_element = [];    //從所有相關元素中找出需要延時加載的元素     for (var i = 0,len = lazy_load_tag.length; i < len; i++) {      var el = document.getElementsByTagName(lazy_load_tag[i]);      for (var j = 0,len2 = el.length; j < len2; j++) {        if (typeof (el[j]) == "object" && el[j].getAttribute("lazy_src")) {          element_obj.push(all_element[key]);        }      }    }    for (var i = 0,len = element_obj.length; i < len; i++) {      var o_img = element_obj[i];      var t_index = getAbsoluteTop(o_img); //得到圖片相對document的距上距離       if (map_element[t_index]) {        map_element[t_index].push(i);      } else {        //按距上距離保存一個隊列         var t_array = [];        t_array[0] = i;        map_element[t_index] = t_array;        download_count++; //需要延時加載的圖片數量       }    }  };  function initDownloadListen() {    if (!download_count) return;    var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop : doc_element.scrollTop;    //可視化區(qū)域的offtset=document的高+     var visio_offset = offset + doc_element.clientHeight;    if (last_offset == visio_offset) {      setTimeout(initDownloadListen, 200);      return;    }    last_offset = visio_offset;    var visio_height = doc_element.clientHeight;    var img_show_height = visio_height + offset;    for (var key in map_element) {      if (img_show_height > key) {        var t_o = map_element[key];        var img_vl = t_o.length;        for (var l = 0; l < img_vl; l++) {          element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("lazy_src");        }        delete map_element[key];        download_count--;      }    }    setTimeout(initDownloadListen, 200);  };  function getAbsoluteTop(element) {    if (arguments.length != 1 || element == null) {      return null;    }    var offsetTop = element.offsetTop;    while (element = element.offsetParent) {      offsetTop += element.offsetTop;    }    return offsetTop;  }  function init(tags) {    initVar(tags);    initElementMap();    initDownloadListen();  };  return {    init: init  }})();

使用方法:把頁面上需要延時加載的圖片src改成為lazy_src,然后把上面的js放到body最后面,然后調用:lazyLoad.init();
調戲的方法可以使用firebug來查看一時圖片是否是延時加載。

另外:

如果你的頁面上存在有內容切換的欄目的話,可能在切換時切換的內容里的圖片可能會不顯示,處理的方法是在內容時單獨圖片加載處理,如:

///切換內容的代碼…chlid.find("img[init_src]").each(function(){   $(this).attr("src",$(this).attr("init_src"));   $(this).removeAttr("init_src");  });

原生態(tài)js實現圖片延時加載方法三:

 <!doctype html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>通過原生js延遲加載圖片</title><style type="text/css">    div{width:100px;height:100px;background:#F00;margin-bottom:30px}</style></head><body>  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/001.png  " src="a.gif" /></div>  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/002.png  " src="a.gif" /></div>  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/003.png  " src="a.gif" /></div>  <div><img data-url="http://www.pokemon.name/w/image/Sprites/PDW/004.png  " src="a.gif" /></div></body>//以上圖片測試時可用復制多點<script type="text/javascript">    (function(){        //common        function tagName(tagName){            return document.getElementsByTagName(tagName);        }        function $(id){            return document.getElementById(id);        }        function addEvent(obj,type,func){            if(obj.addEventListener){                obj.addEventListener(type,func,false);                }else if(obj.attachEvent){                obj.attachEvent('on'+type,func);            }        }        //這里可以按照需要配置些參數        var v={            eleGroup:null,            eleTop:null,            eleHeight:null,            screenHeight:null,            visibleHeight:null,            scrollHeight:null,            scrolloverHeight:null,            limitHeight:null        }        //對數據進行初始化        function init(element){            v.eleGroup=tagName(element)            screenHeight=document.documentElement.clientHeight;            scrolloverHeight=document.body.scrollTop;            for(var i=0,j=v.eleGroup.length;i<j;i++){                if(v.eleGroup[i].offsetTop<=screenHeight && v.eleGroup[i].getAttribute('data-url')){                    v.eleGroup[i].setAttribute('src',v.eleGroup[i].getAttribute('data-url'));                    v.eleGroup[i].removeAttribute('data-url')                }                }        }        function lazyLoad(){            if(document.body.scrollTop == 0){                limitHeight=document.documentElement.scrollTop+document.documentElement.clientHeight;            }else{                limitHeight=document.body.scrollTop+document.documentElement.clientHeight;            }            for(var i=0,j=v.eleGroup.length;i<j;i++){                if(v.eleGroup[i].offsetTop<=limitHeight && v.eleGroup[i].getAttribute('data-url')){                    v.eleGroup[i].src=v.eleGroup[i].getAttribute('data-url');                    v.eleGroup[i].removeAttribute('data-url')                }                }        }        init('img')        addEvent(window,'scroll',lazyLoad);    })()         </script></html>

以上內容通過三種方法介紹了js實現圖片延時加載,希望大家喜歡。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿坝| 卢氏县| 平舆县| 阿合奇县| 密云县| 高阳县| 马鞍山市| 宣武区| 五家渠市| 岑溪市| 渝北区| 盖州市| 永川市| 青州市| 临桂县| 喜德县| 英吉沙县| 万源市| 湘西| 芦山县| 额尔古纳市| 阿坝县| 友谊县| 红河县| 安泽县| 汉川市| 汉阴县| 定南县| 平罗县| 浑源县| 丰县| 龙口市| 寿光市| 如东县| 泾阳县| 武汉市| 沁源县| 阳原县| 青州市| 孟州市| 安塞县|