资讯专栏INFORMATION COLUMN

图片懒加载通俗易懂

NervosNetwork / 670人阅读

摘要:懒加载的意义这里懒的意思可以理解为延迟,如淘宝京东这些电商平台有大量的图片,如果上来就加载服务器表示压力山大,所以就想出了懒加载这种克敌之法,用户滚动到的区域才发送请求加载内容原理将页面中的标签指向一张小照片或者为空都可以,然后写一个自定义

懒加载的意义

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

原理

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

代码

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

    
    
    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))

参考资料

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101703.html

相关文章

  • lozad.js:加载神器

    摘要:是基于的轻量级高性能可配置的纯并且无依赖的懒加载器,其能够被用于进行图片等多种形式的元素。在上,至今短短的一个月的时间,已经收获了的。传送门阮一峰老师使用教程懒加载懒加载其实就是延迟加载。 showImg(https://github.com/ApoorvSaxena/lozad.js/raw/master/banner/lozad-banner.jpg); Lozad.js 是基于 ...

    Magicer 评论0 收藏0
  • 前端基础入门

    摘要:手把手教你做个人火的时候,随便一个都能赚的盆满钵满,但是,个人没有服务端,没有美工,似乎就不能开发了,真的是这样的吗秘密花园经典的中文手册。涵盖前端知识体系知识结构图书推荐以及入门视频教程,全的简直不要不要的了。 JavaScript 实现点击按钮复制指定区域文本 html5 的 webAPI 接口可以很轻松的使用短短的几行代码就实现点击按钮复制区域文本的功能,不需要依赖 flash。...

    shinezejian 评论0 收藏0
  • 通俗的方式理解关键渲染路径

    摘要:缩短的长度能够有效降低首屏时间。即便你使用打包工具只引用了一个外部脚本文件,但是如果这个脚本文件的传输延迟和执行延迟,会导致后面的非关键资源的请求被延迟,虽然这不会减慢的首屏时间。 以通俗的方式理解关键渲染路径 我在看了 google 的 Critical Rendering Path (中文)后, 想把 CRP(Critical Rendering Path) 用通俗易懂的方式描述出...

    Thanatos 评论0 收藏0

发表评论

0条评论

NervosNetwork

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<