懒加载和预加载

图片懒加载

在图片未到达可视区域时,先不请求图片,到达可视区域后再去请求图片,防止页面在初始化时加载大量的图片,影响页面的响应时间

实现方法

  1. 先给img的src指定一个默认的图片地址(图片src不能为空,因为为空的话也会去请求)
  2. 给img添加一个自定义属性data-src,将图片真实的地址赋值给data-src;
  3. 给window添加一个onscroll事件,当滚动页面时,判断img标签是否在可视范围内,如果在,则将data-src中的地址赋值给src,便于去请求图片资源;

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        img {
            display: block;
            margin-bottom: 50px;
            width: 400px;
            height: 400px;
        }
    </style>
</head>
<body>

    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
    <img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="default.jpg" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">

</body>

    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") == "default.jpg") {
                    img[i].src = img[i].getAttribute("data-src");
                }
                n = i + 1;
            }
        }
    }

为了防止在滚动到img的可视范围时,在一定时间内多次请求图片,需要添加节流函数,如下:

// 简单的节流函数
//fun 要执行的函数
//delay 延迟
//time  在time时间内必须执行一次
function throttle(fun, delay, time) {
    var timeout,
        startTime = new Date();

    return function() {
        var context = this,
            args = arguments,
            curTime = new Date();

        clearTimeout(timeout);
        // 如果达到了规定的触发时间间隔,触发 handler
        if (curTime - startTime >= time) {
            fun.apply(context, args);
            startTime = curTime;
            // 没达到触发间隔,重新设定定时器
        } else {
            timeout = setTimeout(fun, delay);
        }
    };
};
// 实际想绑定在 scroll 事件上的 handler
function lazyload(event) {
        for (var i = n; i < imgNum; i++) {
            if (img.eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())) {
                if (img.eq(i).attr("src") == "default.jpg") {
                    var src = img.eq(i).attr("data-src");
                    img.eq(i).attr("src", src);

                    n = i + 1;
                }
            }
        }
    }
// 采用了节流函数
window.addEventListener('scroll',throttle(lazyload,500,1000));

图片预加载

原理:将所有所需的图片提前加载到本地,在需要时,直接从本地缓存中取图片;
实现方式new Image(),然后使用onload()事件回调预加载完成函数;当浏览器将图片下载到本地后,之后同样的src就直接使用缓存

1.无序加载

// 所有的图片(要是网络太好,自己加图片吧)
const imgs = [
    "http://op2clp53n.bkt.clouddn.com/20161104122758_cap-hpi.jpg",
    "http://op2clp53n.bkt.clouddn.com/500414621%20%281%29.jpg",
    "http://op2clp53n.bkt.clouddn.com/cover_bg.png",
    "http://img.aotu.io/mamboer/post-aotu.jpg",
    "http://misc.aotu.io/o2/img/books/books-cover.jpg",
    "http://img.aotu.io/Yettyzyt/cover.png",
    "http://img.aotu.io/wengeek/responsive-image.png",
    "https://gw.alicdn.com/tfs/TB1_6wnRXXXXXbwXFXXXXXXXXXX-900-500.jpg",
    "http://op2clp53n.bkt.clouddn.com/_138.jpg",
    "http://op2clp53n.bkt.clouddn.com/0_ocs_fin_cov_1.jpg",
    "http://op2clp53n.bkt.clouddn.com/2voyage.jpg",
    "http://op2clp53n.bkt.clouddn.com/boa_illustrations_master_fb_1200x628-12.jpg",
    "http://op2clp53n.bkt.clouddn.com/building_science_bulletin_cover_2__1x.jpg",
    "http://op2clp53n.bkt.clouddn.com/building-science-bulletin-cover_1x.jpg",
    "http://op2clp53n.bkt.clouddn.com/chemistry4_1x.png",
    "http://op2clp53n.bkt.clouddn.com/first_colony_dribbble_copy.jpg"
];
let len = imgs.length;

/**
 * 遍历imgs数组,将所有图片加载出来
 * 可以通过控制台查看网络请求,会发现所有图片均已加载
 */
for (let i = 0; i < len; i++) {
    let imgObj = new Image(); // 创建图片对象
    imgObj.src = imgs[i];

    imgObj.addEventListener('load', function () { // 这里没有考虑error,实际上要考虑
        console.log('imgs' + i + '加载完毕');
    }, false);
}

2. 有序加载

// 所有的图片(要是网络太好,自己加图片吧)
const imgs = [
    "http://op2clp53n.bkt.clouddn.com/20161104122758_cap-hpi.jpg",
    "http://op2clp53n.bkt.clouddn.com/500414621%20%281%29.jpg",
    "http://op2clp53n.bkt.clouddn.com/cover_bg.png",
    "http://img.aotu.io/mamboer/post-aotu.jpg",
    "http://misc.aotu.io/o2/img/books/books-cover.jpg",
    "http://img.aotu.io/Yettyzyt/cover.png",
    "http://img.aotu.io/wengeek/responsive-image.png",
    "https://gw.alicdn.com/tfs/TB1_6wnRXXXXXbwXFXXXXXXXXXX-900-500.jpg",
    "http://op2clp53n.bkt.clouddn.com/_138.jpg",
    "http://op2clp53n.bkt.clouddn.com/0_ocs_fin_cov_1.jpg",
    "http://op2clp53n.bkt.clouddn.com/2voyage.jpg",
    "http://op2clp53n.bkt.clouddn.com/boa_illustrations_master_fb_1200x628-12.jpg",
    "http://op2clp53n.bkt.clouddn.com/building_science_bulletin_cover_2__1x.jpg",
    "http://op2clp53n.bkt.clouddn.com/building-science-bulletin-cover_1x.jpg",
    "http://op2clp53n.bkt.clouddn.com/chemistry4_1x.png",
    "http://op2clp53n.bkt.clouddn.com/first_colony_dribbble_copy.jpg"
];
let len = imgs.length;

/**
 * 遍历imgs数组,有序将所有图片加载出来
 * 可以通过控制台查看网络请求,会发现所有图片均按顺序加载
 */
let count = 0;
load();

function load() {
    var imgObj = new Image();
    imgObj.src = imgs[count];

    $(imgObj).on('load error', function () { // 没错我使用了jQuery
        console.log(count);
        if (count >= len) {
            console.log('加载完毕');
            $('.container').addClass('active');
        } else {
            load(); // 继续加载下一张
        }

        count++;
    });
}

参考:
实现图片懒加载(Lazyload)
图片预加载的实现

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 1、懒加载 1.什么是懒加载? 懒加载也就是延迟加载。 当访问一个页面的时候,先把img元素或是其他元素的背景图片...
    却忘不掉你心言阅读 517评论 0 4
  • 1、懒加载 1.什么是懒加载? 懒加载也就是延迟加载。当访问一个页面的时候,先把img元素或是其他元素的背景图片路...
    xiaolizhenzhen阅读 70,446评论 18 160
  • 懒加载和预加载 1. 懒加载 1. 什么是懒加载? 懒加载也就是延迟加载 当访问一个页面的时候,先把img元素或是...
    琦琦出去玩了阅读 749评论 0 8
  • 1.懒加载原理 原理:先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的...
    喵妈阅读 3,334评论 0 3
  • 一、懒加载 1.什么是懒加载 懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式。用户...
    浪里行舟阅读 888评论 0 8