我正在写一个这样的混音:
@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
-webkit-box-shadow: $top $left $blur $color $inset;
-moz-box-shadow: $top $left $blur $color $inset;
box-shadow: $top $left $blur $color $inset;
}
当调用我真正想要的是,如果没有传递$inset
值,则不输出任何内容,而不是编译为这样的内容:
-webkit-box-shadow: 2px 2px 5px #555555 "";
-moz-box-shadow: 2px 2px 5px #555555 "";
box-shadow: 2px 2px 5px #555555 "";
如何重写mixin,以便在没有传递$inset
的值时,不输出任何内容?
答案 0 :(得分:240)
通常,删除引号的巧妙技巧。
@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
-webkit-box-shadow: $top $left $blur $color #{$inset};
-moz-box-shadow: $top $left $blur $color #{$inset};
box-shadow: $top $left $blur $color #{$inset};
}
unquote()
:@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
-webkit-box-shadow: $top $left $blur $color unquote($inset);
-moz-box-shadow: $top $left $blur $color unquote($inset);
box-shadow: $top $left $blur $color unquote($inset);
}
在此处选择了这个:pass a list to a mixin as a single argument with SASS
答案 1 :(得分:72)
将$args...
传递给@mixin
。
这样,无论你将通过多少$args
。
在@input
调用中,您可以传递所需的所有参数。
像这样:
@mixin box-shadow($args...) {
-webkit-box-shadow: $args;
-moz-box-shadow: $args;
box-shadow: $args;
}
现在你可以通过传递所有需要的args来重复你想要的每个类中的盒子阴影:
.my-box-shadow {
@include box-shadow(2px 2px 5px #555, inset 0 0 0);
}
答案 2 :(得分:45)
Sass支持@if
语句。 (参见documentation。)
你可以这样写你的mixin:
@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
@if $inset != "" {
-webkit-box-shadow:$top $left $blur $color $inset;
-moz-box-shadow:$top $left $blur $color $inset;
box-shadow:$top $left $blur $color $inset;
}
}
答案 3 :(得分:14)
老问题,我知道,但我认为这仍然是相关的。可以说,更明确的方法是使用unquote()函数(SASS从版本3.0.0开始就有):
@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
-webkit-box-shadow: $top $left $blur $color unquote($inset);
-moz-box-shadow: $top $left $blur $color unquote($inset);
box-shadow: $top $left $blur $color unquote($inset);
}
这大致相当于Josh的答案,但我认为明确命名的函数比字符串插值语法更少混淆。
答案 4 :(得分:12)
我知道它不是你要搜索的答案,但你可以在"null"
mixin时传递@include box-shadow
作为最后一个参数,就像这样@include box-shadow(12px, 14px, 2px, green, null);
现在,如果那个参数只有一个该属性比该属性(及其(默认)值)不会被编译。如果在该“行”上有两个或更多个args,那么只有那些你无法编译的args(你的情况)。
CSS输出完全符合您的要求,但您必须编写null
s:)
@include box-shadow(12px, 14px, 2px, green, null);
// compiles to ...
-webkit-box-shadow: 12px 14px 2px green;
-moz-box-shadow: 12px 14px 2px green;
box-shadow: 12px 14px 2px green;
答案 5 :(得分:6)
这是我使用的解决方案,附注如下:
@mixin transition($trans...) {
@if length($trans) < 1 {
$trans: all .15s ease-out;
}
-moz-transition: $trans;
-ms-transition: $trans;
-webkit-transition: $trans;
transition: $trans;
}
.use-this {
@include transition;
}
.use-this-2 {
@include transition(all 1s ease-out, color 2s ease-in);
}
答案 6 :(得分:3)
使用sass@3.4.9:
// declare
@mixin button( $bgcolor:blue ){
background:$bgcolor;
}
并且无值使用,按钮将为蓝色
//use
.my_button{
@include button();
}
并且带有值,按钮将为红色
//use
.my_button{
@include button( red );
}
也适用于hexa
答案 7 :(得分:3)
@mixin box-shadow($args...) {
@each $pre in -webkit-, -moz-, -ms-, -o- {
#{$pre + box-shadow}: $args;
}
#{box-shadow}: #{$args};
}
现在你可以更聪明地重复使用盒子阴影了:
.myShadow {
@include box-shadow(2px 2px 5px #555, inset 0 0 0);
}
答案 8 :(得分:1)
@mixin box-shadow($left: 0, $top: 0, $blur: 6px, $color: hsla(0,0%,0%,0.25), $inset: false) {
@if $inset {
-webkit-box-shadow: inset $left $top $blur $color;
-moz-box-shadow: inset $left $top $blur $color;
box-shadow: inset $left $top $blur $color;
} @else {
-webkit-box-shadow: $left $top $blur $color;
-moz-box-shadow: $left $top $blur $color;
box-shadow: $left $top $blur $color;
}
}
答案 9 :(得分:1)
只需在$ inset中添加默认值none
-
@mixin box-shadow($top, $left, $blur, $color, $inset: none) { ....
现在,当没有传递$ inset时,将不会显示任何内容。
答案 10 :(得分:0)
我是css编译器的新手,希望这有帮助,
@mixin positionStyle($params...){
$temp:nth($params,1);
@if $temp != null{
position:$temp;
}
$temp:nth($params,2);
@if $temp != null{
top:$temp;
}
$temp:nth($params,3);
@if $temp != null{
right:$temp;
}
$temp:nth($params,4);
@if $temp != null{
bottom:$temp;
}
$temp:nth($params,5);
@if $temp != null{
left:$temp;
}
.someClass{
@include positionStyle(absolute,30px,5px,null,null);
}
//output
.someClass{
position:absolute;
top: 30px;
right: 5px;
}
答案 11 :(得分:0)
您始终可以将null分配给可选参数。这是一个简单的解决方法
@mixin box-shadow($top, $left, $blur, $color, $inset:null) { //assigning null to inset value makes it optional
-webkit-box-shadow: $top $left $blur $color $inset;
-moz-box-shadow: $top $left $blur $color $inset;
box-shadow: $top $left $blur $color $inset;
}