jquery圖片懶加載函數

圖片懶加載插件,親測好用。代碼如下。

電腦pc端

(function($, window) {

	var $window = $(window);



	$.fn.lazyload = function(options) {

		var elements = this;

		var $container;

		var settings = {

			threshold: 0,

			failure_limit: 0,

			event: "scroll",

			effect: "show",

			container: window,

			data_attribute: "original",

			skip_invisible: true,

			appear: null,

			load: null

		};



		function update() {

			var counter = 0;



			elements.each(function() {

				var $this = $(this);

				if (settings.skip_invisible && !$this.is(":visible")) {

					return;

				}

				if ($.abovethetop(this, settings) || $.leftofbegin(this, settings)) {

					/* Nothing. */

				} else if (!$.belowthefold(this, settings) && !$.rightoffold(this, settings)) {

					$this.trigger("appear");

				} else {

					if (++counter > settings.failure_limit) {

						return false;

					}

				}

			});



		}



		if (options) {

			/* Maintain BC for a couple of versions. */

			if (undefined !== options.failurelimit) {

				options.failure_limit = options.failurelimit;

				delete options.failurelimit;

			}

			if (undefined !== options.effectspeed) {

				options.effect_speed = options.effectspeed;

				delete options.effectspeed;

			}



			$.extend(settings, options);

		}



		elements = $(elements).filter("[data-" + settings.data_attribute + "]");



		/* Cache container as jQuery as object. */

		$container = (settings.container === undefined || settings.container === window) ? $window : $(settings.container);



		/* Fire one scroll event per scroll. Not one scroll event per image. */

		if (0 === settings.event.indexOf("scroll")) {

			$container.bind(settings.event, function(event) {

				return update();

			});

		}



		this.each(function() {

			var self = this;

			var $self = $(self);



			self.loaded = false;



			/* When appear is triggered load original image. */

			$self.one("appear", function() {

				if (!this.loaded) {

					if (settings.appear) {

						var elements_left = elements.length;

						settings.appear.call(self, elements_left, settings);

					}

					$("<img />").bind("load", function() {

						$self.hide().attr("src", $self.data(settings.data_attribute))[settings.effect](settings.effect_speed);

						self.loaded = true;



						/*

						 * Remove image from array so it is not looped next

						 * time.

						 */

						var temp = $.grep(elements, function(element) {

							return !element.loaded;

						});

						elements = $(temp);



						if (settings.load) {

							var elements_left = elements.length;

							settings.load.call(self, elements_left, settings);

						}

					}).attr("src", $self.data(settings.data_attribute));

				}

			});



			/* When wanted event is triggered load original image */

			/* by triggering appear. */

			if (0 !== settings.event.indexOf("scroll")) {

				$self.bind(settings.event, function(event) {

					if (!self.loaded) {

						$self.trigger("appear");

					}

				});

			}

		});



		/* Check if something appears when window is resized. */

		$window.bind("resize", function(event) {

			update();

		});



		/* Force initial check if images should appear. */

		update();



		return this;

	};



	/* Convenience methods in jQuery namespace. */

	/* Use as $.belowthefold(element, {threshold : 100, container : window}) */



	$.belowthefold = function(element, settings) {

		var fold;



		if (settings.container === undefined || settings.container === window) {

			fold = $window.height() + $window.scrollTop();

		} else {

			fold = $(settings.container).offset().top + $(settings.container).height();

		}



		return fold <= $(element).offset().top - settings.threshold;

	};



	$.rightoffold = function(element, settings) {

		var fold;



		if (settings.container === undefined || settings.container === window) {

			fold = $window.width() + $window.scrollLeft();

		} else {

			fold = $(settings.container).offset().left + $(settings.container).width();

		}



		return fold <= $(element).offset().left - settings.threshold;

	};



	$.abovethetop = function(element, settings) {

		var fold;



		if (settings.container === undefined || settings.container === window) {

			fold = $window.scrollTop();

		} else {

			fold = $(settings.container).offset().top;

		}



		return fold >= $(element).offset().top + settings.threshold + $(element).height();

	};



	$.leftofbegin = function(element, settings) {

		var fold;



		if (settings.container === undefined || settings.container === window) {

			fold = $window.scrollLeft();

		} else {

			fold = $(settings.container).offset().left;

		}



		return fold >= $(element).offset().left + settings.threshold + $(element).width();

	};



	$.inviewport = function(element, settings) {

		return !$.rightofscreen(element, settings) && !$.leftofscreen(element, settings) && !$.belowthefold(element, settings) && !$.abovethetop(element, settings);

	};



	/* Custom selectors for your convenience. */

	/* Use as $("img:below-the-fold").something() */



	$.extend($.expr[':'], {

		"below-the-fold": function(a) {

			return $.belowthefold(a, {

				threshold: 0

			});

		},

		"above-the-top": function(a) {

			return !$.belowthefold(a, {

				threshold: 0

			});

		},

		"right-of-screen": function(a) {

			return $.rightoffold(a, {

				threshold: 0

			});

		},

		"left-of-screen": function(a) {

			return !$.rightoffold(a, {

				threshold: 0

			});

		},

		"in-viewport": function(a) {

			return !$.inviewport(a, {

				threshold: 0

			});

		},

		/* Maintain BC for couple of versions. */

		"above-the-fold": function(a) {

			return !$.belowthefold(a, {

				threshold: 0

			});

		},

		"right-of-fold": function(a) {

			return $.rightoffold(a, {

				threshold: 0

			});

		},

		"left-of-fold": function(a) {

			return !$.rightoffold(a, {

				threshold: 0

			});

		}

	});



	// 圖片緩載

	$.imgloading = {

		loading: function() {

			$("img.lazy").lazyload({

				skip_invisible: false,

				effect: 'fadeIn',

				failure_limit: 20,

				threshold: 2000,

				load: function() {

					$(this).removeClass('lazy');

					if ($(this).hasClass('square')) {

						if ($(this).height() != $(this).width()) {

							$(this).height($(this).width());

						}else{

							$(this).removeClass('square');

						}

					}

				}

			});

		}

	};

})(jQuery, window);

