判斷瀏覽器是否支持 webp 的幾種解決方法

我們都知道裁蚁,WebP 是 Google 推出的 WebP 圖片格式,它是一種支持有損壓縮和無損壓縮的圖片文件格式继准,根據(jù)Google測試枉证,相同的圖片,WebP 格式的圖片均能比 PNG移必,JPG 格式的圖片節(jié)約不少體積室谚,但是其兼容性不是很好,如下:



因此我們需要做一些兼容處理崔泵,那么如何判斷瀏覽器支持 webp 呢秒赤?下面有幾種方法可供參考。

方法一

使用 canvas 的 toDataURL 進(jìn)行判斷

toDataURL方法在MDN解釋如下:

HTMLCanvasElement.toDataURL() 方法返回一個包含圖片展示的 data URI 憎瘸∪肜海可以使用 type 參數(shù)其類型,默認(rèn)為 PNG 格式幌甘。圖片的分辨率為96dpi潮售。

  • 如果畫布的高度或?qū)挾仁?,那么會返回字符串“data:,”锅风。
  • 如果傳入的類型非“image/png”酥诽,但是返回的值以“data:image/png”開頭,那么該傳入的類型是不支持的皱埠。
  • Chrome支持“image/webp”類型肮帐。

toDataURL方法將圖片轉(zhuǎn)化為包含dataURI的DOMString,通過 base64 編碼前面的圖片類型值是image/webp進(jìn)行判斷边器。

比如在谷歌瀏覽器使用toDataURL方法轉(zhuǎn)成image/webp:

在 Safari 瀏覽器使用toDataURL方法轉(zhuǎn)成image/webp:

可以發(fā)現(xiàn)在不支持 webp 的瀏覽器進(jìn)行toDataURL训枢,得到的圖片類型并不是 webp,因此我們可以通過這個進(jìn)行判斷饰抒。

實(shí)現(xiàn)方法:

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

isSupportWebp()

方法二

在服務(wù)端根據(jù)請求header信息判斷瀏覽器是否支持webp

谷歌瀏覽器上請求圖片 header是這樣的:


IE 瀏覽器請求圖片 header是這樣的:


在圖片請求發(fā)出的時候,Request Headers 里有 Accept诀黍,服務(wù)端可以根據(jù)Accept 里面是否有 image/webp 進(jìn)行判斷袋坑。

方法三

通過加載一張 webp 圖片進(jìn)行判斷

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)
})

此方法會加載一張 1x1 的白色的正方形背景圖,用來測試瀏覽器是否支持 webp。

在 Google 測試代碼:


在 Firefox 測試代碼:


在 Safari 測試代碼:


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

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末也颤,一起剝皮案震驚了整個濱河市洋幻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翅娶,老刑警劉巖文留,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竭沫,居然都是意外死亡燥翅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蜕提,熙熙樓的掌柜王于貴愁眉苦臉地迎上來森书,“玉大人,你說我怎么就攤上這事谎势×莞啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵脏榆,是天一觀的道長猖毫。 經(jīng)常有香客問我,道長姐霍,這世上最難降的妖魔是什么鄙麦? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮镊折,結(jié)果婚禮上胯府,老公的妹妹穿的比我還像新娘。我一直安慰自己恨胚,他們只是感情好骂因,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赃泡,像睡著了一般寒波。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上升熊,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天俄烁,我揣著相機(jī)與錄音,去河邊找鬼级野。 笑死页屠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辰企,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼风纠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牢贸?” 一聲冷哼從身側(cè)響起竹观,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潜索,沒想到半個月后臭增,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮辟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年速址,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片由驹。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡芍锚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔓榄,到底是詐尸還是另有隱情并炮,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布甥郑,位于F島的核電站逃魄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澜搅。R本人自食惡果不足惜伍俘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勉躺。 院中可真熱鬧癌瘾,春花似錦、人聲如沸饵溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜕企。三九已至咬荷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轻掩,已是汗流浹背幸乒。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唇牧,地道東北人罕扎。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓基茵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壳影。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 注明:本人原創(chuàng)翻譯,原版為Essential Image Optimization電子書径缅,這里將其拆分為幾篇文章發(fā)...
    ProteanBear閱讀 5,112評論 0 5
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5掺栅? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,449評論 1 45
  • 本文原文來源于自家個人博客站 捷搜索 >> 判斷瀏覽器是否支持WebP圖片纳猪, 上篇文章“什么是WebP圖片氧卧?”...
    捷搜索閱讀 4,375評論 0 2
  • 最近,我們在項(xiàng)目中實(shí)踐了webp圖片氏堤,并且抽離出了工具模塊沙绝,整合到了項(xiàng)目的基礎(chǔ)模板中。傳聞IOS10也將要支持we...
    單純的土豆閱讀 2,248評論 1 15
  • 你以不變的模樣 熄滅我的過往 爬山虎的腳印 我的身影 都是太陽的奴隸 為此我終止流浪 站在你綻放的地方 我虔誠仰望...
    夏知寒閱讀 532評論 0 0