判断浏览器是否支持WebP图片

本文原文来源于自家个人博客站 捷搜索  >>  判断浏览器是否支持WebP图片

上篇文章“什么是WebP图片?”对WebP图片进行了详细的介绍,并介绍其相对于其他图片格式的优势以及它的兼容性问题,那么,本文为大家讲述下如何考虑兼容性的情况下使用WebP图片。

解决原理

我们需要使用WebP格式的图准备两种格式的图片,一种是原图原格式,另一种是WebP图片。然后我们通过判断浏览器是否支持WebP,如果支持就显示WebP图,如果不支持就显示原图。这样我们就可以很妥善地解决WebP图的兼容性问题,最大限度地做到图片最优化。一来,不会因为我只放WebP图,从而影响不支持WebP的浏览器用户,这样比图片加载慢更可怕;二来,也不会WebP的兼容性问题而放弃使用WebP,这样也就体验不到WebP给我们带来的好处。总之,要恰到好处地使用WebP。

v2-c87bbe995a33807d176f5d0b217146a4_hd.jpg

代码实现

1.宽高判断法

先加载一个WebP图片,如果能获取到图片的宽度和高度,就说明是支持WebP的,反之则不支持。

var isWebP = false;
var img = new Image();
img.onload = function(){
    isWebP = !!(img.height>0 && img.width>0);
    checkPic(isWebP);
};
img.onerror = function(){
    isWebP = false;
    checkPic(isWebP);
};
img.src = './c.webp';
var checkPic = function(isWebP){
    $("#pics img").each(function(i,v){
        var src = isWebP?$(v).attr('webppic-src'):$(v).attr('pic-src');
        $(v).attr('src',src);
    })
}

2.请求头相关字段

通过 Chrome 浏览器开发者工具抓包显示,可以通过查看响应头和请求头相关字段,判断其Accept里是否含有 image/webp 字段,如果包含则说明支持WebP,反之则不支持。

1536290516139014.jpg

var checkWebp = function(){
    try{
        return (document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0);
    }catch(err) {
        return  false;
    }
}
isWebP = checkWebP() //isWebP为true则支持WebP,若为false则不支持WebP

总结:整体代码

代码里把两种方法都写进去了,实际使用的时候,选择其中一种使用就行了,把另外一个方法代码去掉,切勿同时使用,以免出错。

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<div id="pics">
	<img src="" pic-src="./c.jpg" webppic-src="./c.webp">
	<img src="" pic-src="./c.jpg" webppic-src="./c.webp">
	<img src="" pic-src="./c.jpg" webppic-src="./c.webp">
</div>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
// 公共方法,操作放原图还是放WebP图
var checkPic = function(isWebP){
	$("#pics img").each(function(i,v){
		var src = isWebP?$(v).attr('webppic-src'):$(v).attr('pic-src');
		$(v).attr('src',src);
	})
}
// 第一种方法
var isWebP = false;
var img = new Image();
img.onload = function(){
	isWebP = !!(img.height>0 && img.width>0);
	checkPic(isWebP);
};
img.onerror = function(){
	isWebP = false;
	checkPic(isWebP);
};
img.src = './c.webp';
// 第二种方法
var checkWebp = function(){
    try{
        return (document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0);
    }catch(err) {
        return  false;
    }
}
checkPic(checkWebp());
</script>
</body>
</html>

 

### 如何在 UniApp 中使用 WebP 图片 #### 处理 WebP 图片的兼容性问题 为了确保 WebP 图片能够在不同版本的 Android 设备上正常显示,开发者需要考虑设备的操作系统版本。对于 4.2.1 及以上版本的 Android 系统,WebP 的解码和编码功能得到了全面的支持,包括带有半透明特性的 WebP 图像;而对于介于 4.0 和 4.2.1 版本之间的系统,则仅能处理完全不透明类型的 WebP 文件[^1]。 针对低于 4.0 版本的情况,默认情况下这些较老版本可能不具备对 WebP 格式的原生支持能力,在这种环境下应用可能会遇到加载失败等问题。因此建议开发人员检测当前运行环境的具体情况并据此调整资源加载逻辑,以提供最佳用户体验。 #### 实现代码示例 下面是一个简单的例子展示如何判断浏览器是否支持 WebP 并相应地切换图像源: ```javascript function supportsWebp() { return new Promise((resolve, reject) => { try { const elem = document.createElement('canvas'); if (elem.getContext && elem.getContext('2d')) { resolve(elem.toDataURL('image/webp').indexOf('data:image/webp') === 0); } else { resolve(false); } } catch (err) { resolve(false); } }); } async function setImageSrc(imgElementId, webpPath, fallbackPath) { let imgEl = document.getElementById(imgElementId); if(await supportsWebp()){ imgEl.src = webpPath; }else{ imgEl.src = fallbackPath; } } ``` 此函数 `supportsWebp` 使用 canvas API 来测试客户端是否能够正确解析 WebP 数据 URL 。如果成功返回 true 表明该端口支持 WebP ,否则则会设置为 false 或者抛出异常时也设为 false 。接着通过 `setImageSrc` 函数根据测试结果动态改变 HTMLImageElement 的 src 属性值从而实现根据不同条件加载不同的图片路径。 #### 配置 uni-app 支持 WebP 当涉及到跨平台框架如uni-app时,除了上述方法外还可以利用其内置配置项来增强应用程序对于特定格式媒体文件的支持程度。例如可以在 manifest.json 文件内的 "app-plus" 字段下加入如下选项以便更好地适配移动操作系统上的 WebP 显示需求: ```json { ... "app-plus": { ... "webp":true, ... }, ... } ``` 这将使得打包后的 APP 更加倾向于优先选用 WebP 类型作为内部使用的图形素材之一,并自动完成必要的转码工作以适应目标平台上存在的差异性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值