調用示例

//圖片懶加載

function img_lazyload(){

	$("img.lazy_load").lazyload({

		effect : "fadeIn", //淡入效果

		skip_invisible : false

	})

}
img_lazyload()

手機wap端

(function($) {

    $.fn.lazyload = function(options) {
        var settings = {
            threshold       : 0,
            failure_limit   : 0,
            event           : "scroll",
            effect          : "show",
            container       : window,
            skip_invisible  : true
        };
                
        if(options) {
            /* Maintain BC for a couple of version. */
            if (null !== options.failurelimit) {
                options.failure_limit = options.failurelimit; 
                delete options.failurelimit;
            }
            
            $.extend(settings, options);
        }

        /* Fire one scroll event per scroll. Not one scroll event per image. */
        var elements = this;
        if (0 == settings.event.indexOf("scroll")) {
            $(settings.container).bind(settings.event, function(event) {
                var counter = 0;
                elements.each(function() {
                    if (settings.skip_invisible && !$(this).is(":visible")) return;
                    if ($.abovethetop(this, settings) ||
                        $.leftofbegin(this, settings)) {
                            /* Nothing. */
                    } else if (!$.belowthefold(this, settings) &&
                        !$.rightoffold(this, settings)) {
                            $(this).trigger("appear");
                    } else {
                        if (++counter > settings.failure_limit) {
                            return false;
                        }
                    }
                });

                /* Remove image from array so it is not looped next time. */
                var temp = $.grep(elements, function(element) {
                    return !element.loaded;
                });
                elements = $(temp);

            });
        }
        
        this.each(function() {
            var self = this;            
            self.loaded = false;
            
            /* When appear is triggered load original image. */
            $(self).one("appear", function() {
                if (!this.loaded) {
                    $("<img />")
                        .bind("load", function() {
                            $(self)
                                .hide()
                                .attr("src", $(self).data("original"))
                                [settings.effect](settings.effectspeed);
                            self.loaded = true;
                        })
                        .attr("src", $(self).data("original"));
                };
            });

            /* When wanted event is triggered load original image */
            /* by triggering appear.                              */
            if (0 != settings.event.indexOf("scroll")) {
                $(self).bind(settings.event, function(event) {
                    if (!self.loaded) {
                        $(self).trigger("appear");
                    }
                });
            }
        });
        
        /* Force initial check if images should appear. */
        $(settings.container).trigger(settings.event);
        
        return this;

    };

    /* Convenience methods in jQuery namespace.           */
    /* Use as  $.belowthefold(element, {threshold : 100, container : window}) */

    $.belowthefold = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).height() + $(window).scrollTop();
        } else {
            var fold = $(settings.container).offset().top + $(settings.container).height();
        }
        return fold <= $(element).offset().top - settings.threshold;
    };
    
    $.rightoffold = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).width() + $(window).scrollLeft();
        } else {
            var fold = $(settings.container).offset().left + $(settings.container).width();
        }
        return fold <= $(element).offset().left - settings.threshold;
    };
        
    $.abovethetop = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).scrollTop();
        } else {
            var fold = $(settings.container).offset().top;
        }
        return fold >= $(element).offset().top + settings.threshold  + $(element).height();
    };
    
    $.leftofbegin = function(element, settings) {
        if (settings.container === undefined || settings.container === window) {
            var fold = $(window).scrollLeft();
        } else {
            var fold = $(settings.container).offset().left;
        }
        return fold >= $(element).offset().left + settings.threshold + $(element).width();
    };
    /* Custom selectors for your convenience.   */
    /* Use as $("img:below-the-fold").something() */

    $.extend($.expr[':'], {
        "below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0, container: window}) },
        "above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0, container: window}) },
        "right-of-fold"  : function(a) { return $.rightoffold(a, {threshold : 0, container: window}) },
        "left-of-fold"   : function(a) { return !$.rightoffold(a, {threshold : 0, container: window}) }
    });
    
})(jQuery);

調用示例

//圖片懶加載

function img_lazyload(){

	$("img.lazy_load").lazyload({

		threshold : 0,

		effect : "fadeIn", //淡入效果

		skip_invisible : false

	})

}
img_lazyload()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章