問題点
- CSSでスタイリングしていると、しばしばCSSの競合が発生し、意図しないスタイルが適用されることがある。
- このような競合は、たいていUIライブラリ、サードパーティ製ウィジェット、あるいは別のチームが管理しているCSSコードが原因だが、その場合はCSSを自由に修正できないことが多い。
- 特にUIライブラリやサードパーティ由来のCSSと衝突する場合、HTMLに追加のclassやIDを加えることも難しいことがある。
- さらに、競合の原因となっているCSSコードが非常に具体的に書かれている場合、自分のCSSの優先順位を上げるために、さらに具体的に書くことも不可能な場合がある。
- このとき多くの開発者は安易に
!importantを使うが、これは推奨される方法ではない。
解決策
- セレクタを繰り返して使えばよい。
- たとえば
.checkbox__icon.checkbox__icon は単一の .checkbox__icon より高い優先順位を持つ。
- この方法はCSSの裏技のように感じられるかもしれないが、CSS Selectors Level 4 仕様を見ると、"Repeated occurrences of the same simple selector are allowed and do increase specificity.(同じ単純セレクタの繰り返しは許可されており、詳細度を高める)" と明記されている。
7件のコメント
いまでは CSS Cascade Layers(
@layer)が主要ブラウザーでどれもサポートされているので、もうこの種の hack に頼らなくてもよさそうです。https://developer.mozilla.org/en-US/docs/Web/CSS/@layer
https://caniuse.com/css-cascade-layers
ああ、だから styled-components では
&&を使う方法でスタイルを上書きするんですね?学生、文を下げて
黒魔術っぽい感じですね(笑)
これからはこんなコードを見ることになりそうですね。
.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon.checkbox__icon
おお、これは知りませんでした……
状況によっては、セレクタを複数回繰り返すプリプロセッサを作って使ってみるのもありそうですね。
おお、知らなかった方法ですね