制作者の活動(PR)。

堀北真希ちゃんのうさぎ化キャラクタ
主な作品

制作者作成のイラストと動画作品(サンプル)

<ol>要素を表みたいに表示するには。

CSSの小技として、<ol>要素(順序付きリスト)を表のように見せる書き方を解説します。

<dl>要素を表みたいに表示するにはと似ておりますが、HTMLのマークアップが異なるため、当然CSSも異なったものとなります。

<ol>要素を表みたいに表示するには・目次。

はじめに。

順序付きリスト(<ol>要素)をわざわざ表形式で表示させなければならない必然性は確かに無いかも知れません。

ですが、そのほうが見易かったり、視覚環境だと直感的に見える場合もあります。

しかも、テーブル(表)に較べて、リストは記述も容易でアクセシブルであると言う利点があります。

そこで、

  1. 簡単な記述でしかもアクセシブルな順序付きリストとしてマークアップするものの、
  2. PCなどでの表示は直感的な表みたいに(PC以外では通常の順序付きリストのように表示させる方が見易い場合もある)

と言うのをCSSでやってみましょう。

仮定するHTMLでのマークアップ。

ここでは、仮定するマークアップとして、以下のようなサンプルを考えてみたいと思います。

<ol class="withExplanation">
    <li>
        <em>先ず、題名を。</em>
        どんな文書にも必ず題名が付いている筈です。
        このため、HTMLに於いて、&lt;title&gt;要素は最も重要な要素とされており、唯一の必須要素となっております。
        </li>

    <li>
        <em>続いて、見出しと段落をマークアップします。</em>
        <p>見出しは&lt;h○&gt;要素、段落は&lt;p&gt;要素としてそれぞれマークアップしていきます。</p>
        <p>注意すべき事として、&lt;h○&gt;要素の○に入る数字は、見出しの等級であり、決して見出しの表示サイズではないと言う事です。</p>
        </li>

    <li>
        <em>必要に応じてアンカーを降ろします。</em>
        <p>ハイパーリンクはWWWにとって最も重要な概念ですが、これを実現するのが&lt;a&gt;要素です。</p>
        <p>href属性値にリンク先のURLを指定しますと、当該要素の内容となるテキストがそのURLをつながりを持つ事となります。</p>
        </li>
    </ol>

ご覧のように、各<li>要素の内容の冒頭には、<em>要素としてマークアップされたテキストがあり、それはテーブル(表)の形式で表示させるとすれば恐らく左側の見出しコマのように表示させるところでしょう。

そして、残りのテキストを右側の通常のコマのように表示させようと言う訳です。

実際のCSSでのスタイル。

いろいろな方法があると思いますが、ここでは最も単純なフローティングを用いて行いたいと思います。

ここでは、見出しコマとなる<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;
    }

全体のスタイルについて。

ここで、全体のスタイルとして、ボーダの組み合わせと背景色について解説しておきましょう。

ボーダの扱い
  1. ボーダは、<ol>要素全体の枠線としては幅 2ピクセルズとしておりますが、実際には<ol>要素には上は 1ピクセルしか与えておりません。

    これは、実際に各項目には上に 1ピクセルの幅の枠線を引く事で区切りとしているからです。

  2. そして、<li>要素については、左側の見出しコマに相当する部分についてパディングを含めた幅の余白を取り、更に左に 1ピクセルの幅の枠線を引いて区切りとします。
  3. そうすると、見出しに相当する<em>要素の部分(すなわち左側のコマ)の上の枠線が引かれないため、これは<em>要素にて指定します。

背景色の扱い

背景色としては、

この目的のため、

ここで、<em>要素は無色透明とします。なぜなら、<em>要素は必ずしもコマ一杯に描かれるとは限らないからです。

見出しコマに相当する箇所のスタイル。

見出しコマに相当する<em>要素は、左にフロートさせますが、このとき普通にやろうとすると<li>要素の枠内(つまり右側の本文のコマ)に収まってしまうため、左マージンにマイナスの値を入れる事で、左側の見出しコマにテキストが入るようにします。

但し、このままだと<li>要素に与えた上ボーダの影響で 1ピクセル下にずれた表示になってしまいます。

そこで、見出しコマに相当する<em>要素には position: absolute プロパティtop プロパティで 1ピクセルだけ上にずらす事とします。

