前回はMedia Queriesの利用方法とその難点、
今回はさらに掘り下げて、
自動化のポイント
まず、
//LESS
body {
#foo {
background-size: 320px 480px;
@media screen and (-webkit-device-pixel-ratio:2){
background-image: url('bg_x2.png');
}
@media screen and (-webkit-device-pixel-ratio:1){
background-image: url('bg.png');
}
}
}
@mediaを毎回書くのは大変ですし、
考え方としては、
- Retina用
(-webkit-device-pixel-ratio: 2) のファイル名 (拡張子のぞく) の末尾には、 自動的に 「_x2」 を付ける - 「_x2」
は後から変更できるようにする - バックグラウンドサイズは両方共通
mixinを作る
mixinの全体像
以下がmixinの全体像となります。
//LESS
.switch-ratio(@url,@width,@height){
@postfix: _2x;
background-size: @width @height;
@media screen and (-webkit-device-pixel-ratio:2){
@url_x2: ~`"@{url}".replace(/\.gif|\.jpg|\.jpeg|\.png/,"@{postfix}"+"$&")`;
background-image: url(@url_x2);
}
@media screen and (-webkit-device-pixel-ratio:1){
background-image: url(@url);
}
}
body {
#foo {
.switch-ratio('bg.gif',320px,480px);
}
}
/* Compiled CSS */
body #foo {
background-size: 320px 480px;
}
@media screen and (-webkit-device-pixel-ratio: 2) {
body #foo {
background-image: url('bg_2x.gif');
}
}
@media screen and (-webkit-device-pixel-ratio: 1) {
body #foo {
background-image: url('bg.gif');
}
}
今までご紹介してきたmixinのなかで、
画像の情報を定義する
.switch-ratio(@url,@width,@height){
まず、
- 画像のurl
(@url) - 画像の幅
(@width) - 画像の高さ
(@height)
@postfix: _2x;
Retina用画像の名前のルールを定義している部分です。
ここでは、
background-size: @width @height;
背景として定義する画像の大きさは、
@media screen and (-webkit-device-pixel-ratio:2){
ここは、
Retina用の画像を表示させる
@url_x2: ~`"@{url}".replace(/\.gif|\.jpg|\.jpeg|\.png/,"@{postfix}"+"$&")`;
ぱっと見てすごく複雑になってしまいましたが、
まず、
その上で、
- 「拡張子が.gifか.jpgか.jpegか.pngだった場合、
ファイル名の末尾に@{postfix} (今回の場合は 「_2x」)を追加する
という処理をJavaScriptで行っています。
そして出来上がった値を、
一見複雑になってしまったのは、
background-image: url(@url_x2);
こちらで先ほど作ったRetina用のファイル名
非Retina用の画像を表示させる
@media screen and (-webkit-device-pixel-ratio:1){
background-image: url(@url);
}
こちらは第8回でご紹介したコードと同様です。-webkit-device-pixel-ratio:1の場合には、
これで、
あとは以下のように、
.switch-ratio('bg.gif',320px,480px);
いかがでしたでしょうか?
JavaScriptによる文字列の編集や、
しかしその分、
LESSのコードの書き方は、
次回は、