CSSの基本の最近のブログ記事

CSSを記述する際、余白やインデントに関して、自分なりあるいは複数で管理する場合はプロジェクト単位でルールを決めておくと、見やすさ(可読性)が向上します。

ちなみに私の書き方は以下のとおりです。

CSSコード

selecter {
   property:value;
}
  1. selecter名と「{」の間に半角スペースを空ける
  2. propertyの前に半角3文字分スペースを空ける
  3. propertyおよびvalueと「:」の間にはスペースを空けない
  4. valueと「;」の間にはスペースを空けない
  5. propertyがひとつしかない場合でも、必ずvalueの後に「;」はつける

基本的にスペースは付け忘れが多いため、空けないようにしているのですが、selecterの後には必ずスペースを入れるようにしています。これは、CSSファイル内でselecterを検索する際、スペースを空けておくと便利なことが多いからです。

CSSを記述する際、プロパティの順序を自分なりに決めておくと、二重に指定したりするミスも減り、メンテナンスも楽になります。

私のプロパティの指定順序を紹介します。ワイヤーフレームはidを使い、それ以外にはclassを使うようにしています。ご自分のメンテナンスのしやすい並び順を模索してみてください。

1.ワイヤーフレームに関するプロパティ

CSSコード

div#name {
/* 表示・配置に関する設定 */
   position: ;
   top: ;
   right: ;
   bottom: ;
   left: ;
   z-index: ;
   float: ;
   clear: ;
   text-align: ;
   background: ;

/* 大きさ(ボックス)に関する設定 */
   min-width: ;
   width: ;
   min-height: ;
   height: ;
   max-height: ;
   margin: ;
   padding: ;
   border: ;
}

2.一般的なclass属性

CSSコード

.name {
/* 表示・配置に関する設定 */
   display: ;
   position: ;
   top: ;
   right: ;
   bottom: ;
   left: ;
   z-index: ;
   float: ;
   clear: ;
   overflow: ;
   visibility: ;

/* 大きさ(ボックス)に関する設定 */
   min-width: ;
   width: ;
   max-width: ;
   min-height: ;
   height: ;
   max-height: ;
   vertical-align: ;
   margin: ;
   padding: ;
   border: ;

/* テキスト・背景に関する設定 */
   color: ;
   font-family: ;
   font-style: ;
   font-weight: ;
   font-size: ;
   text-indent: ;
   text-align: ;
   text-decoration: ;
   letter-spacing: ;
   line-height: ;
   background: ;
}

その他の要素特有のプロパティ、例えばul要素の「list-style-type」などは、スタイルの最後に記述するようにしています。

参考サイト

DOCTYPE宣言によってCSSのレンダリングが変わるのですが、以下の3つのモードがあります。

  1. 完全標準モード(Full Standards Mode)
  2. ほぼ標準モード(Almost Standards Mode)
  3. 後方(過去)互換モード(Quirks Mode)

これらの違いを見ていきます。

1.完全標準モード(Full Standards Mode)

仕様に則ったとおりにレンダリングされます。ここでいう仕様とはW3C標準仕様のことで、以下の仕様書のことを指します。

2.ほぼ標準モード(Almost Standards Mode)

完全標準モードとほぼ標準モードの違いは1点だけです。

画像の表示に違いがあります。完全標準モードでは画像のvertical-alignプロパティの初期値はbaselineなのですが、ほぼ標準モードではvertical-alignプロパティの値はbottomとなります。

vertical-alignプロパティの値がbaselineであると、画像の下に空白が生じます。この理由は当blogの以下の記事を参考にしてください。

3.後方(過去)互換モード(Quirks Mode)

完全標準モードと後方互換モードにはかなり違いがあります。

最も知られているのはボックスモデルの違いです。ボックスにwidthとpaddingとborderを指定した場合、完全標準モードでは横幅 = width + padding + borderになるのに対し、後方互換モードでは横幅 = widthとなってしまいます。

その他にもいろいろあるのですが、量が多いのでここでは割愛します。以下のサイトなどを参考にしてみてください。

DOCTYPEスイッチ一覧表

DOCTYPEスイッチによるモードの違いを表にしたものです。以下のサイトをご覧ください。また、同時に「表示モードごとの CSS 解釈検証表」も載っているので合わせて参考にしてください。

最近のモダンブラウザは、W3Cで勧告されていないCSSでも先行して実装しています。それによりソースコードが簡潔でよりリッチなデザインが可能となりました。

ただし注意しなければならないことは、勧告されていないCSSプロパティや独自プロパティはプレフィックス(接頭辞)を指定しなければなりません。つまり、IEの場合は先頭に「-ms-」が、Mozilla系では「-moz-」が、Operaでは「-o-」を、SafariやChromeの場合先頭に「-webkit-」はをつけなければなりません。

