最弱が
最強
弱いことが革命を起こす
- これまでは如何に深くセレクタを積み重ねるかで優先度が決定していた
最弱魔法、まるで素人小説のタイトルの様ですが、これが疑似クラス:where()の真髄です。
括弧に内包するすべてのセレクタの優先度を無(詳細度をゼロ)にします。
これまでのセレクタの記述方法は構造の積み重ねでした。たとえば、下記のようなHTMLがある場合<main> <section id="primary"> <h2>CSS記述 をスリム化しつつ、管理</h2> <section id="contents"> <div class="columnArea"> <h3 class="first">はじ めに</h3> <div class="contentsRoot">文章</div> <h3 class="second">解説</h3> <div class="contentsRoot">文章</div> <h3 class="third">実践</h3> <div class="contentsRoot">文章</div> <h3 class="forth">コード</h3> <div class="contentsRoot">文章</div> <!-- 以下省略 --> - まずはCSSの設定は構造の組み込みから
h3のスタイルを設定したい時、まず最初に複数あるh3全体のスタイルを設定します。
その場合、他の段落や章などでもh3が使われる可能性が高いので構造の決め込みが必要になります。
たとえば…、mainの中のsectionの中のさらにsectionの中の、って二つあるからID名がいるな…、3段コラムにしたいから.columnAreaもいるな…、という感じで下記の様なCSSを設計するわけですが/* CSS */ main section#primary section#contents .columnArea h3{ margin: 0 0 8px 0; padding-bottom: 4px; font-size: 20px; font-weight: bold; color: #6aacfc; border-bottom: 1px solid #efefef; } - ちょっと変更したい
ここで、次の二番目のh3の色や背景色を変えたくなった場合、columnAreaの中の二番目ということで下記のようにすればOKにみえますが…
.columnArea h3.second { color: blue; } この指定では効きません。
最初のセレクタに詳細度で負けているからです。
細かく設定したつもりの『second』クラス付与も効果がありません。
この最初のセレクタを上書きするためには、それ以上のセレクタを積み重ねて、詳細度を強くしないと意図通りにスタイルが反映されません。
下記で試してみましょう。
それぞれセレクタの積み重ね度合いを変えてあります。main section#primary section#contents .columnArea h3{ margin: 0 0 8px 0; padding-bottom: 4px; font-size: 20px; font-weight: bold; color: #6aacfc; border-bottom: 1px solid #efefef; } .columnArea h3.second{ color: blue; } main section#contents h3.third{ color: green; } main section#primary section#contents .columnArea h3.forth{ color: orange; }- 構造が優先度(詳細度)を決定する
この中で意図通りにスタイルが反映されるのは、最後のより長くセレクタを積み重ねた設定だけです。
つまり、いったん深いセレクタの積み重ねをやってしまうと、次はもっと深く、次はもっと、と元には戻れない状況が延々と続いていきます。みなさんも身につまされますね
CSSを積み重ねるデモ:https://labo.studio-happyvalley.com/where/nowhere/ - 詳細度をゼロにする:where()
そんな中現れたのが最弱魔法の:where()です。
:where()は詳細度をゼロにします。
下記の様に記述すると積み重ねたセレクタの塊を跡形もなく粉砕します。
積み重なった優先度は無にしつつ、積み重ねた構造はそのまま生かします。:where(main section#primary section#contents .columnArea) h3{ margin: 0 0 8px 0; padding-bottom: 4px; font-size: 20px; font-weight: bold; color: #6aacfc; border-bottom: 1px solid #efefef; } :where(.columnArea) h3.second{ color: blue; } :where(.columnArea) h3.third{ color: green; } :where(.columnArea) h3.forth{ color: orange; } - :where()で構造と詳細度を分離したデモ
:where()で構造と詳細度を分離したデモ:https://labo.studio-happyvalley.com/where/where/
ここまで、:where()の革命的な真髄を味わっていただいたところで、いよいよ本題です。
同時に、正しい理解のためには詳細度も理解する必要があります。次の段落より:where()と合わせて詳細度を詳しく解説します。