CSS:display属性のtable系を使ってみる

パンくずなんだけど

 前回のパンくずをclassで装飾する件だけど、 rel="next" みたいに、rel属性を使えばいいんじゃねーの?
 というか使うべきじゃねーの。

<nav>
<ul><li><a rel="start">Top</a>
    <ul><li><a rel="chapter">Web</a>
        <ul><li><a rel="section">Diary</a>
            <ul>
            <li><a rel="prev">Prev.</a></li>
            <li><a rel="next">Next</a></li>
            </ul>
</li></ul></li></ul></li></ul>
</nav>

 とまぁ、こんな感じ(hrefとtitleは省略)なんだけどどうだろうか。
 でまぁ、CSSの方はこんな感じで、地味に装飾した。

/* ナビゲーション */
nav ul {
	display:inline-block;
	margin:0 10px;
	padding:0px;
	line-height:2em;
}
nav li {
	display:inline-block;
	margin:0px;
	padding:0px;
}
nav a {text-decoration:none;}
a[rel="chapter"]:before,
a[rel="section"]:before {color:gray;content:"> ";}
a[rel="prev"]:before {content:"←";}
a[rel="prev"]:after {color:gray;content:" |";}
a[rel="next"]:before {content:"→";}

 結果はこんな感じ。

 どうもtext-decorationは、beforeやafter疑似要素の中まで共通しているらしく、下線を丸っとはずすしかなかった。
 仕様だとしたら、どうしてそうなったかよく分からん。

 ん、もうrelで階層の意味を指定してるんだから、ul使った階層表現は過剰だな…
 と思って、同じ階層に並べた。CSSはそのまま。

<a rel="start">Top</a>
<a rel="chapter">Web</a>
<a rel="section">Diary</a>
<a rel="prev">Prev.</a>
<a rel="next">Next</a>

 ら…、指定したbefore疑似要素が後の要素にまで影響したり、適用されなかったり…うーん、意味不明。Safariで顕著でChromeでも起きたりする…WebKitのバグなのか?なんなのか。
 ともかく、属性セレクタと:before、:after疑似要素は相性よくない。

Top Web Diary

さて、今回はtable

 tableタグは表を書くためのタグなんで、それをレイアウトのためだけに使うのは良くないけど、tableレイアウト自体はいいもんだと思うんだよね。
 よーするにグリッドレイアウトな訳じゃないですか、大きな意味で。
 ふと思い出したけど、Javaのレイアウトシステムは使いにくかったなー、ほんとプログラマが考えたレイアウトシステム、って感じだったよ。

 エートなんだったっけ。そうそう、tableレイアウトでした。
 CSSにはdisplay:tableって表示設定が用意してあって、他にもtable系の表示方法が指定できるようになっている。
 display:tableと<table>、display:tabel-rowと<tr>、display:table-cellと<td>が対応している感じ。
 で、テーブル用のタグじゃなくても、上記の対応のような指定をしてやれば、表示上はtable的にレンダリングしてくれる。
 …素晴らしくね?

<a>を<td>としてレンダリングする

 ナビゲーションとかリスト系タグで作ること多いと思いますが、ちょっとタグの無駄が多いような気もするんですわー。
 ナビゲーションという性質上、既に<a>で括っているんだから、それをさらに<li>で括るのって、無駄っぽくねーすか。

 で、display:table-cellって指定したヤツの外にdisplay:table-rowやdisplay:tableがないと、暗黙の<table>と<tr>を作る仕様だっていうじゃないですか。
 <td>相当の要素さえ並べておけば、その外はなくても成立するって、タグが省略できてとてもステキ。
 ちなみに、その逆でdisplay:tableやdisplay:table-rowの中には暗黙の<td>が作られるそうな。

 :beforeや:afterはうまくいかなかったけど、疑似じゃないセレクタだとちゃんと動くっぽいので、その辺で装飾してやると良いと思う。
 てなわけで、今回のページのパンくずナビゲーションは<nav>の中に<a>を入れといて、あたかもそれがテーブルのごときレンダリングで表示されるパターンで。
 CSSは以下のごとくです。

nav a {
	display:table-cell;
	width:5em;
	line-height:2em;
	border:1px silver solid;
	text-align:center;
}
a[rel="start"],
a[rel="prev"] {
	border-radius:1em 0 0 1em;
}
a[rel="prev"] {
	border-collapse:separate;
	border-spacing:1em;
	color:#66f;
	background-color:#f6f6f6;
}
a[rel="section"],
a[rel="next"] {
	border-radius:0 1em 1em 0;
}

 あ、そういやtableはセルの間とかdisplay:blockとは別の指定方法だったなぁ、…そーいやtableをCSSで装飾とかあんまやった事なかった。
 次回、もーちょっとそのへん突っ込んでみたい。

 今日はここまで。