Home > XHTML CSS > CSSの記述テクニック 階層宣言コーディング

CSSの記述テクニック 階層宣言コーディング

  • Posted by: wu
  • April 1, 2007 2:42 PM
  • XHTML CSS
2007-04-02追記

この記事は2007年4月1日にエイプリールフールネタとして書かれたものであり、紹介しているCSSの宣言ブロック内にセレクタを記述する方法は不正な書式であり無効です。

検索・他の記事から訪れた人は勘違いしないように注意してください。

CSSの記述はセレクタを並列に定義していくので、視覚的に構造を表すことができません。ここで定義グループごとにファイルを分割して管理したりする方法が有効になるのですが、これもXHTML文書の構造を頭にいれておかなければならないし、文書とビジュアルの結びつきをきちんと設計しなければ分割する意味がなくなってしまいます。

今日は、これらの弱点を埋める「階層宣言コーディング」という記述方法を紹介します。

次の記述は単純に文脈セレクタを使った記述です。

p.caution {
 color: red;
 font-weight: bold;
}

div.entry {
 background-color: #eee;
}

div.entry p.caution {
 border: 1px solid green;
 margin: 1em;
}

上記の記述では、まず、p.cautionに対するスタイルが定義された後にdiv.entry内に出現するp.cautionに新たにスタイルが定義されています。宣言自体は並列にならぶので、スタイルの構造は文脈セレクタを頼りに先頭から目で追って理解するしかありません。これだけならまだ構造を理解するのは難しくありませんが、同じ階層の要素にスタイルを定義する場合は、そのつど文脈セレクタを頭から書いていかなければならず、記述は煩雑になります。

これを文脈セレクタを使わずにスマートに記述するには、次のように宣言ブロック内で新たなセレクタと宣言ブロックを定義していきます。

body {
	p.caution {
 		color: red;
 		font-weight: bold;
	}

	div.entry {
 		background-color: #eee;
		p.caution {
			border: 1px solid green;
			margin: 1em;
		}
	}
}

上記の記述では、div.entry内のp.cautionは、文脈セレクタではなく宣言ブロックの階層構造によって適用範囲が判断されます。つまり、宣言は下の階層へと適用され、それより上や同列のセレクタには適用されません。この記述方法はCSSの記述を簡略化するばかりか、視覚的にもカスケードの流れが理解でき、文書とビジュアルの結びつきを無視するのが難しくなるので、自然とコードを綺麗にまとめられるという利点があります。

次に上げるページは、CSSでは文脈セレクタを一切使わずに階層構造のみで記述してスタイリングされています。

CSSの記述は以下のようになっています。

@charset "utf-8";

/*
* Author: wu
* WebSite: http://3ping.org/
* Date: 4/1
*/

*{
	margin: 0;
	padding: 0;
	font-size: 100%;
	font-weight: normal;
	body{
		margin: 0 20px 1em;
		background-color: #444;
		font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
		/* elements */
		h1{
			margin: 1em 0 0.5em;
			font-size: 140%;
			color: #fff;
		}
		h2{
			margin: 0.5em 10px;
			padding: 0.1em 10px;
			color: #fff;
			background-color: #bccd56;
		}
		h3{
			margin: 0.5em 10px;
			padding: 0.1em 10px;
			color: #999;
			background-color: #eee;
		}
		p{
			margin: 0.4em 20px;
			color: #666;
		}
		ul{
			margin: 0.5em 20px;
			list-style-position: inside;
		}
		
		dl{
			margin: 0.5em 20px;
			border-left: 5px solid #eee;
		}
		dt{
			padding-left: 10px;
			border-top: 1px solid #eee;
			border-bottom: 1px solid #eee;
			color: #80af00;
		}
		dd{
			margin: 0 20px;
			color: #999;
		}
		address{
			margin: 0 20px;
			color: #999;
		}
		/* 汎用クラス */
		p.return{
			clear: both;
		}
		/* Structure */
		div#content{
			width: 100%;
			margin: 1em 0 0.5em;
			padding: 1px 0;
			background-color: #fff;
			/* div#entries */
			div#entries{
				width: 70%;
				float: left;
			}
			div.entry{
				margin: 1em 0;
				ul.info{
				 	li{
						display: inline;
						color: #999;
						font-size: 80%;
					}
				}
			} /* end div#entries */
			/* div#utilities */
			div#utilities{
				width: 30%;
				float: right;
				clear: right;
				background-color: #f5f5f5;
				ul{
					list-style-type: square;
					color: #999;
				}
				dl{
					margin: 0.4em 10px;
					padding: 1px 0;
					background-color: #eee;
					dt,
					dd{
						margin: 0.2em 10px;
					}
					dt{
						padding: 0;
						border: none;
						color: #000;
					}
					dd{
						color: #999;
					}
				}
			} /* end div#utilities */
		} /* end div#content */
	} /* end body */
} /* end Universal Selector */

