美文网首页
自定义图片懒加载组件

自定义图片懒加载组件

作者: 太上云初 | 来源:发表于2019-04-18 17:35 被阅读0次

//自定义图片懒加载组件 start


var lazyLoad = {

    lazyLoadCache: [],//储存已经加载过的图片

    layLoadList: [],//储存没有加载过的图片

    throttleDuration: 500,//节流定时器延时

    clientHeight: window.innerHeight || document.documentElement.clientHeight,

    install: function(){

        lazyLoad.create();

    }, 

    create: function(){

        var self = this;

        this.initScrollEvent();

        Vue.directive('lazyload', {

            inserted: function(el, bind){

                self.init(el, bind);

            },

            updated: function(el, bind){

                self.init(el, bind);

            }

        })

    },

    init: function(el, bind){

        var imgUrl = bind.value;

        el.targeUrl = imgUrl;

        lazyLoad.layLoadList.push(el);

        var mark = !lazyLoad.isLoaded(el);//判断是否可以加载

        showMark = mark && lazyLoad.isCanShow(el);

        showMark && lazyLoad.showImg(el, imgUrl);

    },

    initScrollEvent: function(el){

        var self = this,

            timer = 0,

            duration = this.throttleDuration,

            toShowImgFun = this.toShowImg,

            documentElement = document.documentElement,

            startTop = documentElement.scrollTop;

        window.addEventListener('scroll', handleScrolEl())

        function handleScrolEl(){//判断是向上滚动还是向下滚动

            //使用函数节流

            var nowTime = Date.now();

            return function(){

                var currentTime = Date.now(),

                    currentTop = documentElement.scrollTop || document.body.scrollTop;

                if(currentTop - startTop <= 0){//向上滚动不处理

                    return;

                }

                var remaining = currentTime - nowTime;

                if(  duration <= remaining){//如果间隔时间大于延时,执行函数

                    clearTimeout(timer);

                    nowTime =  Date.now();

                    toShowImgFun.call(self);

                    startTop = documentElement.scrollTop;

                }else {

                    timer = setTimeout(toShowImgFun.call(self), duration);

                }

            }

        }

    },

    toShowImg: function(){

        var self = this,

            layLoadList = this.layLoadList;

        if(layLoadList.length <= 0){//预加载图片加载完毕

            return;

        }

        layLoadList.map(function(item){

            !self.isLoaded(item) && self.isCanShow(item) && self.showImg(item, item.targeUrl);

        })

    },

    //判断是否能够显示

    isCanShow: function(el){

        var top = el.getBoundingClientRect().top,

            windowHeight = this.clientHeight;

        return top + el.height / 2 < windowHeight;

    },

    //判断是否已经加载过了

    isLoaded: function(img){

        var lazyLoadCache = this.lazyLoadCache;

        return lazyLoadCache.indexOf(img) > -1;

    },

    //展示图片

    showImg: function(el, imgSrc){

        var self = this;

        var image = new Image();

        image.src = imgSrc;

        image.onload = function(){

            el.src = imgSrc;

            self.lazyLoadCache.push(imgSrc);

            self.spliceImg(imgSrc);

        }

    },

    //从未展示的数组中剔除已经展示的图片

    spliceImg: function(imgSrc){

        var newList = [];

        newList = this.layLoadList.filter(function(item, index){

            return item.src != imgSrc;

        })

        this.layLoadList = newList;

    }

}

//自定义图片懒加载组件 end

相关文章

  • 自定义图片懒加载组件

    //自定义图片懒加载组件 start

  • 浅谈 vue项目优化

    1.路由懒加载 使用vue-router的方法 2.图片懒加载 组件缓存 使用vue的,详...

  • IOS -- cell解决重用机制

    类似微博自定义cell添加图片,通常会导致图片重用 解决方法:手动懒加载图片控件,然后在加载图片之前先清除图片控件...

  • 图片懒加载

    图片懒加载 思路:起始的时候,不让图片进行加载,那么img的src属性设置为空,src = ' ',在自定义一个属...

  • 笔记 - 图片的加载 & 懒加载

    实现图片的加载 图片的懒加载 实现方案:在img标签内自定义一个属性data-src,用于暂存图片地址获取屏幕可视...

  • 项目优化

    图片懒加载,数据懒加载, 路由懒加载 1.图片懒加载原理 1.1 开始时 不设置src属性 1.2 图片在可视区域...

  • vue中组件懒加载

    vue中组件懒加载的方法 1.异步实现路由懒加载 2.import(推荐使用这种方式) 同理,路由懒加载和组件懒加...

  • vue 常用的优化方法

    路由懒加载, 图片懒加载 第三方插件按需引入 用keep-alive 给组件做缓存 长列表 使用虚拟滚动 v-f...

  • vue项目性能优化

    对js,css开启gzip压缩,图片是没效果所以不需要 对路由组件进行懒加载,如果使用同步的方式加载组件,在首屏加...

  • ionic3懒加载自定义组件中使用ionic3组件报错is no

    之前在使用ionic3的ionicPage(懒加载)方式开发App时,自定义组件,并且在组件中使用ionic3的组...

网友评论

      本文标题:自定义图片懒加载组件

      本文链接:https://www.haomeiwen.com/subject/zugtgqtx.html