可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am extremely new to Sass/Compass, so this question may sound dumb to many of you.
Anyway, what I need to know is how to create a mixin for browser vendor prefixes that I can reuse over and over without having to type them every time.
I've seen tutorials online but I just can't understand some of the concepts I need to be able to apply them correctly.
What I need right now is to accomplish this in CSS:
* {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
-ms-box-sizing:border-box;
-o-box-sizing:border-box;
box-sizing:border-box;
}
Thanks.
回答1:
Sounds like you want to use the Compass box-sizing mixin. Your SASS file would look like this:
@import "compass/css3/box-sizing";
* {
@include box-sizing(border-box);
}
And would compile to this:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box; }
You can see the other CSS3 Compass mixins here. Note, though, that Compass doesn't include prefixes like -ms-box-sizing
, for instance, since IE8+ has implemented it without a prefix. If you really want those extra properties, this is how you'd do it:
@import "compass/css3/shared"
* {
@include experimental(box-sizing, border-box, -moz, -webkit, -o, -ms, not -khtml, official);
}
回答2:
I also wanted to abstract out vendor prefixes but didn't have compass available to me.
@mixin vendor-prefix($name, $value) {
@each $vendor in ('-webkit-', '-moz-', '-ms-', '-o-', '') {
#{$vendor}#{$name}: #{$value};
}
}
Sass:
* {
@include vendor-prefix('box-sizing', 'border-box');
}
Renders:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
-o-box-sizing: border-box;
box-sizing: border-box; }
Also see:
http://stefanwienert.net/blog/2012/05/18/easy-css-vendor-prefix-mixin-for-sass/
回答3:
Here is my sass solution to deal with vendor prefixes: https://github.com/Aloge/sass-prefixer
It is similiar to @rimian's solution but you only need to include a mixin with the css property and its value and it automatically renders the css with the vendor prefixes necessary.
So this:
* {
@include prefix(box-sizing, border-box)
}
renders:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
but this:
* {
@include prefix(display, flex)
}
renders:
* {
display: -moz-flex;
display: -webkit-flex;
display: flex;
}
It's still in beta and it may have bugs but I'm working to improve it and include new features
回答4:
I would encourage you to try writing your own mixins. Here is the one I am using for browser prefixes.
@mixin prefix ($prop, $val...)
-webkit-#{$prop}: #{$val}
-moz-#{$prop}: #{$val}
-ms-#{$prop}: #{$val}
#{$prop}: #{$val}
Then you can use it by simply typing (using box-sizing as an example):
+prefix (box-sizing, border-box)
Results in the following CSS:
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
If you need to pass more than one value, you can use parentheses (useful for transitions):
+prefix (box-shadow, (0 2px rgba(black, 0.1), 0 0 0 1px rgba(black, 0.1))
Results in the following CSS:
-webkit-box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
-moz-box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
-ms-box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
box-shadow: 0 2px rgba(0,0,0, 0.1), 0 0 0 1px rgba(0,0,0, 0.1);
回答5:
$vendors: (
'-webkit-','-apple-','-khtml-',
'-moz-','-rim-','-xv-',
'-ms-','-o-',''
);
@mixin pref($prop,$val...) {
@each $key in $vendors {
#{$key}#{$prop}:$val;
}
}
selector {
@include pref(box-sizing,border-box);
}
renders like this:
selector {
-webkit-box-sizing: border-box;
-apple-box-sizing: border-box;
-khtml-box-sizing: border-box;
-moz-box-sizing: border-box;
-rim-box-sizing: border-box;
-xv-box-sizing: border-box;
-ms-box-sizing: border-box;
-o-box-sizing: border-box;
box-sizing: border-box;
}
回答6:
I think you should use Autoprefixer so you don't have to worry about browser prefixes anymore.
Autoprefixer uses the data base of caniuse.com.
I recommand you to start using Grunt or Gulp then plugin Autoprefixer as a task it will re-compile the css and spits out needed browser prefixes for you.
回答7:
Complete Advance Solution
Variables :: CREATE vars with all or usable prefixes
/* CREATE vars with all or usable prefixes */
$all-vendors: (
'webkit','apple','khtml',
'moz','rim','xv',
'ms','o'
);
$using-vendors: (
'webkit', 'moz', 'ms', 'o'
);
Actual Mixing Functions :: Mixin for multiple declarations && Mixin for multiple declarations
/** Mixin for multiple declarations **/
@mixin prefs($declarations, $prefixes: ()) {
@each $property, $value in $declarations {
@each $prefix in $prefixes {
#{'-' + $prefix + '-' + $property}: $value;
}
#{$property}: $value;
}
}
/** Mixin for single property to be prefixed **/
@mixin pref($property, $value, $prefixes){
@each $prefix in $prefixes {
#{'-' + $prefix + '-' + $property}: $value;
}
#{$property}: $value;
}
###Actual Usage :: use @include in any selector
Example of Multiple
/** Prefixes usage **/
.selector {
@include prefs((
column-count: 3,
column-gap: 1.5em,
column-rule: 2px solid hotpink
), $using-vendors);
}
Example of Single pref mixin
.cc3 {
@include pref(column-count,3,webkit moz ms);
}
.ccc4 {
@include pref(column-count, 4, $all-vendors);
}
Finally after compiling using SASS compiler
output
.selector {
-webkit-column-count: 3;
-moz-column-count: 3;
-ms-column-count: 3;
column-count: 3;
-webkit-column-gap: 1.5em;
-moz-column-gap: 1.5em;
-ms-column-gap: 1.5em;
column-gap: 1.5em;
-webkit-column-rule: 2px solid hotpink;
-moz-column-rule: 2px solid hotpink;
-ms-column-rule: 2px solid hotpink;
column-rule: 2px solid hotpink; }
.cc3 {
-webkit-column-count: 3;
-moz-column-count: 3;
-ms-column-count: 3;
column-count: 3; }
.ccc4 {
-webkit-column-count: 4;
-apple-column-count: 4;
-khtml-column-count: 4;
-moz-column-count: 4;
-rim-column-count: 4;
-xv-column-count: 4;
-ms-column-count: 4;
column-count: 4; }
other option is to use Koala, just enable auto-Prefix and it will work like charm.
you can download it from here.
*or use grunt build system. *
回答8:
My Version for single or multiple declarations
//prefix vendors
$prefixes: (
'webkit', 'moz'
);
//prefix mixin
@mixin prefix($declarations: ()) {
@each $property, $value in $declarations {
@each $prefix in $prefixes {
#{'-' + $prefix + '-' + $property}: $value;
}
#{$property}: $value;
}
}
Usage for multiple declarations
@include prefix((animation-name:fadeInDown,animation-duration: 1s));
Usage for single declaration
@include prefix((animation-name:fadeInDown));