blog.hekt.org

CSSのフォーマットルール

僕も人のこと言えないけど、zenbackのCSSはもうちょっと読みやすくする努力をしてもいいと思う……。空の宣言ブロックがあったりコメントアウトされたのが残ってたりインデント揃ってなかったり。

— 戸塚和人さん (@hekt) 1月 23, 2012

などと誰に言うわけでもなく、文字通りつぶやいてみたら、中の人から返信がありました。

@hekt がんばります・・・!!

— Zenbackさん (@zenback) 1月 24, 2012

上から目線な発言を反省しつつ、人にがんばらせるからには僕も少しはがんばらないといけないな、ということで、フォーマットとプロパティの出現順のルールを制定、適用しました。

フォーマット

まず基本的なフォーマット。別のパターンも挙げつつ選んだ理由を解説します。採用したのは一番上のものです。

ブロックの開始位置

selector {
selector{
selector
{

セレクタがひとつのときは二番目でもいいのですが、二つ以上のセレクタをカンマ区切りで連ねるときにカンマの後ろにスペースが欲しいので、バランス的に波括弧の前にもスペースがひとつ欲しくなります。セレクタのあとに改行する三つ目は、ただでさえ縦長になるCSSの傾向をさらに強めることになるのでやめておきます。

宣言部

selector {
  property: value;
selector {
property : value;
property :value;

行頭をインデントするか、コロンの前後にスペースをいれるか、という二つが問題ですが、全パターン列挙するのは面倒なので省略しました。前者については、インデントしたほうが明らかに見やすくなるのでそうします。あ、インデントはスペース二つにしてます。

後者は、PEP 8(Pythonのスタイルガイド)でコロンの前にスペースを入れずコロンの後ろに入れることを推奨しているので、それを踏襲します。というか一般的にコロンの使い方としてそれが普通みたいですね。

ブロックの中で一番後ろのセミコロンは省略できるのですが、書き足すときにトラブルの元になりますから、きちんと書きます。

ブロックの終了位置

selector {
  property: value;
}
selector {
  property: value;}
selector {
  property: value; }

後ろ二つは確かに縦に短くはなるのですが、後ろに書き足す際にカーソルを移動する手間と改行する手間が増えてしまいます。

selector {
  property: value, value, value;
}
selector {
  property: value,value,value;
}

どっちが見やすいか一目瞭然ですね。宣言部と同じ理由で、カンマの前にはスペースを入れません。

こういうシンプルなケースではこれでいいのですが、ネストされているパターンは少し複雑です。

color: rgb(255,255,255);
background-image: linear-gradient(180deg,
                                  red 0%,
                                  rgba(255,0,0,0) 100%),
                  gradient(linear, left top, left bottom,
                           from(rgb(255,255,255)),
                           to(rgb(0,0,0)));

ケースバイケースですが、個人的にこの場合はこう書くのが一番すっきりします。RGB(a)値はスペースなし。これにスペースを加えるとネストしたときに区切り位置が分かりづらくなりますし、逆にRGB以外のスペースをなくすと酷いことになります。上の例だと:

gradient(linear,left top,left bottom)

かなり読みづらい。(そもそもスペース区切りとカンマ区切りが混在してるのが気持ち悪いのですが……)

改行位置もテキトーでいいんじゃないですかね。投げやりですが。fromとto、0%と100%のみで中間(color-stop/1-99%)がないときは一行にまとめてもいいかもしれません。(Vendor Prefixをつけるとインデントが深くなるので厳しいか……?)

プロパティの出現順序

面倒くさいのはこれです。これを自分で全部制定するのはキツすぎるので、他人様の案に乗っかることに。CSS3のプロパティなど、載っていないプロパティがどこに属すかはSafari CSS Referenceを参考にしました。今回編集中に出てきたものを挙げます。(意外と使ってなかった)

Visual effect
  • transform
Box model
  • border-radius
  • box-shadow
  • box-sizing
  • opacity
Text
  • text-shadow

その他

  • 0のときは単位を省略する
  • 小数の先頭の0は省略しない
  • 特に理由が無い場合シングルクオートでなくダブルクオートを使う

で、成果物がこちら。今後の課題として、色指定にactual-valueとhex-valueが混在しているのをなんとかする、とか、あとセレクタがフリーダムすぎるので、次書くときはもうすこし統一感のある記述にしたいところです。

が、何年か前にもこういうのやろうとして挫折した記憶があるので、次書くときにちゃんとフォーマットに従って書けるかどうかが勝負になりそう。