これは、CSS2.1でも定められていることらしいです。

IEでは独自実装でもプレフィックスがついていなかったのですが、IE8からプレフィックスの使用が可能になったようです。

それぞれのブラウザの独自実装CSSプロパティは以下を参考にしてください。

Mozilla系
IE8

参考サイト

CSS3は2009年7月8日現在、Working Draftの段階ですが、モダンブラウザでは先行して実装されています。

Webサイトを制作する際、IEがネックとなっていますが、IE8ではよりWeb標準に近づいた動作をしますので、積極的に新しいCSSに挑戦するのも面白いと思います。

さて本題ですが、CSS3を含むCSSセレクタを一覧にしました。ご参考ください。

セレクタパターン意味セレクタの種類定義されたCSSレベル
* すべての要素を対象にするセレクタユニバーサルセレクタ2
E E要素に対してスタイルを適用タイプセレクタ1
E[foo] foo属性を持つE要素に対してスタイルを適用属性セレクタ2
E[foo="bar"] barという値のfoo属性を持つE要素に対してスタイルを適用属性セレクタ2
E[foo~="bar"] barという値を1つでも含んでいるfoo属性を持つE要素に対してスタイルを適用属性セレクタ2
E[foo^="bar"] barという値から始まるfoo属性を持つE要素に対してスタイルを適用属性セレクタ3
E[foo$="bar"] barという値で終わるfoo属性を持つE要素に対してスタイルを適用属性セレクタ3
E[foo*="bar"] barという文字列を含むfoo属性を持つE要素に対してスタイルを適用属性セレクタ3
E[hreflang|="en"] en(言語)という値のhreflang属性をもつE要素に対してスタイルを適用属性セレクタ2
E:root ドキュメント内のルート要素である E という要素にスタイルを適用(HTMLの場合はhtml)擬似クラス3
E:nth-child(n) 親要素の n 番目の子要素である E 要素にスタイルを適用擬似クラス3
E:nth-last-child(n) 親要素の 最後から数えてn番目の子要素である E 要素にスタイルを適用擬似クラス3
E:nth-of-type(n) 兄弟関係にある n 番目の E 要素にスタイルを適用擬似クラス3
E:nth-last-of-type(n) 兄弟関係にある 最後から数えてn 番目の E 要素にスタイルを適用擬似クラス3
E:first-child 親要素の最初の子要素である E 要素にスタイルを適用擬似クラス2
E:last-child 親要素の最後の子要素である E 要素にスタイルを適用擬似クラス3
E:first-of-type 兄弟関係にある最初の E 要素にスタイルを適用擬似クラス3
E:last-of-type 兄弟関係にある最後の E 要素にスタイルを適用擬似クラス3
E:only-child 親要素の唯一の(兄弟関係を持たない) 子要素であるE要素にスタイルを適用擬似クラス3
E:only-of-type 兄弟関係にあるE要素にスタイルを適用擬似クラス3
E:empty テキストノードも含めて子要素を持たないE要素にスタイルを適用擬似クラス3
E:link未訪問のハイパーリンクのソースのアンカーであるE要素にスタイルを適用リンク擬似クラス1
E:visited 訪問済みハイパーリンクのソースのアンカーであるE要素にスタイルを適用リンク擬似クラス1
E:activeクリックなどでアクティブになったE要素にスタイルを適用ダイナミック擬似クラス1
E:hoverマウスポインタで指し示されたE要素にスタイルを適用ダイナミック擬似クラス1
E:focus タブキーなどでフォーカスされているときのE要素にスタイルを適用ダイナミック擬似クラス2
E:target 参照URIの目標であるE要素にスタイルを適用ターゲット擬似クラス3
E:lang(fr) 前方一致で fr という lang 属性値を持つE要素にスタイルを適用言語擬似クラス2
E:enabled有効な (:enabled)E要素にスタイルを適用UI 要素状態擬似クラス3
E:disabled 無効な (:disabled)E要素にスタイルを適用UI 要素状態擬似クラス3
E:checked ラジオボタンあるいはチェックボックスがチェックされた状態のときにE要素にスタイルを適用UI 要素状態擬似クラス3
E::first-line E要素の最初の 1行にスタイルを適用擬似要素1
E::first-letter E要素の最初の 1文字にスタイルを適用擬似要素1
E::selection ユーザが選択したE要素の一部にスタイルを適用擬似要素3
E::before E要素の内容の前にスタイルを適用擬似要素2
E::after E要素の内容の後にスタイルを適用擬似要素2
E.warning warningというクラス名を持つE要素にスタイルを適用クラスセレクタ1
E#myid myidというID名を持つE要素にスタイルを適用IDセレクタ1
E:not(s) sでないセレクタを持つE要素にスタイルを適用否定擬似クラス3
E F E要素と孫子関係にあるF要素にスタイルを適用子孫セレクタ 1
E > F E要素と直接の子関係にあるF要素にスタイルを適用子セレクタ2
E + F E要素と弟関係にあるF要素にスタイルを適用隣接セレクタ2
E ~ F E要素が前にあるF要素にスタイルを適用間接セレクタ3

