WebP是Google推出的图片格式,它比PNG、JPG格式的图片更小,既能节省流量,也能加快网站加载速度。 但是并不是所有的浏览器都支持WebP格式图片的展示,所以需要兼容性解决方案。
html中img
标签的写法如下,增加classwebp
,属性src
替换为data-src
。
js代码检测到img有webp这个class,就会优先把data-src属性中的值转为webp对应的请求,如果webp图片请求失败,就加载原图。
<img data-src="xx.jpg" class="webp" />
// js工具函数 window.webpUtils = { setCookie: function(name, value, Days) { Days = Days ? Days : 30; var exp = new Date(); exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000); document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString() + ';path=/'; }, getCookie: function getCookie(name) { var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); if(arr != null) return unescape(arr[2]); return null; }, set: function(name, value) { if(window.localStorage) { localStorage.setItem(name, value); } else { this.setCookie(name, value); } }, get: function(name) { if(window.localStorage) { return localStorage.getItem(name); } else { return this.getCookie(name); } } }; // 处理函数,ajax加载的图片,需要重新调用该函数 function webp_handle() { var webp_flag = webpUtils.get('webp_flag'); if(webp_flag == 1) { //错误处理,若webp图片不存在,加载默认图片 $('img.webp').on('error', function(){ $(this).attr('src', $(this).data('src')); }); // webp图片加载 $('img.webp').each(function(k, obj) { if($(obj).attr('src')) { return true; //continue } var url = $(obj).data('src'); if(!url) { return true; //continue } url = url.substr(0, url.lastIndexOf('.')) + '.webp'; $(obj).attr('src', url); }); } else { // 浏览器不支持 webp时,加载原图片 $('img.webp').each(function(k, obj) { if($(obj).attr('src')) { return true; //continue } var url = $(obj).data('src'); $(obj).attr('src', url); }); } } $(function(){ // 初始化, 判断浏览器是否支持webp var webp_flag = webpUtils.get('webp_flag'); if(!webp_flag) { var image = new Image(); // 图片加载完成时候的操作 image.onload = function() { // 图片加载成功且宽度为1,那么就代表支持webp了,因为这张base64图是webp格式。如果不支持会触发image.error方法 if(image.width == 1) { webp_flag = 1; } else { webp_flag = 2; } webpUtils.set('webp_flag', webp_flag); webp_handle(); }; image.onerror = function() { webp_flag = 2; webpUtils.set('webp_flag', webp_flag); webp_handle(); }; // 一张支持alpha透明度的webp的图片,使用base64编码 image.src = 'data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA=='; } else { webp_handle(); } });