我写的mixin是这样的:

@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传递的值,没有输出?


当前回答

更干燥的方式!

@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);
}

其他回答

以下是我使用的解决方案,附注如下:

@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);
}

更喜欢将属性值作为原生CSS传递,以接近“舌头” 允许传递可变数量的参数 为惰性定义一个默认值

Sass支持@if语句。(请参考文档)

你可以这样写你的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;
  }
}

你总是可以把空赋给你的可选参数。这里有一个简单的解决方法

@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;
}

老问题了,我知道,但我认为这仍然是相关的。可以说,更清晰的方法是使用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的回答,但我认为显式命名的函数比字符串插值语法更容易混淆。

我知道这不是你正在寻找的答案,但你可以通过“null”作为@include box-shadow mixin的最后一个参数,就像这个@include box-shadow(12px, 14px, 2px,绿色,null);现在,如果该参数在该属性中仅为1,那么该属性(及其(默认)值)将不会被编译。如果在“行”上有两个或更多的参数,只有你为空的参数不会被编译(你的情况)。

CSS输出完全是你想要的,但你必须写你的null:)

  @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;