参考サイト

私もきちんとしたものを作ってはいないのですが、ホームページを作る際、コーディングガイドラインがあると、複数人でも統一した書き方が出来、メンテナンスも楽になります。

秀逸なコーディングガイドラインを作っている方がいらっしゃるので今回はそちらを紹介します。

山田あかねさんのCSSのコーディングガイドラインです。山田さんは、エスカフラーチェのWebデザイナーさんで、書籍や雑誌にもよく記事を書いてらっしゃいます。

上ノ郷谷太一さんのCSSのコーディングガイドラインです。上ノ郷谷さんはMovableTypeでお馴染みのシックス・アパートに勤務されている方です。

あと、こちらはガイドラインというか、ガイドラインのまとめのような記事ですが、非常によくまとまっています。

ショートハンドプロパティとは、1つのプロパティタグを使用して複数のプロパティ値を指定するプロパティのことです。よくわからないと思うので、サンプルを交えながら説明していきます。

1.margin関連プロパティを一括指定する

marginでは個別にtop、bottom、left、rightを指定することができますが、これをmarginというショートハンドプロパティを用いることで一括で指定できます。

その際、以下のような組み合わせで指定できます。

CSSコード

/* 上下左右、全て10px */
margin:10px;

/* 上下10px、左右20px */
margin:10px 20px;

/* 上10px、左右20px、下30px */
margin:10px 20px 30px;

/* 上10px、右20px、下30px、左40px */
margin:10px 20px 30px 40px;

2.padding関連プロパティを一括指定する

paddingもmarginと全く同じなので説明は割愛します。

CSSコード

/* 上下左右、全て10px */
padding:10px;

/* 上下10px、左右20px */
padding:10px 20px;

/* 上10px、左右20px、下30px */
padding:10px 20px 30px;

/* 上10px、右20px、下30px、左40px */
padding:10px 20px 30px 40px;

3.list-style関連プロパティを一括指定する

list-styleではtype、image、positionを指定できます。省略したものは初期値が指定されます。順番も順不同です。

大抵、typeとimageのどちらかを指定し、あまりposionも変更することはないと思うので、以下のような使い方が多いかと思います。

CSSコード

list-style:none;

4.background関連プロパティを一括指定する

backgroundではcolor、image、repeat、position、attachmentを指定できます。省略したものは初期値が指定されます。順番も順不同です。ただし、posionは横軸、縦軸の順に指定します。

CSSコード

background:transparent url(img.gif) no-repeat 0 100% fixed;

5.border関連プロパティを一括指定する

borderには上下左右のwidth、style、colorを指定できます。そのため、様々なショートハンドプロパティがあります。

CSSコード

/* 線の幅が上1px、右2px、下3px、左4px */
border-width:1px 2px 3px 4px;

/* 線のスタイルが上solid、右solid、下solid、左dotted */
border-style: solid solid solid dotted;

/* 線の色が上red、右#ddd、下green、左#000000 */
border-color: red #ddd green #000000;

/* 線の上下左右が幅1px スタイルsolid 色red */
border:1px solid red;

/* 線の上が幅1px スタイルsolid 色red */
border-top:1px solid red;

/* 線の下が幅1px スタイルsolid 色red */
border-bottom:1px solid red;

/* 線の左が幅1px スタイルsolid 色red */
border-left:1px solid red;

/* 線の右が幅1px スタイルsolid 色red */
border-right:1px solid red;

6.font関連プロパティを一括指定する

font-style、font-variant、font-weight、font-size/line-height、font-famillyの順で指定できます。line-heightはfont~で始まらないし、直前に「/」を入れないといけないので注意が必要です。

fontに関するショートハンドプロパティはあまりお勧めしません。なぜならプロパティの数も多い上に順番が決まっているからです。ただし、font-style、font-variant、font-weightの3つは順番を入れ替えて指定できます。順番を間違えてしまうとCSSが適用されないので注意です。

また、フォントの太さと種類は省略不可です。

CSSコード

font:italic small-caps 100%/1.4 Osaka, verdana, sans-serif;

