科技博客 GigaOM 曾报道:YouTube 的视频略缩图采用 WebP 格式后,网页加载速度提高了 10%;谷歌的 Chrome 网上应用商店采用 WebP 格式图片后,天天能够节省几 TB 的带宽,页面平均加载时间大约减小 1/3;Google+ 移动应用采用 WebP 图片格式后,天天节省了 50TB 数据存储空间。html
一样的质量下,更小的体积,更快的加载速度。ios
为何不用?git
阻止咱们用webp大概出于两个考虑github
(1)与JPG相比较,解码速度慢1.5倍web
不少性能的瓶颈在于传输的速度,而不是解码的速度 (这也是固态硬盘对电脑提高明显的缘由),api
缩短的加载时间远远大于解码所须要的时间。浏览器
参考自 探究WebP一些事儿 测试demo微信
(2)兼容问题 less
webp的兼容性不是很乐观,尤为在ios safari上一片红。 这里咱们在客户端用js检测是否支持WebP,支持请求webp图片,不支持保持原格式。函数
下面是Google官方提供的检测代码 能够检测 浏览器对 webp lossy 有损 lossless无损 alpha透明 animation动图的支持
function check_webp_feature(feature, callback) {
var kTestImages = {
lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
};
var img = new Image();
img.onload = function () {
var result = (img.width > 0) && (img.height > 0);
callback(feature, result);
};
img.onerror = function () {
callback(feature, false);
};
img.src = "data:image/webp;base64," + kTestImages[feature];
复制代码
}
咱们公司的使用场景比较简单,检测webp的有损格式就行
(function check_webp_support() {
var _KEY = "lvtou_ifSupportWebp";
var ifCheckAlready = window.localStorage[_KEY];
if (ifCheckAlready) {
return ifCheckAlready;
} else {
check_webp_feature("lossy", function(feature, result) {
//localStorage只能存储字符串
window.localStorage[_KEY] = result ? 'true' : 'false';
});
}
})();
复制代码
检测到支持后,把图片的连接改为webp的就行
咱们公司用七牛云作cdn。 七牛使用webp比较简单,只要在原来请求的连接后面拼接上一些参数就行。
原连接 196kb
http://www.***.com/test.jpg
webp连接 30.4kb
http://www.***.com/test.jpg?imageMogr2/format/webp
拼接的参数 能够用七牛云的图片样式精简,这里不作展开,官方有视频教程。
图片是网页中流量占比最多的部分, 不在可视区域的图片是不必发起请求的。
通常都会作懒加载,我用的是 lazysizes。
lazysizes的使用比较简单,引入以后,不须要初始化。 把须要懒加载的图片加上lazyload的class,再 data-src 存储src就行。
<img data-src="image.jpg" class="lazyload" />
复制代码
webp和lazysizes结合,只须要 在 lazysizes 提供了的生命周期钩子函数里修改data-src的值就行。
lazybeforeunveil是把data-src替换成src以前的钩子。
document.addEventListener("lazybeforeunveil", function(e) {
var IMG = e.target;
var src = IMG.getAttribute("data-src");
if (window.lvtou_ifSupportWebp) {
IMG.setAttribute("data-src", src + "?imageMogr2/format/webp");
}
});
复制代码
传统判断图片是否在可视区域的办法是
监听 scroll 事件,在 scroll 的时候,
比较目标元素的 offsetTop来判断,
scroll事件触发很频繁(通常都会作节流) ,获取offsetTop的值又会触发重排,很容易引起卡顿。
应运而生的 IntersectionObserver api 能够在,
不监听scroll和触发重排的状况下
判断图片是否进入可视区。 感兴趣的能够看看 阮一峰大佬 的 教程
... 待更新..
... ...
最后咱们公司在举办活动,对摄影,楹联文化,和传统服饰有兴趣的朋友 能够去 微信公众号 看看