HTMLのタグのみで画像をメディアクエリーする
HTMLのタグのみで画像をメディアクエリーする
imgタグのみを使う場合
srcset属性とsizes属性を使う。width=”” height=””は書かない。
この方法ではsample.pngが一度読み込まれたらビューポートを変更しても他の画像は再読込みされない点に注意。
1 2 3 4 5 |
<img srcset="images/sample.png 616w" // ブラウザに画像のサイズを通知(単位表記はw = px) sizes="(max-width: 1000px) calc(100vw - 40px), 616px" // 画面表示サイズ。1000pxまでは画面横幅いっぱい(100vw = 100% calcはmargin分を引く計算の例)で。それを下回ったら616pxで描画。 // ※width="" height=""は書かない。 > |
picture sourceタグを使って。
ビューポート毎にsourceタグに対してmedia属性・srcset属性・sizes属性を、最後にimgタグは通常通り書く。
この方法ではビューポートを変更したら該当の画像が再読込みされる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<div class="pic"> <picture> <source media="(max-width: 375px)" srcset="images/sample-185x36.png 185w" // 用意したサイズ違いの画像 sizes="calc(100vw - 40px)" > <source media="(max-width: 750px)" srcset="images/sample-308x60.png 308w" // 用意したサイズ違いの画像 sizes="calc(100vw - 40px)" > <source media="(min-width: 751px)" srcset="images/sample-616x120.png 616w" // 用意したサイズ違いの画像 sizes="calc(100vw - 40px)" > <img srcset="images/sample-616x120.png" width="616" // ※ height="120" // ※ > </picture> </div> |
※width=”” height=””指定はなくても意図した描画に切替わるが、Google PageSpeed Insightsでは怒られる。その対策としてwidth=”” height=””指定をするが、 それではsourceタグのsizesが効かずimgタグの指定に固定されてしまうので、別途CSSで補う。
補充用のCSSの例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.pic img { display: block; width: 100%; // 小さい画像を表示するものにはこちらを当てる height: auto; } @media only screen and (min-width: 751px) { .pic img { display: block; width: 616px; height: 120px; } } |
Retina対応は?
sourceタグのsrcset属性に実画像サイズ(640w)とRetina指定(2x)を両方記述することはできない。
画像サイズの変更は必要ない場合なら(Retina対応含む)、 srcsetに「,」区切りで倍率ごとに記述する。画像サイズを変えないのでsourceタグのmediaやsizesは不要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<picture> <source srcset=" images/sample-320w.jpg, images/sample-480w@1.5.jpg 1.5x, images/sample-640w@2x.jpg 2x" > <img src="images/sample-640w.jpg" alt="サンプル" width="320" height="213" > <picture> |
Retina対応も画像サイズも欲張りたいなら、sourceタグを分けて記述する。 前述の理由でスタイルシートも併用するのがベター。1x, 2xは書かないが、srcsetに指定する画像をRetina用のものにすることで実質的にRetina問題も解決できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<picture> <source media="(max-width: 640px)" srcset="images/sample-640w@2x.jpg 640w" // x2の指定はしないが画像はそれ用をあてて、 sizes="calc(100vw - 16px)" // ここで表示サイズを指定する > <source media="(min-width: 641px)" srcset="images/sample-320w.jpg 320w" sizes="320px" > <img src="images/sample-320w.jpg" alt="サンプル" width="320" height="212" > </picture> |
コメント
コメントはありません。