Sassで使うprefixを連想配列ぽいやつで指定して必要なプロパティを吐き出す
タイトルがカオス・・・下みたいな各vendor prefixを使うか使わんかみたいな連想配列ぽい配列を定義しておくと、trueのvendor prefixが付いたプロパティだけを吐き出すようなやつがほしかった
$use:
-webkit-, true,
-moz-, true,
-o-, true,
-ms-, true;
// 本当はこうしたいけど
$use: {
'-webkit-': true,
'-moz-': true,
'-o-': true,
'-ms-': true
}
全部trueのときは例えばborder-radiusだと
.hoge {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-o-border-radius: 5px;
-ms-border-radisu: 5px;
border-radius: 5px;
}
みたいな。falseにしたらそれに対応するprefixが出力されなくなる、みたいな。全部のmixinに書けばそれで終わりだけど、そんなの面倒くさいし、vendor prefixを付けたプロパティを出力するmixinみたいなのを書いた。
$use:
-webkit-, true,
-moz-, true,
-o-, true,
-ms-, true;
@mixin addPrefix($property, $value) {
$property: unquote($property);
$value: unquote($value);
@for $i from 1 through length($use)/2 {
$n: $i * 2;
$propIndex: $n - 1;
@if nth($use, $n) {
#{nth($use, $propIndex) + $property}: $value;
}
}
#{$property}: $value;
}
これはmixinの中で呼ぶmixinで、(そのまま呼んでもいいけど
@mixin border-radius($value) {
@include addPrefix('border-radius', $value);
}
こういう風にborder-radiusのmixinを書くと
.hoge {
@include border-radius('5px');
}
これが
.hoge {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-o-border-radius: 5px;
-ms-border-radisu: 5px;
border-radius: 5px;
}
こうなる。
で、これだけでもよかったけど、プロパティによっては不要なやつ吐き出したくない場合もあるし、ついでにもうひとつ引数用意して、このmixinの中ではデフォルトでverdor prefixをfalseにできるよみたいな!important的なprefix設定を書けるように変える。
@mixin border-radius($value) {
// この部分
$def:
-webkit-, false;
@mixin('border-radius', $value, $def);
}
こうすると、-webkit-が消える(あくまでも例
.hoge {
-moz-border-radius: 5px;
-o-border-radius: 5px;
-ms-border-radius: 5px;
border-radius: 5px;
}
最後に$defを渡して、それがあればそっちで上書きするように変える
$use:
-webkit-, true,
-moz-, true,
-o-, true,
-ms-, true;
@mixin addPrefix($property, $value, $def: false) {
$property: unquote($property);
$value: unquote($value);
@for $i from 1 through length($use)/2 {
$n: $i * 2;
$flg: nth($use, $n);
$prfx: nth($use, $n - 1);
@if $def {
$_index: index($def, $prfx);
@if $_index {
$flg: nth($def, $_index + 1);
}
}
@if $flg {
#{$prfx + $property}: $value;
}
}
#{$property}: $value;
}
こうしとけば
@mixin box-shadow($value) {
$def:
-webkit-, false,
-ms-, true;
@include addPrefix('box-shadow', $value, $def);
}
@mixin background-size($value) {
@include addPrefix('background-size', $value);
}
こんなmixinがあったときに(例えです
.hoge {
@include box-shadow('0 0 0 #000');
@include background-size('12px 12px');
}
は
.hoge {
-moz-box-shadow: 0 0 0 #000;
-o-box-shadow: 0 0 0 #000;
-ms-box-shadow: 0 0 0 #000;
box-shadow: 0 0 0 #000;
-webkit-background-size: 12px 12px;
-moz-background-size: 12px 12px;
-o-background-size: 12px 12px;
background-size: 12px 12px;
}
こうなる。サンプルを適当に書きすぎた。。。。
Trackbacks: 0
- Trackback URL for this entry
- Listed below are links to weblogs that reference
- Sassで使うprefixを連想配列ぽいやつで指定して必要なプロパティを吐き出す from 5509
Leave a comment