js图片懒加载

<script type="text/javascript">
var lazyLoad = {
    // 获取元素到页面顶部的距离
    getoffsetTop: function(elem){
        var offTop = 0;
        while(elem != null){
            offTop += elem.offsetTop;   // 获取元素到其上一级元素顶部的距离
            elem = elem.offsetParent;   // 元素的上一级元素
        }
        return offTop;
    },
    // 判断是否加载图片
    isLoad: function(elem){
        //可视窗口的高度
        var cHeight = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight, //可视窗口的高度
            sX = window.pageXOffset || document.body.scrollTop || document.documentElement.scrollTop, //浏览器可视窗口距离页面顶部的距离
            threshold = -110, //表示图片在什么时候进行加载,默认为 0 表示当图片进入可视区域立即加载;设为正数表示图片距离 threshold像素进入可视区域进行加载;设为负数表示图片进入可视区域threshold像素时进行加载。
            oTop = this.getoffsetTop(elem), //元素到页面顶部的距离
            viewHeight = oTop - sX - threshold; //元素到浏览器窗口顶部的距离

        //图片进入浏览器可视区域,加载图片
        if(cHeight >= viewHeight){
            return true;
        }else{
            return false;
        }
    },
    //加载图片。isFadein:true时,图片使用淡入动画效果加载
    loadImg: function(elems, isFadein){
        for(var i = 0, len = elems.length; i < len; i++){
            if (this.isLoad(elems[i])) {
                //已经加载过的图片,下次判断那些图片该加载时,直接跳过
                if (elems[i].className !== "loaded") {
                    //针对使用data-自定义的属性,要使用getAttribute()获取值
                    elems[i].src = elems[i].getAttribute("data-src");
                    elems[i].className = "loaded";
                    if(isFadein){
                        this.fadeIn(elems[i]);   //淡入效果显示图片,有点闪烁??
                    }
                }
            }else {
                return; //下一个图片没有进入加载区域,就不在循环
            }
        }
    },

    //使用淡入动画效果加载图片
    fadeIn: function(elem) {
        var n = 0,
            isnotIE = window.XMLHttpRequest ? true : false;
        if (isnotIE) {
            elem.style.opacity = 0;
        } else {
            elem.style.filter = "alpha(opacity=0)";
        }
        var t = setInterval(function() {
            if (n < 100) {
                n += 5;
                if (isnotIE) {
                    elem.style.opacity = n / 100;
                } else {
                    elem.style.filter = "alpha(opacity=" + n + ")";
                }
            } else {
                clearInterval(t);

            }
        }, 1000/60);
    }
}

window.onscroll = function() { //滚动时根据需要加载图片,加载图片的动画效果为淡入,设置第二个参数为true
    lazyLoad.loadImg(document.getElementsByTagName("img"), true);
};
window.onload = function() { //页面加载后,可视区域的图片显示为实际图片
    lazyLoad.loadImg(document.getElementsByTagName("img"), true);
};
// console.log(lazyLog.getoffsetTop($(".data_list a")[0]));
</script>
<script>
// $(window).scroll(function() {//窗口滚动的时候(鼠标滚轮的时候。。)
//   $(‘img‘).each(function() {//把以下的方法作用到每一个img标签,可自行加限定条件
//     var $imgSrc = $(this).attr(‘data-src‘);//获取每张图片对应地址
//     var $imgTop = $(this).offset().top;//获取每张图片对应距离document顶部的高度
//     var scrollT = $(window).scrollTop();//获取滚轮滚动的距离
//     var halfDoc = $(window).height();//获取浏览器窗口可视高度
//     var ifElse = (scrollT+halfDoc)>=$imgTop;//如果滚动距离加上窗口可视高度大于该图片距离document顶部的高度
//     var _this=this;//保存this的作用域以便于在其它作用域上使用这个作用域
//     if(ifElse){//如果条件成立
//       setTimeout(function(){$(_this).attr(‘src‘,$imgSrc);},10);//把图片的src地址改成data-src的值(前面已经获取了)
//     }
//   })//end object ‘img‘
// })//end object window
</script>

