23

box-shadow プロパティの Sass mixin を作成したいのですが、問題が発生しています。既存のコードの一部は次のようになります。

#someDiv {
  -moz-box-shadow:0 0 5px rgba(0,0,0,.25);
}

#someOtherDiv {
  -moz-box-shadow:0 0 5px rgba(0,0,0,.25) inset;
}

#theLastDiv {
  -moz-box-shadow: 0 0 5px rgba(0,0,0,.25), 0 1px 0 rgba(255,255,255,.2) inset;
}

これらすべてを 1 つの mixin にまとめようとすると、問題が生じます。ミックスイン内でロジックを使用するためのドキュメントはかなりまばらです。

次の行に沿ってミックスインを作成したいと思います。

@mixin boxShadow($xOffSet, $yOffSet, $blur, $red, $green, $blue, $opacity, $inset : false) {
  @if $inset == true {
    -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue) inset;
  } @else {
    -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue);
  }
}

Sass は $inset 変数を評価できないと思われるため、これはエラーをスローしています。

前の例は、ボックス シャドウが挿入されているかどうかに関して私が抱えている問題を示しているだけです。私が抱えているもう 1 つの問題は、1 つの要素で複数のボックス シャドウが宣言されている場合です。参考までに、上記の #theLastDiv を参照してください。

@mixin boxShadow($declarations : 2, $xOffSet1, $yOffSet1, $blur1, $red1, $green1, $blue1, $opacity1 $xOffSet2, $yOffSet2, $blur2, $red2, $green2, $blue2, $opacity2) {
  @if $declarations == 1 {
    -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue);
  } @else if $declarations == 2 {
    -moz-box-shadow: #{$xOffSet1}px #{$yOffSet1}px #{$blur1}px rgba($red1,$green1,$blue1), #{$xOffSet2}px #{$yOffSet2}px #{$blur2}px rgba($red2,$green2,$blue2);
  }

要素に 1 つのボックス シャドウがある場合と、ボックス シャドウを分離する必要がある場合があります。Sass にはこのロジックを解読する機能がなく、これを達成するには別の Mixin (1 つのボックス シャドウを持つ要素用に 1 つ、2 つのボックス シャドウを持つ mixin 用に 1 つ) が必要であると誤解していますか?

問題を複雑にするために、上記の不透明度の問題はどのようにこれに影響を与えるのでしょうか? これについてフィードバックをいただければ幸いです。私が間違っているか、問題についての私の考え方に一般的な欠陥があるかどうか教えてください。ありがとう!

4

6 に答える 6

24

次のような可変引数を使用できます。

// Box shadows
@mixin box-shadow($shadow...) {
  -webkit-box-shadow: $shadow;
     -moz-box-shadow: $shadow;       
          box-shadow: $shadow;
}

これにより、渡された引数にコンマを含めることができます。必要なすべての影を渡すことができます。

それを使用した例:

@include box-shadow(2px 2px 2px rgba(#ccc, .8), -2px -2px 2px rgba(#ccc, 0.8)) ;

次のように色変数を渡します。

$shadow-color: red;  // could also be a #F9F8F6 type color
@include box-shadow(0 2px 2px rgba($shadow-color, .9));

アップデート

$shadow-color: red;  // could also be a hex (like #F9F8F6) type color
@include box-shadow(0 2px 2px rgba($shadow-color, .9));

前に変数の数を許可する省略記号 (つまり、splats) を使用した引数を見たことがない場合は、次のリンクを確認してください: http://sass-lang.com/documentation/file.SASS_CHANGELOG.html#variable_keyword_arguments

于 2012-10-24T05:50:39.120 に答える
18

0 0 1px rgba(0, 0, 0, .5)コンマを使用するよりも、コンマを使用せずに基本的な CSS パラメータを維持することを好みます: 0, 0, 5, 0, 0, 0, .25

これが私の解決策です:

@mixin box-shadow($shadow1, $shadow2:false, $shadow3:false, $shadow4:false, $shadow5:false) {
 $params: $shadow1;
  @if $shadow2 
    { $params: $shadow1, $shadow2; }
    @if $shadow3 != false
      { $params: $shadow1, $shadow2, $shadow3; }
      @if $shadow4 != false
        { $params: $shadow1, $shadow2, $shadow3, $shadow4; }
        @if $shadow5 != false
          { $params: $shadow1, $shadow2, $shadow3, $shadow4, $shadow5; }

  -webkit-box-shadow: $params;
     -moz-box-shadow: $params;
          box-shadow: $params;

}

@include box-shadow(-1px -1px 2px rgba(0, 0, 0, .05), 0 1px 1px white inset), ...
于 2011-07-22T03:24:55.610 に答える
5

コレクションを使用して、パラメーターを 1 つだけ持つことができます。

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

$shadows: 0px 0px 5px rgba(0, 0, 0, 0.25), 0px 1px 0px #000 inset;

.myclass { 
   @include box-shadow($shadows);
}
于 2012-08-19T21:27:07.620 に答える
4

あなたが説明したケースを処理するために、少しロジックを追加しました。ミックスインは次のとおりです。

@mixin boxShadow($xOffSet, $yOffSet, $blur, $red, $green, $blue, $opacity, $inset : false, $two : false, $xOffSet2 : 0, $yOffSet2 : 0, $blur2 : 0, $red2 : 0, $green2 : 0, $blue2 : 0, $opacity2 : 0, $inset2 : false) {
  @if $inset {
    @if $two {
        @if $inset2 {
            -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue, $opacity) inset, #{$xOffSet2}px #{$yOffSet2}px #{$blur2}px rgba($red2,$green2,$blue2, $opacity2) inset;
        } @else {
            -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue, $opacity) inset, #{$xOffSet2}px #{$yOffSet2}px #{$blur2}px rgba($red2,$green2,$blue2, $opacity2);
        }
    } @else {
        -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue, $opacity) inset;
    }
  } @else {
    @if $two {
        @if $inset2 {
            -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue, $opacity), #{$xOffSet2}px #{$yOffSet2}px #{$blur2}px rgba($red2,$green2,$blue2, $opacity2) inset;
        } @else {
            -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue, $opacity), #{$xOffSet2}px #{$yOffSet2}px #{$blur2}px rgba($red2,$green2,$blue2, $opacity2);
        }
    } @else {
        -moz-box-shadow: #{$xOffSet}px #{$yOffSet}px #{$blur}px rgba($red,$green,$blue, $opacity);
    }
  }
}

