Material Shadows Mixin

Avatar of Kitty Giraudel
Kitty Giraudel am

Material Design ist in letzter Zeit überall präsent. Ein Teil davon besteht darin, Schichten wie echte Papierbögen übereinander zu stapeln. Um einen solchen Effekt in CSS zu erzielen, müssen wir die Eigenschaft box-shadow verwenden.

Um zu vermeiden, dass die Schatten jedes Mal manuell geschrieben werden müssen, können wir dafür einen kleinen Sass-Mixin erstellen. Dieser Mixin gibt lediglich eine box-shadow-Deklaration aus, basierend auf der angegebenen $depth (von 0 bis 5). Schatten werden tatsächlich von zwei Funktionen berechnet: bottom-shadow und top-shadow.

/// Gives a card depth effect.
/// @param {Number} $depth - depth level (between 1 and 5)
/// @link http://www.google.com/design/spec/layout/layout-principles.html#layout-principles-dimensionality Google Design
/// @requires {function} top-shadow
/// @requires {function} bottom-shadow
@mixin card($depth) {
  @if $depth < 1 {
    box-shadow: none;
  } @else if $depth > 5 {
    @warn "Invalid $depth `#{$depth}` for mixin `card`.";
  } @else {
    box-shadow: bottom-shadow($depth), top-shadow($depth);  
  }
}

Vergessen wir nicht unsere beiden Funktionen

/// Computes a top-shadow for a card effect.
/// @param {Number} $depth - depth level
/// @return {List}
@function top-shadow($depth) {
  $primary-offset: nth(1.5 3 10 14 19, $depth) * 1px;
  $blur: nth(1.5 3 10 14 19, $depth) * 4px;
  $color: rgba(black, nth(.12 .16 .19 .25 .30, $depth));

  @return 0 $primary-offset $blur $color;
}

/// Computes a bottom-shadow for a card effect.
/// @param {Number} $depth - depth level
/// @return {List}
@function bottom-shadow($depth) {
  $primary-offset: nth(1.5 3 6 10 15, $depth) * 1px;
  $blur: nth(1 3 3 5 6, $depth) * 4px;
  $color: rgba(black, nth(.24 .23 .23 .22 .22, $depth));

  @return 0 $primary-offset $blur $color;
}