@IT に掲載されていた Compass/SASS を使ったミックスインの作成方法の記事をもとに、個人的に使いそうなことをカスタマイズしたりした際のメモ。
Sass と Compass がインストールされていることが前提。Compass を使用しないものもあるが、「@import “compass”;」が記述してあることが必要。インストールや設定に関しては「Sass/Compass のインストールと基本的な環境設定」を参照。
border とそれに対する box-shadow を使って背景に彫り込まれたように見える線を作成。
border :色は基本的に黒で透明度を指定する
例:border-bottom: 1px solid rgba(0, 0, 0, 0.3)
box-shadow :色は基本的に白で透明度を指定する。
例:box-shadow: #fff 0 1px 0;
以下は右上から左下に向かっての光源を想定した場合のミックスイン。
border を使っているので Box の各方向(top, right, bottom, left)に指定可能。(但し、同じ Box に全てを同時には指定できない。上書きされてしまうので。たぶん)
//背景に彫り込まれたように見える線 top @mixin line-top($black: .2, $white: .3, $border-width: 1px, $shadow-width: 1px, $darken-white: 0%){ border-top: $border-width solid rgba(0, 0, 0, $black); @include box-shadow(darken(rgba(255, 255, 255, $white), $darken-white) 0 $shadow-width 0 inset); } //背景に彫り込まれたように見える線 bottom @mixin line-bottom($black: .2, $white: .3, $border-width: 1px, $shadow-width: 1px, $darken-white: 0%){ border-bottom: $border-width solid rgba(0, 0, 0, $black); @include box-shadow(darken(rgba(255, 255, 255, $white), $darken-white) 0 $shadow-width 0); } //背景に彫り込まれたように見える線 left @mixin line-left($black: .2, $white: .3, $border-width: 1px, $shadow-width: 1px, $darken-white: 0%){ border-left: $border-width solid rgba(0, 0, 0, $black); @include box-shadow (darken(rgba(255, 255, 255, $white), $darken-white) -#{$shadow-width} 0 0); } //背景に彫り込まれたように見える線 right @mixin line-right($black: .2, $white: .3, $border-width: 1px, $shadow-width: 1px, $darken-white: 0%){ border-right: $border-width solid rgba(0, 0, 0, $black); @include box-shadow(darken(rgba(255, 255, 255, $white), $darken-white) -#{$shadow-width} 0 0 inset); }
使い方:box などに以下のような指定するだけで線が書ける。
.foo { @include line-bottom($black: .2, $white: .7); } //コンパイル後 .foo { border-bottom: 1px solid rgba(0, 0, 0, 0.2); -webkit-box-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; -moz-box-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; box-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; }
@include line-bottom($black: .3, $white: 1, $darken-white: 14%);を指定した場合の線
@include line-bottom($black: .3, $white: .9, $shadow-width: 2px, $darken-white: 20%); を指定した場合の線
さりげない box-shadow を使い border を使うよりも柔らかく表現する。
@mixin box-shadow-border($shadow: 0.15, $blur:2px){ @include box-shadow(0 0 $blur rgba(0, 0, 0, $shadow) ); }
使用例(角丸を追加)
.bs_border { @include box-shadow-border($shadow: 0.5, $blur:1px); @include border-radius(4px); } //コンパイル後 .bs_border { -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.5); -moz-box-shadow: 0 0 1px rgba(0, 0, 0, 0.5); box-shadow: 0 0 1px rgba(0, 0, 0, 0.5); -webkit-border-radius: 4px; -moz-border-radius: 4px; -ms-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; }
内側に向かってぼかしの長い box-shadow を入れることで質感を出す。
@mixin box-shadow-border-inset($shadow: .2, $blur: 10px){ @include box-shadow(0 0 $blur rgba(0, 0, 0, $shadow) inset); }
使用例(角丸を追加)
.inset_border { @include box-shadow-border-inset($shadow: .3, $blur: 20px); @include border-radius(4px); } //コンパイル後 .inset_border { -webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.3) inset; -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.3) inset; box-shadow: 0 0 20px rgba(0, 0, 0, 0.3) inset; -webkit-border-radius: 4px; -moz-border-radius: 4px; -ms-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; }
内側に影を付けて、浅いへこみのあるボックスを表現。
この例では、右上からの光源を想定
@mixin deboss-box($border: .1, $shadow: .05, $highlight: .8) { border: 1px solid rgba(0,0,0,$border); @include box-shadow(rgba(0,0,0,$shadow) -1px 1px 2px inset, rgba(255,255,255,$highlight) -1px 1px 0); }
使用例
.deboss { @include deboss-box($border: .1, $shadow: .05, $highlight: .8); } //コンパイル後 .deboss { border: 1px solid rgba(0, 0, 0, 0.1); -webkit-box-shadow: rgba(0, 0, 0, 0.05) -1px 1px 2px inset, rgba(255, 255, 255, 0.8) -1px 1px 0; -moz-box-shadow: rgba(0, 0, 0, 0.05) -1px 1px 2px inset, rgba(255, 255, 255, 0.8) -1px 1px 0; box-shadow: rgba(0, 0, 0, 0.05) -1px 1px 2px inset, rgba(255, 255, 255, 0.8) -1px 1px 0; }
このサンプルの場合、背景がかなり明るいので「さりげなさ過ぎて」ほとんど効果がわからない(いろいろ値を変更してみたが、うまくいかなかった)。もう少し暗い背景だと効果がよくわかるが。
これを少し変更すると、線の部分のみがへこんでいるように見える枠線が作成できる。以下は薄い背景色の場合の例。
@mixin deboss_border($border: .1, $highlight1: .8, $highlight2: .8) { border: 1px solid rgba(0,0,0,$border); @include box-shadow(rgba(255,255,255,$highlight1) -1px 1px 1px inset, rgba(255,255,255,$highlight2) -1px 1px 0); } .test_deboss_border { @include deboss_border($border: .08); } //コンパイル後 .test_deboss_border { border: 1px solid rgba(0, 0, 0, 0.08); -webkit-box-shadow: rgba(255, 255, 255, 0.8) -1px 1px 1px inset, rgba(255, 255, 255, 0.8) -1px 1px 0; -moz-box-shadow: rgba(255, 255, 255, 0.8) -1px 1px 1px inset, rgba(255, 255, 255, 0.8) -1px 1px 0; box-shadow: rgba(255, 255, 255, 0.8) -1px 1px 1px inset, rgba(255, 255, 255, 0.8) -1px 1px 0; }
もう少しあからさまに凹みを表現する場合の例。
@mixin deboss-box-deep($background: 0.02, $depth: 1px, $shadow: 0.3, $highlight:0.3) { background:rgba(0, 0, 0, $background); @include box-shadow(rgba(0,0,0,$shadow) 1px 1px $depth inset, -1px 0 $depth rgba(0, 0, 0, $shadow) inset,rgba(255,255,255,$highlight) 0 -1px $depth inset); }
$background: 背景を少し暗くするための値(不要であれば 0 を指定)
$depth: 凹みの深さ
$shadow: 影の値(透明度)
$highlight:ハイライトの値(透明度)
使用例
.deboss_deep { @include deboss-box-deep($background: 0.01, $shadow: 0.2, $highlight: 0.1); } //コンパイル後 .deboss_deep { background: rgba(0, 0, 0, 0.01); -webkit-box-shadow: rgba(0, 0, 0, 0.2) 1px 1px 1px inset, -1px 0 1px rgba(0, 0, 0, 0.2) inset, rgba(255, 255, 255, 0.1) 0 -1px 1px inset; -moz-box-shadow: rgba(0, 0, 0, 0.2) 1px 1px 1px inset, -1px 0 1px rgba(0, 0, 0, 0.2) inset, rgba(255, 255, 255, 0.1) 0 -1px 1px inset; box-shadow: rgba(0, 0, 0, 0.2) 1px 1px 1px inset, -1px 0 1px rgba(0, 0, 0, 0.2) inset, rgba(255, 255, 255, 0.1) 0 -1px 1px inset; }
少し飛び出たボックスをシャドウとハイライトで表現
この例では右上からの光源を想定
@mixin emboss-box($border: .1, $shadow: .05, $highlight: .5) { border: 1px solid rgba(0, 0, 0, $border); @include box-shadow(rgba(0, 0, 0, $shadow) -1px 1px 0, rgba(255, 255, 255, $highlight) -1px 1px 0 inset); }
使用例
.emboss { @include emboss-box($border: .1, $shadow: .03, $highlight: .5); } //コンパイル後 .emboss { border: 1px solid rgba(0, 0, 0, 0.1); -webkit-box-shadow: rgba(0, 0, 0, 0.03) -1px 1px 0, rgba(255, 255, 255, 0.5) -1px 1px 0 inset; -moz-box-shadow: rgba(0, 0, 0, 0.03) -1px 1px 0, rgba(255, 255, 255, 0.5) -1px 1px 0 inset; box-shadow: rgba(0, 0, 0, 0.03) -1px 1px 0, rgba(255, 255, 255, 0.5) -1px 1px 0 inset; }
もう少しあからさまに飛び出させたボックスの例。
@mixin emboss-box-high($depth: 1px, $shadow: .3, $highlight: .3) { @include box-shadow(rgba(0, 0, 0, $shadow) 1px 1px $depth, -1px 0 $depth rgba(0, 0, 0, $shadow), rgba(255, 255, 255, $highlight) 0 -1px $depth ); }
$depth: 凸の高さ(英語がおかしいけど)
$shadow: 影の値(透明度)
$highlight:ハイライトの値(透明度)
使用例
.emboss_high { @include emboss-box-high(); } //コンパイル後 .emboss_high { -webkit-box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px, -1px 0 1px rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3) 0 -1px 1px; -moz-box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px, -1px 0 1px rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3) 0 -1px 1px; box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px, -1px 0 1px rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3) 0 -1px 1px; }
参考にさせていただいたサイト:ズルいデザイン(3)/ @IT
クリックすると凹むボタンの例。前述のあからさまに凹んだボックスとあからさまに飛び出させたボックスを利用。(ボタンの設定については「ボタン」参照)
@mixin emboss-deboss-button($color: #f8f8f8, $font-size: 16px, $text-color: #666, $border-radius: 4px, $depth: 1px, $shadow: .3, $highlight: .3) { display: inline-block; background-origin: border-box; position: relative; cursor: pointer; text-align: center; font-size: $font-size; background: $color; padding: 0 ($font-size * 2); height: $font-size * 3; line-height: $font-size * 3; color: $text-color; @include border-radius($border-radius); @include box-shadow(rgba(0, 0, 0, $shadow) 1px 1px $depth, -1px 0 $depth rgba(0, 0, 0, $shadow), rgba(255, 255, 255, $highlight) 0 -1px $depth ); &:active { background: adjust-lightness($color, -3%); color: lighten($text-color, 5%); @include box-shadow(rgba(0,0,0,$shadow) 1px 1px $depth inset, -1px 0 $depth rgba(0, 0, 0, $shadow) inset,rgba(255,255,255,$highlight) 0 -1px $depth inset); } }
使用例
.emboss-deboss-button { @include emboss-deboss-button(); } //コンパイル後 .emboss-deboss-button { display: inline-block; background-origin: border-box; position: relative; cursor: pointer; text-align: center; font-size: 16px; background: #f8f8f8; padding: 0 32px; height: 48px; line-height: 48px; color: #666666; -webkit-border-radius: 4px; -moz-border-radius: 4px; -ms-border-radius: 4px; -o-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px, -1px 0 1px rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3) 0 -1px 1px; -moz-box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px, -1px 0 1px rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3) 0 -1px 1px; box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px, -1px 0 1px rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.3) 0 -1px 1px; } .emboss-deboss-button:active { background: #f0f0f0; color: #737373; -webkit-box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px inset, -1px 0 1px rgba(0, 0, 0, 0.3) inset, rgba(255, 255, 255, 0.3) 0 -1px 1px inset; -moz-box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px inset, -1px 0 1px rgba(0, 0, 0, 0.3) inset, rgba(255, 255, 255, 0.3) 0 -1px 1px inset; box-shadow: rgba(0, 0, 0, 0.3) 1px 1px 1px inset, -1px 0 1px rgba(0, 0, 0, 0.3) inset, rgba(255, 255, 255, 0.3) 0 -1px 1px inset; }
HTML
<p><a class="emboss-deboss-button">Button</a></p>
浅く彫り込んであるように見えるテキストシャドウ
text-shadow(横オフセット, 縦オフセット, ブラー,色)
濃い背景色に白抜き文字の場合
光源とは逆方向に向かって、黒い影を付け、透明度は背景色の濃さに応じて調整。
//濃い背景色+白抜き文字のテキストシャドウ(黒いシャドウ) @mixin ts-light-char($op : .4){ text-shadow: 1px -1px rgba(0, 0, 0, $op); }
薄い背景色に濃い色の文字の場合
光源と同じ方向に向かって、白いハイライトを付け、透明度は背景色の濃さに応じて調整。
//薄い背景色+濃い色の文字のテキストシャドウ(白いシャドウ) @mixin ts-dark-char($op : .7){ text-shadow: -1px 1px rgba(255, 255, 255, $op); }
使い方
.foo { @include ts-dark-char($op : 1); } //コンパイル後 .foo { text-shadow: -1px 1px rgba(255, 255, 255, 1); }
参考にさせていただいたサイト:ズルいデザイン(1)/ @IT
垂直方向の線形グラデーション(単色)のミックスイン
下(bottom)を指定した色にする場合
$color: 色の指定
$adjust: 正の値を指定すると上が明るく、負の値を指定すると上が暗くなる。
@mixin gradient-vertical-bottom($color:#666, $adjust:10%){ background-color: $color; @include filter-gradient(adjust-lightness($color, $adjust), $color, vertical); @include background-image(linear-gradient(adjust-lightness($color, $adjust) 0%, $color 100%)); }
デフォルトでの指定例
.bottom { @include gradient-vertical-bottom(); } //コンパイル結果 .bottom { background-color: #666666; *zoom: 1; filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF808080', endColorstr='#FF666666'); background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #808080), color-stop(100%, #666666)); background-image: -webkit-linear-gradient(#808080 0%, #666666 100%); background-image: -moz-linear-gradient(#808080 0%, #666666 100%); background-image: -o-linear-gradient(#808080 0%, #666666 100%); background-image: linear-gradient(#808080 0%, #666666 100%); }
(以下のサンプルの背景は値に 30% を指定したもの)
上(top)を指定した色にする場合
$color: 色の指定
$adjust: 正の値を指定すると上が明るく、負の値を指定すると上が暗くなる。
@mixin gradient-vertical-top($color:#666, $adjust:10%){ background-color: $color; @include filter-gradient($color, adjust-lightness($color, $adjust), vertical); @include background-image(linear-gradient($color 0%, adjust-lightness($color, $adjust) 100%)); }
デフォルトでの指定例
.top { @include gradient-vertical-top(); } //コンパイル結果 .top { background-color: #666666; *zoom: 1; filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF666666', endColorstr='#FF808080'); background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #808080)); background-image: -webkit-linear-gradient(#666666 0%, #808080 100%); background-image: -moz-linear-gradient(#666666 0%, #808080 100%); background-image: -o-linear-gradient(#666666 0%, #808080 100%); background-image: linear-gradient(#666666 0%, #808080 100%); }
(以下のサンプルの背景は値に 30% を指定したもの)
中間を指定した色にする場合
$color: 色の指定
$top: 上の色調整(値が大きいほど明るくなる)
$bottom: 下の色調整(値が大きいほど暗くなる)
$reverse: true を指定すると上下の色の調整が逆になる
@mixin gradient-vertical-middle($color:#666, $top:10%, $bottom:10%, $reverse:false){ background-color: $color; @if $reverse == true { @include filter-gradient(scale-lightness($color, -$top), scale-lightness($color, $bottom), vertical); @include background-image(linear-gradient(scale-lightness($color, -$top) 0%, scale-lightness($color, $bottom) 100%)); }@else{ @include filter-gradient(scale-lightness($color, $top), scale-lightness($color, -$bottom), vertical); @include background-image(linear-gradient(scale-lightness($color, $top) 0%, scale-lightness($color, -$bottom) 100%)); } }
デフォルトでの指定例
.middle { @include gradient-vertical-middle(); } //コンパイル結果 .middle { background-color: #666666; *zoom: 1; filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF757575', endColorstr='#FF5C5C5C'); background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #757575), color-stop(100%, #5c5c5c)); background-image: -webkit-linear-gradient(#757575 0%, #5c5c5c 100%); background-image: -moz-linear-gradient(#757575 0%, #5c5c5c 100%); background-image: -o-linear-gradient(#757575 0%, #5c5c5c 100%); background-image: linear-gradient(#757575 0%, #5c5c5c 100%); }
$reverse:true を指定した例
.middle2 { @include gradient-vertical-middle($reverse:true); } //コンパイル結果 .middle2 { background-color: #666666; *zoom: 1; filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF5C5C5C', endColorstr='#FF757575'); background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5c5c5c), color-stop(100%, #757575)); background-image: -webkit-linear-gradient(#5c5c5c 0%, #757575 100%); background-image: -moz-linear-gradient(#5c5c5c 0%, #757575 100%); background-image: -o-linear-gradient(#5c5c5c 0%, #757575 100%); background-image: linear-gradient(#5c5c5c 0%, #757575 100%); }
参考にさせていただいたサイト:ズルいデザイン(2)/ @IT