mixin は 17 個のパラメーターを取ります。数が多くて申し訳ありませんが、SASS は配列やオブジェクトを処理しません。いずれにせよ、10 個はオプションです。彼らです:

  1. $xOffSet - 最初の影の x オフセット
  2. $yOffSet - 2 番目の影の y オフセット
  3. $blur - 最初の影のぼかし
  4. $red - 最初の影の赤の値
  5. $blue - 最初の影の青の値
  6. $green - 最初の影の緑の値
  7. $opacity - 最初の影の不透明度
  8. $inset (オプション) - True または False。最初の影を挿入する必要があるかどうかを示します (デフォルトは false)
  9. $two (オプション) - True または False - 2 つの境界線を定義する場合は True (デフォルトは false)
  10. $xOffSet2 (オプション) - 2 番目の影の x オフセット
  11. $yOffSet2 (オプション) - 2 番目の影の y オフセット
  12. $blur2 (オプション) - 2 番目の影のぼかし
  13. $red2 (オプション)- 2 番目の影の赤の値
  14. $blue2 (オプション) - 2 番目の影の青の値
  15. $green2 (オプション) - 2 番目の影の緑の値
  16. $opacity2 (オプション) - 2 番目の影の不透明度
  17. $inset2 (オプション) - 真または偽。2 番目の影を挿入する必要があるかどうかを示します (デフォルトは false)。

次のようにスタイルを設定できます。

#someDiv {
    @include boxShadow(0, 0, 5, 0, 0, 0, .25);
}
#someOtherDiv {
    @include boxShadow(0, 0, 5, 0, 0, 0, .25, true);
}

#theLastDiv {
    @include boxShadow(0, 0, 5, 0, 0, 0, .25, false, true, 0, 1, 0, 255, 255, 255, .2, true);
}

次の CSS を生成します。

/* line 9, ../src/screen.scss */
#someDiv {
  -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.25);
}

/* line 12, ../src/screen.scss */
#someOtherDiv {
  -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.25) inset;
}

/* line 16, ../src/screen.scss */
#theLastDiv {
  -moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.25), 0px 1px 0px rgba(255, 255, 255, 0.2) inset;
}
于 2011-03-24T20:54:00.417 に答える
0

コンパスコードは勉強する価値があるかもしれません:

ただし、サーバー側のヘルパーも使用しているようです。

@mixin box-shadow(
  $shadow-1 : default,
  $shadow-2 : false,
  $shadow-3 : false,
  $shadow-4 : false,
  $shadow-5 : false,
  $shadow-6 : false,
  $shadow-7 : false,
  $shadow-8 : false,
  $shadow-9 : false,
  $shadow-10: false
) {
  @if $shadow-1 == default {
    $shadow-1 : -compass-space-list(compact(if($default-box-shadow-inset, inset, false), $default-box-shadow-h-offset, $default-box-shadow-v-offset, $default-box-shadow-blur, $default-box-shadow-spread, $default-box-shadow-color));
  }
  $shadow : compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10);
  @include experimental(box-shadow, $shadow,
    -moz, -webkit, not -o, not -ms, not -khtml, official
  );
}
于 2013-01-01T08:20:39.747 に答える