使用可选参数制作Sass mixin

Ric*_*haw 190 sass

我正在写一个这样的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;
}
Run Code Online (Sandbox Code Playgroud)

当调用我真正想要的是,如果没有$inset传递任何值,则不输出任何内容,而不是编译为这样的内容:

-webkit-box-shadow: 2px 2px 5px #555555 "";
-moz-box-shadow: 2px 2px 5px #555555 "";
box-shadow: 2px 2px 5px #555555 "";
Run Code Online (Sandbox Code Playgroud)

如何重写mixin以便如果没有$inset传递值,则不输出任何内容?

Jos*_*ter 249

干嘛的做法

而且,通常,删除引号的巧妙技巧.

@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};
}
Run Code Online (Sandbox Code Playgroud)

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);
} 
Run Code Online (Sandbox Code Playgroud)

在这里选择了这个:将一个列表传递给mixin作为SASS的单个参数

  • 正如Bob Sammers所指出的,在较新版本的SASS中,您还可以使用unquote()方法而不是#{}来删除引号.干杯. (6认同)
  • 最简单的方法是使用`null`作为可选参数的默认值而不是``"`,它们不会在输出中呈现!`@mixin box-shadow($ top,$ left,...,$ inset:null){}` (4认同)

小智 78

一个更好的DRY方式

是传递$args...@mixin.这样,无论$args你通过多少.在@input通话中,您可以传递所需的所有参数.像这样:

@mixin box-shadow($args...) {
  -webkit-box-shadow: $args;
  -moz-box-shadow: $args;
  box-shadow: $args;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过传递所有需要的args在您想要的每个类中重用您的box-shadow:

.my-box-shadow {
  @include box-shadow(2px 2px 5px #555, inset 0 0 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 这很好知道,但通常情况下更明确地指出`mixin`期望什么参数,比如`$ top`,`$ left`,`$ blur`等等.变量参数,就像你已经表明的那样,很棒但要获得最大的灵活性. (10认同)

And*_*Vit 47

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;
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 22

您可以将属性设置为null作为默认值,如果不传递参数,则不会解释该属性.

@mixin box-shadow($top, $left, $blur, $color, $inset:null) {
  -webkit-box-shadow: $top $left $blur $color $inset;
  -moz-box-shadow:    $top $left $blur $color $inset;
  box-shadow:         $top $left $blur $color $inset;
}
Run Code Online (Sandbox Code Playgroud)

这意味着您可以像这样编写include语句.

@include box-shadow($top, $left, $blur, $color);
Run Code Online (Sandbox Code Playgroud)

而不是像这样写.

@include box-shadow($top, $left, $blur, $color, null);
Run Code Online (Sandbox Code Playgroud)

这里的答案所示

  • @cimmanon相反,这提供了额外的实用程序,因为你可以将导入写为`@include box-shadow($ top,$ left,$ blur,$ color);`而不是`@include box-shadow($ top) ,$ left,$ blur,$ color,null);`.因此,这个答案更加有益. (8认同)

Bob*_*ers 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);
}
Run Code Online (Sandbox Code Playgroud)

这大致相当于Josh的答案,但我认为明确命名的函数比字符串插值语法更少混淆.


Dro*_*ops 12

我知道它不是你正在搜索的答案,但你可以"null"@include box-shadowmixin 时作为最后一个参数传递,就像这样@include box-shadow(12px, 14px, 2px, green, null);现在,如果该参数只是该属性中的一个而不是该属性(及其(默认)值)将不会被编译.如果该"行"上有两个或多个args,那么只有那些你无法编译的args(你的情况).

CSS输出完全符合您的要求,但您必须编写您的nulls :)

  @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;
Run Code Online (Sandbox Code Playgroud)


dug*_*ggi 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);
}
Run Code Online (Sandbox Code Playgroud)
  • 更喜欢将属性值作为本地css传递以保持接近"舌头"
  • 允许传递可变数量的参数
  • 定义懒惰的默认值


Ben*_*sky 6

甚至更干燥!

@mixin box-shadow($args...) {
  @each $pre in -webkit-, -moz-, -ms-, -o- {
    #{$pre + box-shadow}: $args;
  } 
  #{box-shadow}: #{$args};
}
Run Code Online (Sandbox Code Playgroud)

现在您可以更智能地重用您的盒子阴影:

.myShadow {
  @include box-shadow(2px 2px 5px #555, inset 0 0 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 只是一个注释 - 尽管这是可读的,但我确实承认,这是人们应该在 DRY 代码和*可读性/可维护性*之间划清界限的地方。 (2认同)