文脈セレクタが一切使われていない点に注目してください。ほとんどは単一セレクタの階層構造によって定義されています。

最初の階層には全称セレクタを指定しますが、これは省略することができます。その場合、ルートセレクタはbodyになります。bodyは省略できず、省略した場合はその後の階層を無視します。(IE6だけはbodyを省略しても適用されるが、これはバグです)

スタイルの継承が階層構造によって視覚的に見えるので、今までの記述方法でうまくCSSを管理できない方は、これからはwこの階層宣言コーディングwっでwCSSを記述してはどうでしょうか?wwwwwww

^0^

Comments:20

Comment Form
rea 2007年4月 1日 16:23

サンプルのCSSを覗いてみたんですが、パッと見ただけでは気付きませんでした。
いやー、すばらしい!! ナイスなアイデアですね:-)

kz 2007年4月 1日 16:40

こ、これは超便利!!><
完全脱帽です、やられましたっ

Sujimaru 2007年4月 1日 16:45

はじめまして。いつも拝見させていただいています。
色々試したいと思いローカルで階層コーディングを試しているのですが、当方の環境ではうまくCSSが適用されません。(ところどころスタイルが適用される)
環境
Mac OS
使用ブラウザ: Safari, Firefox


以上、ご報告まで。

wu 2007年4月 1日 17:45

reaくん、kzくん、ありがとう。 これからは階層宣言コーディングだね!


Sujimaruさんへ
そんなはずはないと思いますよー。僕はMacからWindows, 携帯も一通りのキャリアを手元に揃えており、なおかつ、それぞれ目の角膜が擦り切れるほどの表示確認を行っております。 完璧主義者である僕に唯一足りないものがあるとしたら、下らない記事を書く時間でしょうか。

e-luck 2007年4月 1日 18:34

僕も早速このテクニックを取り入れることにしました。(棒読み)
増刷時にこの内容でもう1章追加しなきゃねっ!

wu 2007年4月 1日 19:16