id名やclass名をつけるとき、あなたはどのように命名していますか?

日本語(2バイト文字)が使えないので英単語を使うのが一般的になっていますね。問題は英単語を2つ以上くっつけた名前にしたいとき、英単語の連結をどのように表現するか?以下の4つの方法が思いつきます。

  • アンダーバー(_)でつなぐ
  • ハイフン(-)でつなぐ
  • キャメルケースを使う
  • 単語を全て小文字でつなぐ

1.アンダーバー(_)でつなぐ

例:main_contents

アンダーバー(アンダースコア)を利用すると、エディタでCSSを編集する際、ダブルクリックで選択できるので重宝します。しかし、IE5.5以前のような古いブラウザでは不具合を起こすことがあると言われています。

しかしながら、そこまで古いブラウザだとアンダーバー以外にも不具合が出そうなので、IE5.5以前にはスタイルシートを適用しないようにするのも手かもしれません。

2.ハイフン(-)でつなぐ

例:main-contents

アンダーバーでは一部ブラウザで不具合が出ることからハイフンを使用する人も多いですね。エディタではダブルクリックで選択できないのですが、それがよいので使っている方もいるようです。

こころなしか、CSSerというかマークアップエンジニアの方とかこの書き方多い気がします。

3.キャメルケースを使う

例:mainContents

キャメルケース(CamelCase)とは2番目以降の英単語の最初の文字を大文字で表す記法です。他のプログラミングなどやっていると馴染み深いですよね。

4.単語を全て小文字でつなぐ

例:maincontents

英単語を全て小文字で書いて、区切りもないというパターンです。可読性が落ちてしまうのであまりお勧めできない記法ですね。

どの書き方でも問題はないと思いますが、CSSファイル内では統一させたほうがメンテナンスなどにはよいと思います。

ちなみに私は、CSSを始めた当初はアンダーバー派だったのですが、Javaをやるようになってキャメルケース派になりました。これだとブラウザのことも気にしないでいいし、可読性もなかなかよいです。何よりダブルクリックで選択できるのが嬉しい。

当サイトでも以前、ブラウザのデフォルトスタイルシートをリセットする方法を紹介しましたが、他のサイトでも様々なデフォルトスタイルシートのリセット方法を提案しています。

そのひとつのYUI Reset CSSを紹介します。

主に余白部分(margin、padding)とフォント関連をリセットしています。

CSSコード

body,
div,
dl,dt,dd,
ul,ol,li,
h1,h2,h3,h4,h5,h6,
pre,
form,
fieldset,
input,
textarea,
p,
blockquote,
th,td {
   margin:0; 
   padding:0; 
}

table {
   border-collapse:collapse; 
   border-spacing:0; 
}

fieldset,img {
   border:0;
}

address,
caption,
cite,
code,
dfn,
em,strong,
th,
var {
   font-style:normal;
   font-weight:normal;
}

ol,ul {
   list-style:none;
}

caption,th {
   text-align:left; 
}

h1,h2,h3,h4,h5,h6 {
   font-size:100%;
   font-weight:normal;
}

q:before,
q:after {
   content:'';
}

abbr,acronym {
   border:0;
}

id名やclass名を考えるのは結構億劫ですよね。だからつい適当に思いつきで命名しがちです。しかし、後々のメンテナンスや他の人がソースコードを変更することを考えると、id名やclass名は慎重に決めましょう。

例えば、強調のstrongタグで囲んだテキストを赤くしたいときを考えます。安易に

CSSコード

strong .red {
   color:red;
}

にしてしまうと、後々に赤色でなくて緑色に変更しなければなくなったとき、redというclass名は非常に不適切になってしまいます。

よって、色でclass名を決めるのではなく、機能でclass名を決めるべきです。機能という面では「強調」ですが、strongにはすでにその意味は含まれているので、二重に命名することに意味はありません。そのような場合は、囲んでいるテキストの中身で命名します。

例えば、

(X)HTMLコード

strongタグの使用は<strong class="seo">SEO</strong>に効果的です。

のように命名するのもひとつの手です。

しかしながら、色が赤であることが重要ならば、そういう機能としてclassを指定するのなら、「class="red"」という命名も正しくはあります。このあたりは、ケースバイケースになりますね。

また、マークアップには直接関係しない要素、例えばワイヤーフレームのためのdiv要素などには役割的な名前をつけるべきです。

ヘッダー部分を囲むdiv要素には「<div id="header">」、メインコンテンツを囲むdiv要素には「<div id="mainContents">」といった具合です。

こうすることで、CSSだけを見てもどのようなHTMLタグの指定なのかよくわかり、メンテナンスもしやすくなります。