最近、HTML5 / CSS3でコーディングしているとき、ベンダープレフィックスやらCSSハックやら、同じことを何度も書かないといけないので、CSSの管理に限界を感じていました。
昔から、SASSがあるのは知っていましたが、CSSをコンパイルして出力するために、CSSとは違った言語「SASS形式」で記述するのが面倒というか、事故りそうだったので、導入を断念していました。
.hogehoge color: red
ところが、最近、言語「SCSS形式」という記述でもOKということを知り、試しにこのサイトのCSSに導入してみました。言語「SCSS形式」とは、CSS3の記述を互換しており、拡張子を「.css」から「.scss」に変更するだけなので非常に導入が楽ちんです。
.hogehoge { color: red; }
でも、唯一の弱点は、筆者は抵抗ありませんでしたが、初期インストールや設定が面倒なようです。まず、自分のパソコンにrubyを入れないといけません。また、本格的に使おうと思ったら、「Border Radius」「Box Sizing」「inline Block」「linear-gradient」などのために、mixinという関数でどのようなルールでベンダープレフィックスやらCSSハックやらを出力するのかを自分で作らないといけないので、これも面倒です (mixinが全てではなく、ネストなどのために導入でもOKですが・・・)。でも、これは、「compass」というSassのフレームワークがあり、一般的にCSS3で必要なmixinが予め準備されています。「SASS」+「compass」の導入はおすすめです!
では、初期インストールや設定ですが、手持ちのPCをWindowsとして考えると下記のサイトがわかりやすかったです ( 当然、Macでも「SASS」+「compass」は使えます )。
Windows PC に Ruby と Sass を導入する方法
http://www.hamashun.me/archives/1294573.html
ただし、「gem install」するとSSLエラーが出て先に進まなかったので、下記のサイトを参考にさせていただきました。
Windowsでgem installするとSSLエラーが出る場合の解決策
http://qiita.com/shimoju/items/394818b4989b94680aaf
また、Compassの本家リファレンスは下記のサイトです。
Compass Core Framework (Code Reference)
http://compass-style.org/reference/compass/
これで、環境は揃ったので、面倒だったので今まで使わなかった「rem」指定を、自作のmixinを準備して使って見たいと思います。
ベースは下記のサイトのものを使いました。
THE ULTIMATE PX/REM MIXIN
http://hugogiraudel.com/2013/03/18/ultimate-rem-mixin/
このままでは、引数に「rem」「px」「0」「auto」しか指定できないので、下記のようなものに対応できません。
.hogehoge { margin: 1rem 4%; }
そこで、下記のように改良してみました。
/*! --------------------------------------------------------------- * mixin rem * * @param string $property * @param string $values * @return void * ---------------------------------------------------------------- */ $rem_px_only: false !default; @function parseInt($n) { @return $n / ($n * 0 + 1); } @mixin rem($property, $values) { $px : (); $rem: (); @each $value in $values { @if $value == 0 or $value == auto { $px : append($px , $value); $rem: append($rem, $value); } @else if type-of($value) != number { $px : append($px , $value); $rem: append($rem, $value); } @else { $unit: unit($value); $val: parseInt($value); @if $unit == "%" { $px : append($px , $value); $rem: append($rem, $value); } @if $unit == "em" { $px : append($px , $value); $rem: append($rem, $value); } @if $unit == "px" { $px : append($px, $value); $rem: append($rem, ($val / 10 + rem)); } @if $unit == "rem" { $px : append($px, ($val * 10 + px)); $rem: append($rem, $value); } } } @if $px == $rem { #{$property}: $px; } @else { #{$property}: $px; @if not $rem_px_only { #{$property}: $rem; } } }
「$rem_px_only」は、CSSをWordpressのTinyMCEで使いたいときに、「@import」前にTrueにしてpx指定のみを出力するために設けました。
このmixinを使うと下記のとおりです。
.hogehoge { @include rem(margin, 1rem 4%); }
.hogehoge { margin: 10px 4%; margin: 1rem 4%; }
このmixinを使って、下記のようにDocomentのRootを10pxにしておけば、remに対応していないブラウザでもpx指定の方が有効になります。
html { font-size: 62.5%; /* = 16 * 62.5% = 10px*/ } body { font-size: 1em; }
話は変わりますが、この方法ではなく、remに対応していないブラウザ向けにJavaScriptで対応させる「REM unit polyfill」というのも検証してみましたが、表示が著しく遅くなってしまいました。
最後に、ここまでremにこだわり?と思ったのですが、確かに、最終的にはpx指定なんだし、なにもremにこだわる必要はないと感じましたw ここまでやっといてw
しかしながら、「SASS」+「compass」で、ベンダープレフィックス、CSSハック、TinyMCE向けののCSSなどをルール化できるので、おすすめです!