210 votes

Création d'un mixin Sass avec des arguments facultatifs

J'écris un mixin comme ceci :

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

Quand on m'appelle, ce que je veux vraiment, c'est que si aucun $inset est passée, rien n'est produit, plutôt que de compiler quelque chose comme ceci :

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

Comment réécrire le mixin pour que s'il n'y a pas de valeur de $inset passé, rien n'est sorti ?

6 votes

Il est dommage que SASS ne dispose pas d'une fonction blank o nil valeur.

1 votes

Entre-temps, en examinant une autre limitation de SASS, j'ai trouvé un moyen efficace de se débarrasser des guillemets dans ces situations. J'ai ajouté une réponse à ce sujet.

7 votes

Maintenant, en 2015, vous pouvez simplement utiliser null afin de sauter les attr/prop. ie @include box-shadow($top, $left, $blur, $color, null)

267voto

Josh Pinter Points 3814

Une manière DRY'r de le faire

Et, en général, une astuce pour enlever les guillemets.

@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+, vous pouvez utiliser 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);
} 

J'ai trouvé ça ici : passer une liste à un mixin comme un seul argument avec SASS

6 votes

Comme le souligne Bob Sammers, dans les versions plus récentes de SASS, vous pouvez également utiliser la méthode unquote() au lieu de #{} pour supprimer les guillemets. Merci.

4 votes

Le moyen le plus simple est d'utiliser null pour la valeur par défaut des paramètres facultatifs au lieu de "" et ils ne seront pas rendus en sortie ! @mixin box-shadow($top, $left,... , $inset:null) {}

0 votes

@S.Serpooshan Je suis curieux de savoir dans quelle version cela a été ajouté. Ce n'était certainement pas pris en charge en 2012.

49voto

Andrew Vit Points 10630

Sass prend en charge @if déclarations. (Voir le documentation .)

Vous pourriez écrire votre mixin comme ceci :

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

0 votes

Cela n'est pas utile ici, seul le inset doit être exclue lorsqu'elle est nulle, toutes les propriétés box-shadow ne sont pas concernées.

0 votes

@S.Serpooshan Il suffit d'ajouter une else et inclure toutes les propriétés non-inset à l'intérieur.

0 votes

@mbomb007 je sais, je viens de signaler un problème avec cette solution. Et les autres réponses fournies ci-dessus sont absolument meilleures.

14voto

Bob Sammers Points 656

Vieille question, je sais, mais je pense qu'elle est toujours pertinente. On peut dire qu'une façon plus claire de procéder consiste à utiliser la fonction unquote() (dont SASS dispose depuis la version 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);
}

C'est à peu près équivalent à la réponse de Josh, mais je pense que la fonction explicitement nommée est moins obscure que la syntaxe d'interpolation de chaîne.

13voto

Drops Points 114

Je sais que ce n'est pas exactement la réponse que tu cherchais mais tu pourrais passer "null" comme dernier argument lorsque @include box-shadow comme ceci @include box-shadow(12px, 14px, 2px, green, null); Maintenant, si cet argument n'est qu'un seul dans cette propriété, alors cette propriété (et sa valeur (par défaut)) ne sera pas compilée. S'il y a deux args ou plus sur cette "ligne", seuls ceux que vous avez annulés ne seront pas compilés (votre cas).

La sortie CSS est exactement comme vous le vouliez, mais vous devez écrire votre 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;

1 votes

Définitivement ma façon préférée de faire cela permet de garder tout simple à lire et à comprendre pour quand vous devez revenir à un script. thnx Drops.

2voto

Adam C Points 1797
@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;
    }
}

0 votes

Cette réponse est sans doute pire que toutes les autres, en raison de sa verbosité. De plus, elle est assez proche de une des autres réponses pour compter comme un doublon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X