推断浏览器是不是支撑 webp 的几种解决方法

我们都晓得,WebP 是 Google 推出的 WebP 图片花样,它是一种支撑有损压缩和无损压缩的图片文件花样,依据Google测试,雷同的图片,WebP 花样的图片均能比 PNG,JPG 花样的图片勤俭不少体积,然则其兼容性不是很好,以下:

《推断浏览器是不是支撑 webp 的几种解决方法》

因而我们需要做一些兼容处置惩罚,那末怎样推断浏览器支撑 webp 呢?下面有几种要领可供参考。

要领一

运用 canvas 的 toDataURL 举行推断

toDataURL要领在MDN诠释以下:

HTMLCanvasElement.toDataURL() 要领返回一个包括图片展现的 data URI 。能够运用 type 参数其范例,默以为 PNG 花样。图片的分辨率为96dpi。

  • 假如画布的高度或宽度是0,那末会返回字符串“data:,”。
  • 假如传入的范例非“image/png”,然则返回的值以“data:image/png”开首,那末该传入的范例是不支撑的。
  • Chrome支撑“image/webp”范例。

toDataURL要领将图片转化为包括dataURI的DOMString,经由过程 base64 编码前面的图片范例值是image/webp举行推断。

比如在谷歌浏览器运用toDataURL要领转成image/webp:

《推断浏览器是不是支撑 webp 的几种解决方法》

在 Safari 浏览器运用toDataURL要领转成image/webp:

《推断浏览器是不是支撑 webp 的几种解决方法》

能够发如今不支撑 webp 的浏览器举行toDataURL,获得的图片范例并非 webp,因而我们能够经由过程这个举行推断。

完成要领:

var isSupportWebp = function () {
  try {
    return document.createElement('canvas').toDataURL('image/webp', 0.5).indexOf('data:image/webp') === 0;
  } catch(err) {
    return false;
  }
}

isSupportWebp()

要领二

在服务端依据要求header信息推断浏览器是不是支撑webp

谷歌浏览器上要求图片 header是如许的:
《推断浏览器是不是支撑 webp 的几种解决方法》

IE 浏览器要求图片 header是如许的:
《推断浏览器是不是支撑 webp 的几种解决方法》

在图片要求发出的时刻,Request Headers 里有 Accept,服务端能够依据Accept 内里是不是有 image/webp 举行推断。

要领三

经由过程加载一张 webp 图片举行推断

const supportsWebp = ({ createImageBitmap, Image }) => {
  if (!createImageBitmap || !Image) return Promise.resolve(false);

  return new Promise(resolve => {
      const image = new Image();
      image.onload = () => {
          createImageBitmap(image)
              .then(() => {
                  resolve(true);
              })
              .catch(() => {
                  resolve(false);
              });
      };
      image.onerror = () => {
          resolve(false);
      };
      image.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=';
  });
};

const webpIsSupported = () => {
  let memo = null;
  return () => {
      if (!memo) {
          memo = supportsWebp(window);
      }
      return memo;
  };
};

webpIsSupported()().then(res => {
    console.log("是不是支撑 webp", res)
}).catch(err => {
    console.log(err)
})

此要领会加载一张 1×1 的白色的正方形背景图,用来测试浏览器是不是支撑 webp。

在 Google 测试代码:
《推断浏览器是不是支撑 webp 的几种解决方法》

在 Firefox 测试代码:
《推断浏览器是不是支撑 webp 的几种解决方法》

在 Safari 测试代码:
《推断浏览器是不是支撑 webp 的几种解决方法》

Google官方文档是如许处置惩罚的(先加载一个WebP图片,假如能获取到图片的宽度和高度,就申明是支撑WebP的,反之则不支撑):

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];
}

参考

    原文作者:Moorez
    原文地址: https://segmentfault.com/a/1190000019359180
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