<script>
/**
 * @author beidan
 * @description 图片懒加载
 */
;(function () {
    /*
     * 函数功能:函数节流
     * fn  需要调用的函数
     * delay  函数需要延迟处理的时间
     * mustRunDelay  超过该时间,函数一定会执行
     * */
    var throttle = function (fn, delay, mustRunDelay) {
        var timer;  //使用闭包存储timer
        var t_start;
        //闭包返回的函数
        return function (val) {
            var args = arguments, t_curr = +new Date();  //使用+new Date() 将字符串转换成数字
            clearTimeout(timer);
            if (!t_start) {  // 使用!t_start 如果t_start=undefined或者null 则为true
                t_start = t_curr;
            }
            if (t_curr - t_start >= mustRunDelay) {
                fn.apply(null, args);
                t_start = t_curr;
            } else {
                timer = setTimeout(function () {
                    fn.apply(null, args);
                }, delay);
            }
        }
    };

    function LazyLoad() {
    }

    var download_count = 0,
        ele_obj = [];

    LazyLoad.prototype = {
        //放一些初始化的方法
        init: function () {
            this.initElementMap();
            this.lazy();
            this.throttleLoad();
        },
        getPosition: {
            /*
             获取屏幕可视窗口大小
             document.documentElement.clientHeight    IE/CH支持
             document.body.client    低版本混杂模式
             获取当前元素相对于窗口顶部的距离
             element.offsetTop
             滚动条滚动的距离
             document.documentElement.scrollTop   兼容ie低版本的标准模式
             document.body.scrollTop 兼容混杂模式;
             */
            Viewport: function () {
                if (document.compatMode == "BackCompat") {
                    //此时浏览器客户区宽度是document.body.clientWidth;
                    var Height = document.body.clientHeight;
                } else {
                    //浏览器客户区宽度是document.documentElement.clientWidth。
                    var Height = document.documentElement.clientHeight;
                }
                return Height;
            },
            ScrollTop: function () {
                if (document.compatMode == "BackCompat") {
                    var elementScrollTop = document.body.scrollTop;

                } else {
                    var elementScrollTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;

                }
                return elementScrollTop;
            },
            ElementViewTop: function (ele) {
                if (ele) {
                    var actualTop = ele.offsetTop;
                    var current = ele.offsetParent;
                    while (current !== null) {
                        actualTop += current.offsetTop;
                        current = current.offsetParent;
                    }
                    return actualTop - this.ScrollTop();
                }
            }
        },
        //从所有相关元素中找出有lazy_src属性的元素
        initElementMap: function () {
            var el = document.getElementsByTagName(‘img‘);
            for (var j = 0, len2 = el.length; j < len2; j++) {
                //查找有lazy_src标签的img
                if (typeof (el[j].getAttribute("lazy_src"))) {
                    ele_obj.push(el[j]);
                    download_count++;
                }
            }
        },
        //防止多次加载
        lazy: function () {
            if (!download_count) return;
            var innerHeight = LazyLoad.prototype.getPosition.Viewport();
            for (var i = 0, len = ele_obj.length; i < len; i++) {
                var t_index = LazyLoad.prototype.getPosition.ElementViewTop(ele_obj[i]); //得到图片相对document的距上距离
                if (t_index < innerHeight) {
                    ele_obj[i].src = ele_obj[i].getAttribute("lazy-src");
                    ele_obj[i].removeAttribute("lazy-src");
                    delete ele_obj[i];
                    download_count--;
                }
            }
        },
        /*使用函数节流优化性能*/
        throttleLoad: function () {
            var throttle1 = throttle(LazyLoad.prototype.lazy, 200, 500);
            window.onscroll = window.onload = function () {
                throttle1();
            }
        },
    };
    window.LazyLoad = LazyLoad;
})    