ポジショニングの座標をあわせるため、親要素である<li>要素には position: relative プロパティで左上がポジショニングの絶対座標の原点となるようにします。

ところで、<ol>要素の各項目に与える番号をどうするかと言う事になります。

これは当然見出しコマのテキスト前に与えるべきものでしょう。

このため、見出しコマに相当する<em>要素の直前にはカウンタを用いて番号を付けて行きます。

その番号のリセットは、当然<ol>要素全体内で行われる事となります。

本文コマに相当する箇所のスタイル。

最後に、本文コマのスタイル調整も行いましょう。

後続のコマがブロックレヴェル要素の場合、当然上マージンが生じますが、そうすると見た目が悪くなるので、<em>要素の直後の要素に対しては margin-top プロパティで上マージン幅を零にします。

同様に、見出し以外の内容要素の下マージンも零にしております。

インターネットエクスプローラ 6.0対策。

ところで、インターネットエクスプローラ 6.0では、見出しコマの部分(<em>要素)を左にずらそうとした場合、パディング分のずれが生じるため、その分調整します。

また、見出しコマ部分を上に 1ピクセルずらす調整が逆におかしな事になるため、それを補正しております。

更に、本文コマにある段落(<p>要素)の上余白がおかしくなるため、ポジショニングで上にずらしております。

インターネットエクスプローラ 7.0対策。

一方、インターネットエクスプローラ 7.0でも、本文コマにある段落(<p>要素)の上余白がおかしくなるため、ポジショニングで上にずらしております。

実際に表示させますと…。

以上のスタイルを実際に表示させると以下のようになるでしょう。

ファイヤーフォックス 3.5の場合
ファイヤーフォックス 3.5で見ると、見出しに相当する<em>要素が左側のコマに、その他のテキストが右側のコマにと、表のように表示されるようになりました。
インターネットエクスプローラ 6.0の場合
インターネットエクスプローラ 6.0の場合、本文に<p>要素を用いていると、どうしても下に二行分の隙間が出来てしまうようですが、まあ表としては問題ないデザインにはなっております。
インターネットエクスプローラ 7.0の場合
同様にインターネットエクスプローラ 7.0の場合も、下に一行分の隙間が出来てしまうようですが、これも表としては問題ないデザインにはなっております。。

このスタイルを用いる場合の注意点。

インターネットエクスプローラ 7.0までについて

上記の通り、インターネットエクスプローラ 7.0まででは巧く行かない部分があり、スタイルを調整しております。

インターネットエクスプローラのCSSの不具合は、どうも再現性が余りないようで、試しながらやった方が良いかも知れません。

どうしても無理のようでしたら、インターネットエクスプローラ 6及び 7に対しては別のスタイルを適用する方が安全かも知れません。

また、ここまででは殆ど触れませんでしたが、インターネットエクスプローラ 7.0までではCSSのカウンタが効かないため、各項目に通し番号が付かなくなってしまいます。

この点についても問題があるかも知れません。

<em>要素について

今回、見出しコマ部分は<em>要素として話を進めましたが、本文中にも<em>要素が入る可能性は否定出来ません。

インターネットエクスプローラ 6.0を考慮しないのであれば、:first-child 擬似要素セレクタを用いれば簡単なのですが、平成21年11月現在インターネットエクスプローラ 6.0のシェアはまだ高いため、ちょっと躊躇うかも知れません。

このため、見出しとなる<em>要素にはクラス名を与える必要が生じるかも知れません。

本文のブロックレヴェル要素について

今回は本文は<p>要素のみとしましたが、他のリストなどのブロックレヴェル要素が入らないとも限りません。

その場合、やはりインターネットエクスプローラ 7.0までに付いて問題が生じるでしょう。

おまけ。

現行のウェブブラウザ(インターネットエクスプローラでは 8.0以降)であれば、displayプロパティで本当にテーブル形式で表示させる事も可能です。

具体的には、

をそれぞれ与えます。

ですが、この方法だと本文コマのパディングの調整が出来ないため、余り綺麗な表示にはならないでしょう。

また、インターネットエクスプローラ 7.0までではこれらの表示が出来ません。

しらぎくのウェブサイト作成入門サイトマップ

ページ外へのご案内。

marguerite.site@gmail.com