CSSの小技として、<ol>要素に於いて見られるファイヤーフォックス等"もじら系ユーザエージェント"のバグへの対策です。
ファイヤーフォックス等にはどのようなバグがあるのか (平成19年 6月 1日 更新)
どのようにして対策を立てるか (平成19年 6月12日 更新)
具体的な対策 (平成19年 6月12日 更新)
現行のファイヤーフォックス(ヴァージョン 1.5.x.〜2.0.x.)等の"もじら系ユーザエージェント"では、ある条件で<ol>要素に於いてバグが発生します。
具体的には、
display: list-itemプロパティが与えられた<li>以外の要素が含まれていると、その要素の分だけカウントが増えてしまう。と言うものです。
ちょっと分かり難い説明ですので、具体例を挙げてみましょう。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html lang="ja"><head><meta http-equiv="content-type" content="text/html;charset=shift_jis"><meta http-equiv="content-style-type" content="text/css"><title><ol>要素のサンプル</title><style type="text/css">dl, ol li p { margin-left: 1em; }dt, ol li p { display: list-item; list-style-type: disc; }</style></head><body><ol><li>一番目</li><li><p>二番目は二つあります。</p><dl><dt>二番目の一</dt><dd>二番目の一の意味</dd><dt>二番目の二</dt><dd>二番目の二の意味</dd></dl></li><li>三番目</li></ol></body></html>
これを、ファイヤーフォックス 2.0.0.3とオペラ 9.20で見てみましょう。
display: list-itemプロパティが付いた要素が三つ入っているため、その分カウントが飛んで結局 1., 2., 6.と言うナンバリングとなりました。このようなバグは他のユーザエージェントでは見られないようです。
display: list-itemプロパティを一切使わない事くらいしか対処法がありません。一応、HTMLの仕様書には、<ol>要素直下の<li>要素には飛び飛びにならないように番号を付けなければいけないとは書かれておりません。
とは言え、飛び飛びになっている順序付きリストを見た閲覧者は違和感を感じる事でしょう。
そこで、この対策を執ってみたいと思います。
display: list-itemプロパティを与えた要素が存在しないのであれば、生じる事は無く、従って対処する必要さえありません。すなわち、display: list-itemプロパティを使わないと言うのも対策の一つと言えます。<ol>要素、すなわち順序付きリストのリスト項目に付ける番号は、CSSではカウンタとして提供されている機構が対応します。
そこで、カウンタで番号を付け直す事とします。
このとき、
ので、
と言う事を抑えておきましょう。
インターネットエクスプローラ及びサファリ 2.0までにもカウンタは実装されておりませんが、インターネットエクスプローラについては簡単な方法で回避する事が出来ます。
具体的な対策としては、以下のようにします。
/* \*/ol { counter-reset: item; }ol>li {margin-top: 0;margin-left: 0.5em;list-style-type: none;line-height: 1em;/* 必ず適切な値を指定して下さい。 */}ol>li:before {display: block;margin: 0 0 -1em -1.5em;line-height: 1em;content: counter(item) '. ';counter-increment: item;}ol>li>*:first-child {margin-top: 0;}/* */ /* IE 7.x対策 */*+html ol>li {list-style-tye: decimal;margin-left: 0;}/* サファリ 2.0までの対策 \*/html:\66irst-child ol>li { list-style-type: decimal; }html:\66irst-child ol>li:before { content: "\a0"; }/* */
この定義は以下のようになります。
itemカウンタをクリアします。itemカウンタの番号を附与して、且つitemカウンタのカウントアップを行います。このとき、表示位置をmarginプロパティで調整します。最後に、インターネットエクスプローラ 7.xでしか認識されないある要素に続く>html>要素に含まれる<ol>要素直下の<li>要素に対してlist-style-tye: decimalプロパティを与える事で、カウンタを実装していないインターネットエクスプローラ 7.xでもちゃんと番号が表示されるようにします(この番号はデフォルトスタイルで与えられるものです)。
*+html …と言うセレクタは、インターネットエクスプローラ 7.xでのみ通用するセレクタです。他のユーザエージェントでは該当する要素は存在し得ないので結果的に無効になりますが、なぜかインターネットエクスプローラ 7.xでは有効となります。尚、インターネットエクスプローラ 6.x以前では、
ともに認識しないため、一連のプロパティ定義は全て無効となります。
但し、念のためマッキントッシュ版のインターネットエクスプローラに認識させないために、二つのコメント/* \*/と/* */で囲んでおきます。
display: list-itemプロパティが付いているため、インターネットエクスプローラでは二番目のリストアイテムに於いて番号が表示されない不具合があるようです。このため、この点にも別途対処する必要があるかも知れません。サファリ 2.xまでにはカウンタが実装されていないため、サファリのバグを用いてこれらを無効にするプロパティ定義を行います。
具体的には、html:\66irst-childの下位セレクタで、<ol>要素及び<ol>要素直下の<li>要素のスタイルをキャンセルします。
但し、contentプロパティにnone値を入れてもキャンセルされないため(contentプロパティにnone値は定義されていないため)、"\a0"(通常の半角空白とは別の空白文字)だけを出すようにします。
更に綺麗な表示になるようにするため、以下のような工夫も行います。(以下平成19年 4月27日)
ol>li)にline-heightプロパティで適切な行の高さを指定します。続いて、<ol>要素直下の<li>要素の直前(セレクタは ol>li:before)について、以下のプロパティを与えます。
まず、display: blockプロパティを与えます。
display: inlineプロパティだと、直下にブロックレヴェル要素が入ったときに勝手に改行されてしまうからです。display: blockプロパティでも改行は止められませんが、上下のマージンを変更出来るため改行を実質的に無効に出来ます。続いて、ol>liに与えたline-heightプロパティ値と同一の値のline-heightプロパティを与えます。
こうする事で、ol>li要素の本体は、表示される番号と同じ高さになります。
具体的には、
display: blockプロパティを与えているため、番号を表示した後の文字はline-heightプロパティの値ぶん真下に改行されます。実際にこのスタイルを与えた場合にファイヤーフォックスでどのように表示されるのかを見てみましょう。