</script>
时间: 2024-10-25 14:15:13

js图片懒加载的相关文章

js 图片懒加载

图片懒加载(图片出现在可视区域再加载) 兼容性:兼容目前流行的全部浏览器,包括:兼容到IE6) 使用方法: 引入相应的js文件<script src="js/lazy.js"></script> 初始化 Lazy.init(1000); 可以传入延时时间.默认是500ms 注意: <img src="img/load.gif" data-lazy="img/2.jpg"> src 属性放预加载的图片,data-

jquery 图片懒加载

jquery 图片懒加载 CreationTime--2018年7月1日14点45分 Author:Marydon 1.源码展示 (function(a){a.fn.lazyload=function(b){var c={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:window,skip_invisible:!0};b&&(null!==b.failurelim

图片懒加载--lazyload.js的用法

这几天公司的项目已经完成的差不多了,只剩下各种优化问题.今天着重于图片加载的优化.当一个页面需要下拉很长而且又有过多的图片要加载时,就会发生很多http请求,就会拉慢网页加载速度,用户体验不友好.怎么解决这个问题呢?jQuery插件库中有个插件lazyload.js可以实现图片懒加载. lazyload.js的原理就是将真正要加载的图片的地址放在另一个属性中,而图片的src的地址则是一个1px *1px的占位图,这样在网页加载过程中,首先下载的是这个占位图,当网页加载完成后,下拉页面时再下载在可

图片懒加载 lazyload.js使用方法

lazyload是一个用Javascript编写的jQuery插件,它可以延迟加载长页面中的图片,在浏览器可视区域外的图片将不会被载入,直到用户将它们滚动到它们所在的位置. 跟bootstrap一样,lazyload.js也是依赖于jQuery <script src="resources/js/jquery-1.8.3.min.js"></script> <script src="resources/js/jquery.lazyload.min

图片懒加载库echo.js源码学习

最近不是在学习设计模式吗,然后就看到了代理模式加载图片的样例,然后自己实现了一下,就发现,自己写的这货每次就只能加载一张图片,而且图片要放在哪也是个很严重的问题 然后就去了 gayhub 找了找了找流行的图片懒加载库,这一找,就找到了一个echo.j是,打开一看,源码只有100多行吧,震惊..,看完源码,哎,木有上代理模式呀 仔细学习了下源码:觉得这种做法比较适合图片位置确定场景的吧,比如文章啊,一篇文章老长了,里面有蛮多图片散落在不同的地方,这样就比较合适,有可能有很多图片读者都不会翻到哪里,

js可视区域图片懒加载

可视区域图片懒加载 实现原理,页面滚动时获取需要懒加载的图片,判断此图片是否在可视区域内,是则设置图片data-src地址为src地址,加载图片. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jquery可视区域图片懒加载</title> <script src="http://libs.baidu.com/jquery/2

页面性能优化-原生JS实现图片懒加载

在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再加载更多的图片.这种加载图片的方式叫做图片懒加载,又叫做按需加载或图片的延时加载.这样做的好处是:1.可以加快页面首屏渲染的速度:2.节约用户的流量. 一.实现思路 1.图片img标签自定义一个属性data-src来存放真实的地址. 2.当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果

Js 之图片懒加载插件

一.PC端(lazyload) 1.引入js文件 <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.min.js"></scrip

原生JS实现图片懒加载之一:Element.getBoundingClientRect()

实际项目开放中,特别是电商项目,由于有大量的图片加载必然会影响性能,所以实现图片的懒加载是非常有必要的. 实现图片懒加载的知识点 标签的data-属性 可视区域的监听 实现图片懒加载的原理 <img alt="loading..." data-src="images/1.jpg"> 当我们监听到图片进入可视区域后,就将data-src到值赋值给src属性 <script> var images = document.querySelector