1. 程式人生 > >懶加載

懶加載

滾動 efault 窗口 lba nbsp 執行 水平 懶加載 清除

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

懶加載