前回(RVM / JewelryBox / Homebrew をインストール - メモログ )でインストールした1.9.3に、SassとCompassをインストールするの巻。Sass はCSSの記述をサポートしてくれるプリプロセッサー。Compass はSassのお役立ちMixinをたくさん用意しているCSS authoring framework。
Sass / Compass のインストール
ターミナルで下記を実行。
1 2 3 gem install sass gem install compass
Sassの使い方
コマンドライン上で下記のコマンドを実行。
1 2 sass --watch foobar.scss:foobar.css
これでfoobar.scssを編集保存すると、foobar.cssにCSSが生成される。
さらなる使い方はTutorial (日本語が便利 )を読むと一通り分かる。
Compassの使い方
Compassでは最初にプロジェクトを作成して、作成したプロジェクトでwatchする。
1 2 3 4 compass create foobar cd foobar watch
sassで–compassオプションを使って使用することもできる。
1 2 sass --watch foobar.scss:foobar.css --compass
たとえばCompassを使ってlinear-gradientを作成する場合は下記のように、必要なpartialをimportして、compassの書式 にあわせて記述する。
1 2 3 4 5 6 @import "compass/css3/images"; #foobar{ @include background(linear-gradient(45deg, #333 30%, #0c0)); }
下記のようなCSSになる(-ms-は入らないのか)。
1 2 3 4 5 6 7 #foobar { background: -webkit-linear-gradient(45deg, #333333 30%, #00cc00); background: -moz-linear-gradient(45deg, #333333 30%, #00cc00); background: -o-linear-gradient(45deg, #333333 30%, #00cc00); background: linear-gradient(45deg, #333333 30%, #00cc00); }
さらなる使い方はCompass Help | Compass Documentation を参照。日本語のドキュメントとしては、Sass入門 にチュートリアル的なのがある。Compassを触ってみて、CSS3のモジュールを眺めてみる。|linker journal|linker も参考に。
自分でmixinを書く
compassは便利だけど、都合にあわせて自分でmixin用意するなりした方が良い場合もあるかもしれない。たとえばvendor prefixをつけたいだけなら@each を使うのでもいい。
1 2 3 4 5 6 #foobar{ @each $vendor in -webkit-,-moz-,-ms-,-o-,null { background: #{$vendor}linear-gradient(45deg,#333 30%, #0c0); } }
@eachの最後のnullは、non prefix用。Sass上で使われるnullは、#{}で指定された場合そこに何も出力しない。
1 2 3 4 5 6 7 8 #foobar { background: -webkit-linear-gradient(45deg, #333333 30%, #00cc00); background: -moz-linear-gradient(45deg, #333333 30%, #00cc00); background: -ms-linear-gradient(45deg, #333333 30%, #00cc00); background: -o-linear-gradient(45deg, #333333 30%, #00cc00); background: linear-gradient(45deg, #333333 30%, #00cc00); }
カスタムファンクションを書く
rubyで自分用のカスタムファンクションを書くという手もある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 module Sass::Script::Functions def generate_linear_gradient(*list) array = [] list.each_with_index do |li,i| if i == 0 || li.is_a?(Sass::Script::Color) then array.push(li) else array[i-1] = Sass::Script::String.new("#{array[i-1]} #{li}") end end Sass::Script::List.new(array,',') end end
sassの-rオプションで用意したスクリプトをrequireする( 上記のrubyスクリプトが~/Desktop/sample.rbという名前で存在すると想定)。
1 2 sass --watch foobar.scss:foobar.css -r /Users/username/Desktop/sample.rb
上のスクリプトの場合は、
1 2 3 4 5 6 #foobar{ @each $vendor in -webkit-,-moz-,-ms-,-o-,null { background-image: #{$vendor}linear-gradient(generate_linear_gradient(45deg,#333,30%,#0c0)); } }
とすると、
1 2 3 4 5 6 7 8 #foobar { background-image: -webkit-linear-gradient(45deg, #333333 30%, #00cc00); background-image: -moz-linear-gradient(45deg, #333333 30%, #00cc00); background-image: -ms-linear-gradient(45deg, #333333 30%, #00cc00); background-image: -o-linear-gradient(45deg, #333333 30%, #00cc00); background-image: linear-gradient(45deg, #333333 30%, #00cc00); }
となる。colorとpercentageを分けて指定できるようになっている。
という感じ。compassで簡単に対応可能かをみつつ、都合にあわせて自作mixinを作るというのが良いかもしれない。