簡単に言えば、順序付きリストを次のように機能させたいと考えています。
1. Foo
2. Bar
3a. Baz
3b. Qux
4. Etc...
HTMLでこれらの行に沿って何かを簡単に行う方法はありますか?
簡単に言えば、順序付きリストを次のように機能させたいと考えています。
1. Foo
2. Bar
3a. Baz
3b. Qux
4. Etc...
HTMLでこれらの行に沿って何かを簡単に行う方法はありますか?
次のマークアップがあるとします。
<ol>
<li>Foo</li>
<li>
<ol>
<li>bar</li>
<li>baz</li>
</ol>
</li>
<li>Something else...</li>
</ol>
次の CSSはほとんど機能します。
ol {
counter-reset: topLevel;
}
li {
counter-increment: topLevel;
margin-left: 1em;
}
li::before {
content: counter(topLevel) '. ';
margin-right: 0.3em;
}
ol ol {
counter-reset: secondLevel;
}
ol ol li {
counter-increment: secondLevel;
}
ol ol li::before {
content: counter(topLevel) counter(secondLevel, lower-alpha) '. ';
}
これに関する唯一の問題は、これまでのところ、内側の要素 (必要に応じて) と外側の要素 (それらの内側の要素を含む)topLevel
の両方に対するカウントが含まれていることです。li
li
そして、上記の問題は解決しました!...CSS:not()
セレクターをサポートするブラウザーでは:
ol {
counter-reset: topLevel;
}
li {
counter-increment: topLevel;
margin-left: 1em;
}
li:not(.hasChild)::before {
content: counter(topLevel) '. ';
margin-right: 0.3em;
}
ol ol {
counter-reset: secondLevel;
}
ol ol li {
counter-increment: secondLevel;
}
ol ol li::before,
ol li.hasChild ol li::before {
content: counter(topLevel) counter(secondLevel, lower-alpha) '. ';
}
(もともと)これが機能するために(CSSには親セレクターがないため(まだ)) 、番号の重複を適切に隠すためにli
、子要素を持つ要素に特定のクラスを追加する必要があることに注意するのを忘れていました。ol
この場合、クラス名を選択し.hasChild
ました (フィドルで確認できます)。
ちなみに、li:not(.hasChild)::before
ルールを少し変更すると、テキストを右揃えにすることができます。
li:not(.hasChild)::before {
content: counter(topLevel) '. ';
width: 2em;
margin-right: 0.3em;
display: inline-block;
text-align: right;
}
それはあなたの要件を完全には満たしておらず、html にいくつかの (面倒な) 変更を必要としますが、あなたが得られるのと同じくらい近いと思います.
<ol>
<li>one</li>
<li class="has_children">
<ol>
<li>two.one</li>
<li>two.two</li>
<li>two.three</li>
</ol>
</li>
</ol>
ol,li{
padding:0;
margin:0;
}
ol { counter-reset: item }
li { display: block; padding-left: 0 }
li:before {
content: counters(item, ".") " ";
counter-increment: item
}
LI.has_children:before {
content: " ";
counter-increment: item
}
数字と文字を混在させることはできないと思うので、これは数字のみです。andli
を含む andを選択するセレクターがないため、 child を持つol
any にクラスを追加する必要があります。li
ol