2016-02-20

WebP

WebP を導入するべく簡易Modenizr もどきを使用してフォールバックを行った。

1function checkWebpSupport(fn) { 2 "use strict" 3 const html = document.documentElement, 4 WebP = new Image(); 5 WebP.onload = WebP.onerror = () => { 6 const isSupported = (WebP.width > 0 && WebP.height > 0); 7 8 if (isSupported) { 9 if (html.className.indexOf('no-webp') >= 0) { 10 html.className = html.className.replace(/\bno-webp\b/, 'webp'); 11 } else { 12 html.className += ' webp'; 13 } 14 } 15 16 fn(isSupported); 17 }; 18 WebP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'; 19}

これをロード時に読み込ますことでhtml に付与されたクラスを切り替える。

他にNginx によるフォールバックの実装例も見つけた。

1location = /logo { 2 if ($http_accept ~* "webp") { 3 add_header Vary Accept; 4 rewrite (.*) $1.webp last; 5 } 6 7 if ($http_user_agent ~* "(Chrome|Opera|Android|Android.*Chrome)") { 8 add_header Vary User-Agent; 9 rewrite (.*) $1.webp last; 10 } 11 12 rewrite (.*) $1.png last; 13}

これは単純にUAを判別し、拡張しを書き換える手法のよう。

CSSのimage-setもHTMLの様にフォーマットによる切り替えができれば、こんな回りくどいことしなくていいのだが…。