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

本文共 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://sxfzx.baihongyu.com/

你可能感兴趣的文章
iOS开发-邮件发送
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
lvm讲解,磁盘故障小案例
查看>>
大快网站:如何选择正确的hadoop版本
查看>>
经过这5大阶段,你离Java程序员就不远了!
查看>>
IntelliJ IDEA 连接数据库详细过程
查看>>
thymeleaf 学习笔记-基础篇
查看>>
PHP-X开发扩展
查看>>
android学习笔记——onSaveInstanceState的使用
查看>>
工作中如何做好技术积累
查看>>
怎么用sysLinux做U盘双PE+DOS??
查看>>
Spring Transactional
查看>>
shell脚本实例
查看>>
我的友情链接
查看>>
Windows Phone 7 隔离存储空间资源管理器
查看>>