Search code examples
sass

Making a Sass mixin with optional arguments


I am writing a mixin like this:

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

When called what I really want is that if no $inset value is passed, nothing is output, rather than it compiling to something like this:

-webkit-box-shadow: 2px 2px 5px #555555 "";
-moz-box-shadow: 2px 2px 5px #555555 "";
box-shadow: 2px 2px 5px #555555 "";

How do I rewrite the mixin so that if there is no value of $inset passed, nothing is output?


Solution

  • A DRY'r Way of Doing It

    And, generally, a neat trick to remove the quotes.

    @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 Version 3+, you can use 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);
    } 
    

    Picked this up over here: pass a list to a mixin as a single argument with SASS