博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片懒加载通俗易懂
阅读量:6861 次
发布时间:2019-06-26

本文共 4216 字,大约阅读时间需要 14 分钟。

懒加载的意义

这里‘懒’的意思可以理解为延迟,如淘宝、京东这些电商平台有大量的图片,如果上来就加载服务器表示压力山大,所以就想出了懒加载这种克敌之法,用户滚动到的区域才发送请求加载内容

原理

将页面中的img标签src指向一张小照片或者为空都可以,然后写一个自定义属性比如(data-src)指向正确的图片,其实就是用正确的照片替换src里面的照片

代码

在写代码前,需要了解各种高度。先看这篇文章

    
Document

javascript

var num = document.getElementsByTagName('img').length;    var img = document.getElementsByTagName("img");    var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历    lazyload(); //页面载入完毕加载可是区域内的图片    window.onscroll = lazyload;    function lazyload() { //监听页面滚动事件        var seeHeight = document.documentElement.clientHeight; //可见区域高度        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度        for (var i = n; i < num; i++) {            if (img[i].offsetTop < seeHeight + scrollTop) {                if (img[i].getAttribute("src") == "") {                    img[i].src = img[i].getAttribute("data-src");                }                n = i + 1;            }        }    }

使用节流函数进行性能优化

如果直接将函数绑定在scroll事件上,当页面滚动时,函数会被高频触发,这非常影响浏览器的性能。

我想实现限制触发频率,来优化性能。

节流函数:只允许一个函数在N秒内执行一次。下面是一个通俗易通的节流函数:

var num = document.getElementsByTagName('img').length;    var img = document.getElementsByTagName("img");    var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历    resizehandler(); //页面载入完毕加载可是区域内的图片    n=0;    function resizehandler(){        var seeHeight = document.documentElement.clientHeight; //可见区域高度        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度        for (var i = n; i < num; i++) {            if (img[i].offsetTop < seeHeight + scrollTop) {                if (img[i].getAttribute("src") == "") {                    img[i].src = img[i].getAttribute("data-src");                }                n = i + 1;            }        }    }    function throttle(method,context){        clearTimeout(method.tId);        method.tId=setTimeout(function(){            method.call(context);        },500);    }    window.onscroll=function(){        throttle(resizehandler,window);    }

函数节流方案以下三种

时间戳方案

var num = document.getElementsByTagName('img').length;    var img = document.getElementsByTagName("img");    var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历    lazyload(); //页面载入完毕加载可是区域内的图片    function lazyload() { //监听页面滚动事件        var seeHeight = document.documentElement.clientHeight; //可见区域高度        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度        for (var i = n; i < num; i++) {            if (img[i].offsetTop < seeHeight + scrollTop) {                if (img[i].getAttribute("src") == "") {                    img[i].src = img[i].getAttribute("data-src");                }                n = i + 1;            }        }    }---------------------------------  以上代码不在重复  --------------------------------    var throttle = function(fun,delay){        var perv = Date.now();        return function(){            var context = this;            var now = Date.now();            if (now-perv >= delay){                fun.apply(context,arguments)                prev = Date.now();            }        }    }    window.addEventListener('scroll',throttle(lazyload,1000))

定时器方案

var throttle = function(fun,delay){        var timer = null;        return function(){            var context = this;            if(!timer){                timer = setTimeout(function(){                    fun.apply(context,arguments)                    timer = null                },delay)            }        }    }    window.addEventListener('scroll',throttle(lazyload,1000))

时间戳+定时器方案

var throttle = function(fun,delay){        var timer = null;        var startTime = Date.now();        return function() {                var curTime = Date.now();                var remaining = delay - (curTime - startTime);                var context = this;                var args = arguments;                clearTimeout(timer);                if (remaining <= 0) {                        fun.apply(context, args);                        startTime = Date.now();                } else {                        timer = setTimeout(fun, remaining);                }        }    }    window.addEventListener('scroll',throttle(lazyload,1000))

转载地址:http://vchyl.baihongyu.com/

你可能感兴趣的文章
this指向
查看>>
lodash源码分析之获取数据类型
查看>>
13篇文章,教你学会ES6知识点
查看>>
[OpenGL]未来视觉1-Android摄像头采集基础
查看>>
Android多媒体之GLES2战记第四集--移形换影
查看>>
全面屏适配
查看>>
2019新展望| 掘金年度征文
查看>>
应用开发也去中心化?基于BCH的筹款平台Akari-Pages与Lighthouse正面交锋
查看>>
【初识】-JUC·Executor框架
查看>>
Android.Hook框架xposed篇(Http流量监控)
查看>>
2018年4月份,阿里最新的java程序员面试题目
查看>>
关于react中setState的深入理解
查看>>
【云计算的1024种玩法】巧用迁云工具轻松实现服务器迁移到ECS
查看>>
Objective-C 内存管理之ARC规则
查看>>
Android Studio中架包打包和依赖冲突解决
查看>>
如何通过Gradle上传Android库到JCenter
查看>>
android仿最新版本微信相册--附源码
查看>>
用Kotlin写Android Gradle脚本
查看>>
【读】这一次,让我们再深入一点 - UDP协议
查看>>
Vue的自定义滚动,我用el-scrollbar
查看>>