Sassでベンダープレフィックスを自動で付与する
こんにちは、ゼノフィ渡部です。
Sassを利用した場合に、「-webkit」などのベンダープレフィックスを自動で付与する方法をご紹介いたします。
通常のcssでプレフィックスを記述する場合、プロパティに記述する「-webkit-border-radius: 10px;」や値に記述する「display: -webkit-box;」があります。ここでは2通りの記述方法をご紹介いたします。
Sassファイルに「$set-prefix:」で付与するプレフィックスを記述します。
1 2 | // ベンダープレフィックスを自動で付与する $set-prefix: '' , -moz- , -webkit-; |
「@mixin」で「PropertySetPrefix」という名前でミックスインします。「@each」で「$set-prefix」に記述された分だけ出力されます。ここで 「”」と空の記述をしているとプレフィックスのついていないプロパティが出力されます。
1 2 3 4 5 6 7 8 9 10 | // プロパティにプレフィックスを付与 @mixin PropertySetPrefix($name, $value) { @each $prefix in $set-prefix { #{$prefix}#{$name}: $value; } } |
「div.border」に「@include」で先ほどの「PropertySetPrefix」で「border-radius」プロパティをインクルードします。
「border-radius」は上記の「PropertySetPrefix」では「$name」、「10px」は「$value」に対応しています。
1 2 3 | div.border { @include PropertySetPrefix(border-radius, 10px); } |
CSSに出力される結果は下記のようになります。
1 2 3 4 5 | div.border { border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; } |
下記は値にプレフィックスを記述しています。
1 2 3 4 5 6 7 8 9 10 | // 値にプレフィックスを付与 @mixin ValueSetPrefix($name, $value) { @each $prefix in $set-prefix { #{$name}: #{$prefix}$value; } } |
「div.box」に「@include」で先ほどの「ValueSetPrefix」で「display」プロパティをインクルードします。
「display」は上記の「ValueSetPrefix」では「$name」、「box」は「$value」に対応しています。
1 2 3 | div.box { @include ValueSetPrefix(display, box); } |
CSSに出力される結果は下記のようになります。
1 2 3 4 5 | div.box { display: box; display: -moz-box; display: -webkit-box; } |
Sass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // ベンダープレフィックスを自動で付与する $set-prefix: '' , -moz- , -webkit-; // プロパティにプレフィックスを付与 @mixin PropertySetPrefix($name, $value) { @each $prefix in $set-prefix { #{$prefix}#{$name}: $value; } } // 値にプレフィックスを付与 @mixin ValueSetPrefix($name, $value) { @each $prefix in $set-prefix { #{$name}: #{$prefix}$value; } } div.border { @include PropertySetPrefix(border-radius, 10px); } div.box { @include ValueSetPrefix(display, box); } |
CSS
1 2 3 4 5 6 7 8 9 10 11 | div.border { border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; } div.box { display: box; display: -moz-box; display: -webkit-box; } |