使用可选参数制作Sass mixin

时间:2010-08-19 18:29:42

标签: sass

我正在写一个这样的混音:

@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的值时,不输出任何内容?

12 个答案:

答案 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};
}

SASS版本3+,您可以使用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)

更好的DRY方式

$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);
}
  • 更喜欢将属性值作为原生css传递以保持接近“舌头”
  • 允许传递可变数量的参数
  • 定义懒惰的默认值

答案 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)

甚至是DRYer方式!

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