图片加载一个老生常谈的问题,由于最近工作中经常有h5宣传页的需求,所以也看了一些方案
- medium网站上提高用户体验的图片高斯模糊加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<!-- figure,代表一段独立的内容,常用语引用图片、插图、表格、代码段等等 -->
<figure>
<!-- 图片容器 -->
<div class="aspectRatioPlaceholder is-locked" style="max-width: 383px; max-height: 326px;">
<!-- 放置reflow的占位元素,style上的padding-bottom是通过接下来相邻div上写好的图片宽高计算而来,可通过十字相乘得到高度百分比 -->
<div class="aspectRatioPlaceholder-fill" style="padding-bottom: 85.1%;"></div>
<!-- 实际的图片信息,包括图片id和图片宽高 -->
<div data-image-id="1*MZY5pNF7fgOarY-J2fNuHQ.png" data-width="383" data-height="326">
<!-- 可以看到png后缀后有一个query: ?q=20,这个是缩略图的质量,猜想是二十分之一? -->
<img src="https://cdn-images-1.medium.com/freeze/max/60/1*MZY5pNF7fgOarY-J2fNuHQ.png?q=20" crossorigin="anonymous">
<!-- 获取上面的图片,渲染到canvas中,canvas宽高为实际的图片宽高,并添加高斯模糊效果,以获取较好的用户体验 -->
<canvas></canvas>
<!-- 真正的图片 -->
<img src="https://cdn-images-1.medium.com/max/1600/1*MZY5pNF7fgOarY-J2fNuHQ.png">
<!-- 向后兼容,在不支持js脚本或者支持js脚本,但认为禁止js脚本的浏览器中可以被识别 -->
<noscript>
<img src="https://cdn-images-1.medium.com/max/1600/1*MZY5pNF7fgOarY-J2fNuHQ.png">
</noscript>
</div>
</div>
</figure>
- 诺,可以先看一遍上面HTML代码中的注释,加上一点自己的理解,估计你能理解个大概
- 首先,准备一个真正需要展示给用户的图片和一个可以通过query来生成不同质量的缩略图的服务,哈哈
- 然后先加载质量很小很小的缩略图,然后通过div上设置的图片真正宽高,渲染到canvas中,并添加合适的高斯模糊效果
- 然后可以通过network中看到,等小图加载完毕后,再去加载原图,保证页面第一版加载更快,缩短执行js的时间
- 原图加载完毕后,显示原图,隐藏之前的canvas
- 对了,还有一个placeholder元素,这个是为了放置切换时造成的reflow,这个需要js动态设置图片容器的宽高,然后通过比例设置placeholder元素的padding-bottom
- 元素上使用了自定义属性,一个通用的、赋予html数据属性的特性,解决了自定义属性混乱无管理的情况,css选择器也可以选中它哦