图片延迟加载方案

图片延迟加载的原理是什么?

图片延迟加载的原理就是先不设置img的src属性,等合适的时机(比如滚动、滑动等)再把图片真实url放到img的src属性上。
过多的图片会严重影响网页的加载速度,移动网络下的流量消耗巨大,延迟加载几乎是标配。

图片延迟加载的使用场景有哪些?

  1. 好奇心日报首页和列表页都有很多固定宽高的图片。
  2. 好奇心日报文章详情页的图片,这些图片需要自适应宽度且保持宽高比(防止页面抖动)。
固定宽高延迟加载

这个比较简单,设置好固定宽高,直接使用最简单的延迟加载即可
淘宝mobile首页的延迟加载有个点做得特别好,滚动结束后只加载当前视窗可见的图片,不会加载滚动超过视窗的图片,也不会加载还没滚动到的视窗图片。

非固定宽高的延迟加载

目前大概有两种方案,各有优劣,具体看情况使用:
第一种方案使用padding-top或者padding-bottom来实现固定宽高比。优点是纯css方案,缺点是html冗余,对输出到第三方不友好

<div style="padding-top:75%">
    <img data-src="" alt="" class="lazyload">
<div>

第二种方案在页面初始化阶段利用ratio设置实际宽高值,优点是html干净,对输出到第三方友好,缺点是依赖js,理论上会至少抖动一次

<img data-src="" alt="" class="lazyload" data-ratio="0.75">
更进一步结合srcset

除了上面说的延迟加载,我们可以更进一步的引入srcset,通过设置srcset来保证加载最匹配的图片,这样对于一倍屏,二倍屏,三倍屏来说,可以做到不浪费流量且效果最好。

都有哪些延迟加载开源方案?

jquery_lazyload

依赖于jquery

<img class="lazy" data-original="img/example.jpg" width="640" height="480">
// 初始化
$("img.lazy").lazyload();

lazysizes 推荐

原生js,不依赖于jquery/zepto
自动监测可能发生变化的lazyload节点,不需要额外初始化
支持响应式图片srcset
性能高,改善SEO

// 引入js文件
<script src="lazysizes.min.js" async=""></script>

// 非响应式 例子
<img data-src="image.jpg" class="lazyload" />
// 响应式 例子,自动计算合适的图片
<img
    data-sizes="auto"
    data-src="image2.jpg"
    data-srcset="image1.jpg 300w,
    image2.jpg 600w,
    image3.jpg 900w" class="lazyload" />
// iframe 例子
<iframe frameborder="0"
    class="lazyload"
    allowfullscreen=""
    data-src="//www.youtube.com/embed/ZfV-aYdU4uE">
</iframe>

lazyload

依赖jquery/zepto

<!-- 直接赋予图片宽高 -->
<img class="lazy" data-original="img/example.jpg" width="640" height="480">
<!-- 或:通过css赋予图片宽高 -->
<style>
    .lazy{width:640px;height:480px;}
</style>
<img class="lazy" data-original="img/example.jpg">
<!-- 或:自适应宽度的图片样式(常用于移动端) -->
<style>
    .lazy{width:100%;height:0;padding-top:75%;background-size:100%;}
    /* 假设高宽比为 480:640,即75%,并使用背景图的方式将图片铺在padding-top区域内
    (padding的百分比是宽度的百分比而不是高度的,即使是padding-top|padding-bottom) */
</style>
<div class="lazy" data-original="img/example.jpg"><div>
<!-- 请参阅examples/enabled_image_full_width.html -->
<!-- 初始化 -->
$(".lazy").lazyload();

微信如何实现延迟加载?

研究了微信延迟加载的代码,还解决了一个问题,那就是常见于移动端的自适应宽度的延迟加载,即根据情况具体计算宽高。

// 源码
<img 
    data-s="300,640" 
    data-type="jpeg" 
    data-src="http://mmbiz.qpic.cn/mmbiz/meG6Vo0MeviaLibiaARRszfMpiaXtejcktPB2fK6uP13R4RS9Y7fHtk5bUd7A9R9zRyZ1nupW8ZVjHwBiaZUa3SkcPg/0?wx_fmt=jpeg" 
    data-ratio="0.8003597122302158" 
    data-w=""  
/>

// 解析后的代码
<img 
    data-s="300,640" 
    data-type="jpeg" 
    data-src="http://mmbiz.qpic.cn/mmbiz/meG6Vo0MeviaLibiaARRszfMpiaXtejcktPBLbT37dSYzNyhwDTiac0WiaribF0Vt7I3Zd7AG9xXSCUoch61KicnYnfqIw/0?wx_fmt=jpeg" 
    data-ratio="0.8003597122302158" 
    data-w="" 
    src="http://mmbiz.qpic.cn/mmbiz/meG6Vo0MeviaLibiaARRszfMpiaXtejcktPBLbT37dSYzNyhwDTiac0WiaribF0Vt7I3Zd7AG9xXSCUoch61KicnYnfqIw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&retryload=1" 
    style="width: 414px !important; visibility: visible !important; height: 331.349px !important;" 
/>

/* 其中
data-s:表示可选的图片尺寸大小
data-type:表示图片类型
data-src:表示图片链接
data-ratio:表示长宽比
*/

由于源码是压缩模式的,做简单的猜测如下:

  1. 对于延迟加载,微信采用的模式和正常的延迟加载的模式类似,即用data-src存储真实的图片链接
  2. 为了解决移动端的自适应宽度的问题,微信存储了长宽比,然后进入页面就计算在不同设备里的真实宽高,并设置在style

其他问题?

  1. 接入第三方平台的网页怎么处理?
    由于好奇心日报的文章会输出到第三方平台,比如今日头条/一点资讯等平台,这些平台对html都有一定的规范。这时候就需要后台在输出之前对html做一些转换。
    为了简单起见,类似<div class="lazy" data-original="img/example.jpg"><div>的方案不太适合让后台转换,所以微信这种动态计算方法可以借鉴。
  2. 怎么处理响应式图片?
    响应式图片能够根据当前屏幕分辨率加载最匹配的图片,能够因地制宜,详见图片响应式解决方案
  3. 方案有了,回头追加一篇具体实践踩坑的博文
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容