CSSの基本の最近のブログ記事
CSSを記述する際、余白やインデントに関して、自分なりあるいは複数で管理する場合はプロジェクト単位でルールを決めておくと、見やすさ(可読性)が向上します。
ちなみに私の書き方は以下のとおりです。
CSSコード
selecter {
property:value;
}
- selecter名と「{」の間に半角スペースを空ける
- propertyの前に半角3文字分スペースを空ける
- propertyおよびvalueと「:」の間にはスペースを空けない
- valueと「;」の間にはスペースを空けない
- 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つのモードがあります。
- 完全標準モード(Full Standards Mode)
- ほぼ標準モード(Almost Standards Mode)
- 後方(過去)互換モード(Quirks Mode)
これらの違いを見ていきます。
1.完全標準モード(Full Standards Mode)
仕様に則ったとおりにレンダリングされます。ここでいう仕様とはW3C標準仕様のことで、以下の仕様書のことを指します。
2.ほぼ標準モード(Almost Standards Mode)
完全標準モードとほぼ標準モードの違いは1点だけです。
画像の表示に違いがあります。完全標準モードでは画像のvertical-alignプロパティの初期値はbaselineなのですが、ほぼ標準モードではvertical-alignプロパティの値はbottomとなります。
vertical-alignプロパティの値がbaselineであると、画像の下に空白が生じます。この理由は当blogの以下の記事を参考にしてください。
imgタグで指定した画像の下にわずかな隙間(空白)が空いてしまう - CSSデザインノート
3.後方(過去)互換モード(Quirks Mode)
完全標準モードと後方互換モードにはかなり違いがあります。
最も知られているのはボックスモデルの違いです。ボックスにwidthとpaddingとborderを指定した場合、完全標準モードでは横幅 = width + padding + borderになるのに対し、後方互換モードでは横幅 = widthとなってしまいます。
その他にもいろいろあるのですが、量が多いのでここでは割愛します。以下のサイトなどを参考にしてみてください。
Mozilla Quirks Mode Behavior - MDC
標準準拠・後方互換モード各々の CSS 解釈の違いをまとめたドキュメントを共有
DOCTYPEスイッチ一覧表
DOCTYPEスイッチによるモードの違いを表にしたものです。以下のサイトをご覧ください。また、同時に「表示モードごとの CSS 解釈検証表」も載っているので合わせて参考にしてください。
最近のモダンブラウザは、W3Cで勧告されていないCSSでも先行して実装しています。それによりソースコードが簡潔でよりリッチなデザインが可能となりました。
ただし注意しなければならないことは、勧告されていないCSSプロパティや独自プロパティはプレフィックス(接頭辞)を指定しなければなりません。つまり、IEの場合は先頭に「-ms-」が、Mozilla系では「-moz-」が、Operaでは「-o-」を、SafariやChromeの場合先頭に「-webkit-」はをつけなければなりません。
これは、CSS2.1でも定められていることらしいです。
IEでは独自実装でもプレフィックスがついていなかったのですが、IE8からプレフィックスの使用が可能になったようです。
それぞれのブラウザの独自実装CSSプロパティは以下を参考にしてください。
参考サイト
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(Cascading Style Sheets) コーディングガイドライン
山田あかねさんの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タグの指定なのかよくわかり、メンテナンスもしやすくなります。