エイジさん、書き込みありがとうございます(笑
イイと思えるTipsはどんどん広めてゆきたいですね。 書籍だけでなく、勉強会に呼ばれたら
プレゼンネタとしてとっておくことにします。 賛同してくれる方は、この記事をどしどし
リンクしてくれもらえると嬉しいです。プー
ード

Milli 2007年4月 1日 20:27

はじめまして、ではないですねこんにちは。
げつまつで忙しいのもまだ片付いていないのですが
わたしも上記 tips を試してみました。
ローカルでダウンロードしたソースを使ってやってみましたが
たぶんブラウザによってなのでしょうか、こちらの環境ではダメでした。
windows XP + Firefox です。

taka 2007年4月 1日 20:58

こんにちわ。
このTipsはすごい便利ですね。
ここまで便利な記述法が今までまったく出てこなかったのが、逆に不思議です。
CSSの仕様的にはどういう扱いなんでしょうか・・・。
ここまできたら、あとはOOPっぽく親子関係を無視したクラスの継承とか実装して欲しいですね。

kim 2007年4月 1日 21:44

立て読みワラタw

sun 2007年4月 1日 22:28

すぐわからなかった…

しかしまじめな話、こういうことできたらいいですね。

cuuu 2007年4月 1日 23:40

ひ、ひどい…;x;

Anonymous 2007年4月 2日 00:48

うちもCSSで階層構造を明示しやすくする方法で悩んでいました。
そのうち業務でも取り入れたいと思います。
八月頃までにはなんとかなるかな・・・
百聞は一見にしかず。いいもの見せてもらいました。

ありがとうございました^^

wu 2007年4月 2日 06:20

皆様コメントありがとうございます。


Sujimaruさま
追記したとおり、これはエイプリールフールネタであり、紹介している階層宣言コーディングというのは不正な書式です。よって、このような記述をした場合はブラウザは正しくCSSを解釈いたしません。
誤解を与えてしまい申し訳ございません。

darkdaft 2007年4月 2日 08:05

おおー。これは確かに分かりやすい。
ですが…この書き方に対応したEditorが無いと困るかもw

でもいいですね!今度作る時これでやってみたいと思います!

purprin 2007年4月 2日 17:21

ネタとはいえないくらいおもしろいです!まるでプログラミングのようですね。

マジレスすると、自分自身で階層構造がわかるように(ネストじゃなくて)インデントでかいています(ホップ本でさらりとかかれていたやりかた)。

しかし、どこの id を基準にインデントなしでかきはじめるかによっては、トンデモなく深くなってウザイと思われがちなことと、かえってみにくいとかスペース分のサイズが増えるとかというリスクがあることもあり、今は適当にバランスをとりながらインデントをとりいれているけどやっぱりやめよーかなー、と、思ったり。

いずれにしてもシーエスエスって楽しいなー。と、締め切りにせまられながら、唸っている最中でした。(by キャミィ)

captino 2007年4月 2日 19:48

これは、なんか面白い!CSS4で提案してみては?(何年後だろう)

form.hoge 内のtable.fuga以下のtr,th,tdをそれぞれ定義したいときにあると便利そう。

ただインデントレベルの違う文脈なしセレクタとの間で(書き手が)混乱しそうです・・・

Sujimaru 2007年4月 3日 08:19

エイプリーリルフールネタを気づけず、見事に釣られてしまいました (w
でもこの記述がきたらちょっとおもしろそうですねぇ。

wu 2007年4月 3日 23:00

darkdaftさんへ
実際凄い掻き辛かった!(笑


purprinさんへ
ありがとうございます!
インデントして記述する方法も一長一短がありますね。ネストが深いと、文脈セレクタで判断するほうが楽だと感じたり。 TableやForm要素では中に出現する要素がある程度決まっているのでいいかもしれないですね。
ほんと、シーエスエスは楽しいですね!


Captinoさんへ
記事ではネタとして、さも便利のように書いていますが、もしこれができても、やっぱりと色々と不都合がありますねぇ。CSSは特殊な記法ではありますが、今の形のままセレクタがどんどん発達していってるので仕様のほうが正直好きです。(笑


Sujimaruさんへ
あ、よかった! Sujimaruさんが怒っちゃったんじゃないかと心配していたので、返信内容をみたときは素でほっとしました。

通りすがり 2007年4月 7日 00:56

http://d.hatena.ne.jp/tt_clown/20070405
CSS階層的コンバータ


嘘から出た誠…とはちょっとちがうかもしれませんが、考え方・方法としてアリですねぇ。

wu 2007年4月 8日 06:19

あれ、間違って自分のコメント消しちゃった。

CSS階層的コンバータ、すごいですねー!
階層的に宣言することで、そうしたほうが便利なことと、逆に今の記述方法の良さが見えてくるということも考えられますね。

Trackbacks:0

TrackBack URL for this entry
http://3ping.org/mt/mt-tb.cgi/86
Listed below are links to weblogs that reference
CSSの記述テクニック 階層宣言コーディング from 3ping.org

Home > XHTML CSS > CSSの記述テクニック 階層宣言コーディング

Book

実践 Web Standards Design

拙著「実践 Web Standards Design」ではXHTMLやCSSの仕様からマークアップの手法・考え方をはじめ、レイアウトや実践的なWebサイト構築のワークフロー、そしてCSSを利用したさまざまな技術的Tipsを解説しています。

Products
Search
Feeds

Return to page top