オプションの引数でSassミックスインを作成する


201

私はこのようなミックスインを書いています:

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

$inset渡された値がない場合に何も出力されないように、ミックスインをどのように書き換えますか


6
SASSにblankor nil値がないのは残念です。
Joshua Pinter

1
ところで、別のSASSの制限を検討しているときに、私はこれらの状況で引用符を取り除くための素晴らしい方法に出くわしました。答えを追加しました。
Joshua Pinter

4
2015年にはnull、attr / propをスキップするためだけに使用できます。ie @include box-shadow($top, $left, $blur, $color, null)
ドロップ

回答:


257

より乾燥した方法

そして、一般的に、引用符を削除するための巧妙なトリック。

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

これをここで拾った:SASSで単一の引数としてリストをミックスインに渡す


6
Bob Sammersが指摘するように、SASSの新しいバージョンでは、#{}の代わりにunquote()メソッドを使用して引用符を削除することもできます。乾杯。
ジョシュア・ピンター2013

4
最も簡単な方法は、のnull代わりにオプションのパラメーターのデフォルト値を使用することで""あり、それらは出力にレンダリングされません!@mixin box-shadow($top, $left,... , $inset:null) {}
S.Serpooshan 2018年

S.Serpooshan @私はこれがで追加されたどのバージョン興味これは確かに2012年に戻ってサポートされませんでした。
ジョシュア・ピンターを

79

とても良いDRY方法

に渡す$args...こと@mixinです。そう$argsすれば、いくつパスしても問題ありません。@input呼び出し、あなたが必要なすべての引数を渡すことができます。そのようです:

@mixin box-shadow($args...) {
  -webkit-box-shadow: $args;
  -moz-box-shadow: $args;
  box-shadow: $args;
}

そして、必要なすべての引数を渡すことで、必要なすべてのクラスでボックスシャドウを再利用できます。

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

11
知るには良いが、しばしばそれは何の引数を示すために、より明確だとmixin同様、期待している$top$left$blurあなたが示されているようなど、可変引数を、けれども、究極の柔軟性のために最適です。
Joshua Pinter

1
おかげで、それは私に大いに役立ちます
Nilesh Sutar 2018

48

Sassは@ifステートメントをサポートしています。(ドキュメントを参照してください。)

あなたはあなたのミックスインを次のように書くことができます:

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

これはここでは役に立ちinsetません。すべてがボックスシャドウプロパティではなく、nullの場合に除外する必要があるのはパーツのみです
S.Serpooshan

@ S.Serpooshanを追加して、else内部にすべての非インセットプロパティを含めます。
mbomb007 2018

@ mbomb007わかっています。このソリューションの問題を報告します。そして、上記で提供された他の答えは絶対に優れています。
S.Serpooshan 2018

26

デフォルト値として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;
}

つまり、次のようにincludeステートメントを記述できます。

@include box-shadow($top, $left, $blur, $color);

このように書く代わりに。

@include box-shadow($top, $left, $blur, $color, null);

ここの答えに示されているように


1
この回答は、既存の回答(stackoverflow.com/a/23565388/1652962を参照)より新しいものはありません
cimmanon

9
@cimmanon逆に、これは、の@include box-shadow($top, $left, $blur, $color);代わりにインポートを記述できるため、追加のユーティリティを提供します@include box-shadow($top, $left, $blur, $color, null);。したがって、この答えははるかに有益です。
Dan

1
@Dan実際、そのようにすると読みやすさが失われるため、間違いなく、それが導出された答えよりも有益性が低くなります。
TylerH 2017年

@TylerHそれは本当です
Dan

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

これはジョシュの答えとほぼ同じですが、明示的に指定された関数は文字列補間構文よりも難読化されていないと思います。


12

あなたが探していた答えは正確にはわかりませんが、このよう"null"@include box-shadowミックスインするときに最後の引数として渡すことができます@include box-shadow(12px, 14px, 2px, green, null);ます。その「行」に2つ以上の引数がある場合、nullにしたものだけがコンパイルされません(あなたの場合)。

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;

1
間違いなく私のお気に入りの方法は、スクリプトに戻る必要がある場合に備えて、すべてを読みやすく理解しやすいものにします。thnxドロップ。
Plentybinary 2015年

7

ここに私が使用する解決策がありますが、以下のメモがあります:

@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として渡し、「舌」の近くに留まることを好む
  • 可変数の引数を渡すことができます
  • 遅延のデフォルト値を定義する

これはどのように既存の回答(つまり:stackoverflow.com/a/28072864/1652962)に何かを追加しますか?
cimmanon

彼は、関数に複数の引数が渡されたかどうかを確認する方法を説明し、渡された場合は出力を変更しました。他の答えはしませんでした。
TetraDev 2015年

時には、グローバルな振る舞いを定義したい場合があります。たとえば、一般的に非常に統一されたエクスペリエンスを望み、何をすべきかを決定する際に「クリエイティブな開発者の裁量」の危険を冒したくないアニメーション遷移。これは、オーバーライドできるデフォルトを定義しますが、引数を渡さない場合の構文がよりコンパクトであるため、多くの場合、デフォルトではありません。この方法で、グローバルな動作を1か所で変更することもできます。
duggi 2015年

3

sass@3.4.9の場合:

// declare
@mixin button( $bgcolor:blue ){
    background:$bgcolor;
}

値なしで使用すると、ボタンは青になります

//use
.my_button{
    @include button();
}

値がある場合、ボタンは赤になります

//use
.my_button{
    @include button( red );
}

ヘキサでも動作します


これはどのように既存の回答に何か追加されますか?
cimmanon

3

より乾燥した方法でも!

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

これだけ読みやすく、私も認めますが、これはDRYコードと読みやすさ/保守性の間に線を引く必要がある場所です。
レオナポレオン

読みやすさや保守性を高めるために、他のミックスインで再利用するための「ブラウザリスト」を作成することに同意します。これは、ドライミックスインのセットで実行できる他のcssプロパティに簡単にアセンブルすることもできます。2014年のこの記事は、まだ良い例です。
ベンカルスキー

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

これは冗長であるため、他のすべての回答よりも間違いなく劣っています。また、他の回答の1つに十分に近く、重複として数えます。
cimmanon 2014

1

超簡単な方法

none$ insetにデフォルト値を追加するだけです-そう

@mixin box-shadow($top, $left, $blur, $color, $inset: none) { ....

$ insetが渡されない場合、何も表示されなくなります。


1

オプションの引数にはいつでも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;
}

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

これはどのように既存の回答に何か追加されますか?
cimmanon 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.