【CSS】リストの先頭のマーカー文字を絵文字にしたい、それも li ごとに違う絵文字に
2022-08-08-1
[Programming][JavaScript]
li ごとにそれぞれ別の絵文字をマーカー文字として設定したい。
しかし、list-item-style で一つ一つ li に設定するのは面倒。
なので、li の先頭文字をリストのマーカー文字にする作戦!
こんな感じになりました。
(サービス適用例: キンセリの「定番セール」コーナー)
サンプルコード (HTML, CSS, JavaScript):
なお、最初は
しかし、list-item-style で一つ一つ li に設定するのは面倒。
なので、li の先頭文字をリストのマーカー文字にする作戦!
- li の先頭文字の取得。
e.innerText.spit('')[0]
だとサロゲートペア非対応で絵文字が壊れる。
Array.from(e.innerText)[0]
でいける。
これをマーカー文字として JavaScript で設定すれば良い。 - マーカー文字で使う先頭文字を li 本体で非表示にする。
そうしないと二重で表示されるので。
擬似要素::first-letter
を使う。
しかし利用可能プロパティの制約がきつい。
display: none
が使えないのはつらい。
とりあえず透明にして全体を左にずらすことに。
こんな感じになりました。
(サービス適用例: キンセリの「定番セール」コーナー)
サンプルコード (HTML, CSS, JavaScript):
<ul class="c20220808"> <li>💫定期開催 <ul> <li>➜<a href="">🌞日替わりセール</a> <a href="">🌛月替わりセール</a> </li> </ul> <li>💰<a href="">ポイント還元対象作品</a> <ul> <li>🅿<a href="">31%以上</a> <ul><li>➜<a href="">💭マンガ</a> <a href="">🧙ラノベ</a> <a href="">📔文学</a> <a href="">🧪科学</a> <a href="">📊ビジネス</a> </li> </ul> </li> </ul> <style> .c20220808 li::first-letter { color: transparent; margin-left: -1em; } </style> <script> Array.from(document.querySelectorAll('.c20220808 li')).forEach( function(e){ e.style.listStyleType = '"' + Array.from(e.innerText)[0] + '"'; } ); </script>
なお、最初は
list-style-type: none
で良いかと思ったのですが、折り返しが発生したときに「コレジャナイ!」となりました。
- "list-style-type: none" のとき (コレジャナイ!)
- 📕おはようございます。
- 📕こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
- マーカー文字が📕のとき (コレダ!)
- おはようございます。
- こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
参考
この記事に言及しているこのブログ内の記事