CSSの小技として、<ol>要素(順序付きリスト)を表のように見せる書き方を解説します。
<dl>要素を表みたいに表示するにはと似ておりますが、HTMLのマークアップが異なるため、当然CSSも異なったものとなります。
順序付きリスト(<ol>要素)をわざわざ表形式で表示させなければならない必然性は確かに無いかも知れません。
ですが、そのほうが見易かったり、視覚環境だと直感的に見える場合もあります。
しかも、テーブル(表)に較べて、リストは記述も容易でアクセシブルであると言う利点があります。
そこで、
と言うのをCSSでやってみましょう。
ここでは、仮定するマークアップとして、以下のようなサンプルを考えてみたいと思います。
<ol class="withExplanation"><li><em>先ず、題名を。</em>どんな文書にも必ず題名が付いている筈です。このため、HTMLに於いて、<title>要素は最も重要な要素とされており、唯一の必須要素となっております。</li><li><em>続いて、見出しと段落をマークアップします。</em><p>見出しは<h○>要素、段落は<p>要素としてそれぞれマークアップしていきます。</p><p>注意すべき事として、<h○>要素の○に入る数字は、見出しの等級であり、決して見出しの表示サイズではないと言う事です。</p></li><li><em>必要に応じてアンカーを降ろします。</em><p>ハイパーリンクはWWWにとって最も重要な概念ですが、これを実現するのが<a>要素です。</p><p>href属性値にリンク先のURLを指定しますと、当該要素の内容となるテキストがそのURLをつながりを持つ事となります。</p></li></ol>
ご覧のように、各<li>要素の内容の冒頭には、<em>要素としてマークアップされたテキストがあり、それはテーブル(表)の形式で表示させるとすれば恐らく左側の見出しコマのように表示させるところでしょう。
そして、残りのテキストを右側の通常のコマのように表示させようと言う訳です。
いろいろな方法があると思いますが、ここでは最も単純なフローティングを用いて行いたいと思います。
ここでは、見出しコマとなる<em>要素の幅は九文字以内と仮定しております。
ol.withExplanation {margin: 1em 0 1em 1em;padding: 0;border: #aca 1px solid;border-width: 1px 2px 2px;background: #f8fff8;counter-reset: ctr;}ol.withExplanation li {display: block;list-style-type: none;margin: 0 0 0 10em;padding: 0.5em;border: #aca 1px solid;border-width: 1px 0 0 1px;background: #ffffff;position: relative;top: 0;left: 0;}ol.withExplanation li em {display: block;width: 9em;margin: -1px 0 0;padding: 0.5em;position: absolute;top: 0;left: -10em;font-style: normal;border-top: #aca 1px solid;font-weight: normal;}ol.withExplanation li em:before {display: inline;content: counter(ctr) ". ";counter-increment: ctr;}ol.withExplanation li em+* {margin-top: 0;}ol.withExplanation li * {margin-bottom: 0;}/* IE 6.0 対策。*/* html ol.withExplanation li em {margin-left: -0.5em;top: 1px;}* html ol.withExplanation li p {position: relative;top: -2em;}/* IE 7.0 対策。*/*+html ol.withExplanation li p {position: relative;top: -1em;}
ここで、全体のスタイルとして、ボーダの組み合わせと背景色について解説しておきましょう。
ボーダは、<ol>要素全体の枠線としては幅 2ピクセルズとしておりますが、実際には<ol>要素には上は 1ピクセルしか与えておりません。
これは、実際に各項目には上に 1ピクセルの幅の枠線を引く事で区切りとしているからです。
そうすると、見出しに相当する<em>要素の部分(すなわち左側のコマ)の上の枠線が引かれないため、これは<em>要素にて指定します。
display: block プロパティでブロックレヴェル要素風に表示させます。背景色としては、
この目的のため、
ここで、<em>要素は無色透明とします。なぜなら、<em>要素は必ずしもコマ一杯に描かれるとは限らないからです。
見出しコマに相当する<em>要素は、左にフロートさせますが、このとき普通にやろうとすると<li>要素の枠内(つまり右側の本文のコマ)に収まってしまうため、左マージンにマイナスの値を入れる事で、左側の見出しコマにテキストが入るようにします。
但し、このままだと<li>要素に与えた上ボーダの影響で 1ピクセル下にずれた表示になってしまいます。
そこで、見出しコマに相当する<em>要素には position: absolute プロパティと top プロパティで 1ピクセルだけ上にずらす事とします。
ポジショニングの座標をあわせるため、親要素である<li>要素には position: relative プロパティで左上がポジショニングの絶対座標の原点となるようにします。
ところで、<ol>要素の各項目に与える番号をどうするかと言う事になります。
これは当然見出しコマのテキスト前に与えるべきものでしょう。
このため、見出しコマに相当する<em>要素の直前にはカウンタを用いて番号を付けて行きます。
その番号のリセットは、当然<ol>要素全体内で行われる事となります。
最後に、本文コマのスタイル調整も行いましょう。
後続のコマがブロックレヴェル要素の場合、当然上マージンが生じますが、そうすると見た目が悪くなるので、<em>要素の直後の要素に対しては margin-top プロパティで上マージン幅を零にします。
同様に、見出し以外の内容要素の下マージンも零にしております。
ところで、インターネットエクスプローラ 6.0では、見出しコマの部分(<em>要素)を左にずらそうとした場合、パディング分のずれが生じるため、その分調整します。
また、見出しコマ部分を上に 1ピクセルずらす調整が逆におかしな事になるため、それを補正しております。
更に、本文コマにある段落(<p>要素)の上余白がおかしくなるため、ポジショニングで上にずらしております。
一方、インターネットエクスプローラ 7.0でも、本文コマにある段落(<p>要素)の上余白がおかしくなるため、ポジショニングで上にずらしております。
以上のスタイルを実際に表示させると以下のようになるでしょう。
上記の通り、インターネットエクスプローラ 7.0まででは巧く行かない部分があり、スタイルを調整しております。
インターネットエクスプローラのCSSの不具合は、どうも再現性が余りないようで、試しながらやった方が良いかも知れません。
どうしても無理のようでしたら、インターネットエクスプローラ 6及び 7に対しては別のスタイルを適用する方が安全かも知れません。
また、ここまででは殆ど触れませんでしたが、インターネットエクスプローラ 7.0までではCSSのカウンタが効かないため、各項目に通し番号が付かなくなってしまいます。
この点についても問題があるかも知れません。
今回、見出しコマ部分は<em>要素として話を進めましたが、本文中にも<em>要素が入る可能性は否定出来ません。
インターネットエクスプローラ 6.0を考慮しないのであれば、:first-child 擬似要素セレクタを用いれば簡単なのですが、平成21年11月現在インターネットエクスプローラ 6.0のシェアはまだ高いため、ちょっと躊躇うかも知れません。
このため、見出しとなる<em>要素にはクラス名を与える必要が生じるかも知れません。
今回は本文は<p>要素のみとしましたが、他のリストなどのブロックレヴェル要素が入らないとも限りません。
その場合、やはりインターネットエクスプローラ 7.0までに付いて問題が生じるでしょう。
現行のウェブブラウザ(インターネットエクスプローラでは 8.0以降)であれば、displayプロパティで本当にテーブル形式で表示させる事も可能です。
具体的には、
display: table プロパティ(テーブルの本体に見立てる)display: table-row プロパティ(テーブルの行成分に見立てる)display: table-cell プロパティ(テーブルのコマに見立てる)をそれぞれ与えます。
ですが、この方法だと本文コマのパディングの調整が出来ないため、余り綺麗な表示にはならないでしょう。
display: table-cell プロパティを与える事でスタイル調整は可能ですが、そうでなければ調整する事は出来ません、また、インターネットエクスプローラ 7.0までではこれらの表示が出来ません。