Specificity determines which CSS rules apply when multiple rules target the same element. Master it to write predictable, maintainable styles.
Specificity Calculation#
Selector Weights#
Comparing Specificity#
:is(), :where(), and :not()#
:has() Specificity#
Inline Styles and !important#
Common Specificity Problems#
Specificity Strategies#
Cascade Layers#
Debugging Specificity#
Reducing Specificity#
Architecture Patterns#
Best Practices#
Writing Selectors:
✓ Use single classes
✓ Avoid ID selectors
✓ Keep nesting shallow
✓ Prefer BEM or similar
Managing Specificity:
✓ Use cascade layers
✓ Use :where() for defaults
✓ Keep specificity flat
✓ Document exceptions
Avoiding Problems:
✓ Never use !important (except utilities)
✓ Don't over-qualify selectors
✓ Avoid inline styles
✓ Be consistent with methodology
Debugging:
✓ Use DevTools
✓ Check crossed-out styles
✓ Calculate specificity
✓ Test overrides
Quick Reference#
Specificity (Inline, ID, Class, Type):
Universal (*) 0,0,0,0
Type (div) 0,0,0,1
Pseudo-element (::) 0,0,0,1
Class (.class) 0,0,1,0
Attribute ([attr]) 0,0,1,0
Pseudo-class (:hover) 0,0,1,0
ID (#id) 0,1,0,0
Inline style 1,0,0,0
!important Beats all*
Special:
:where() 0,0,0,0 (zero)
:is() Uses highest inside
:not() Uses argument
:has() Uses argument
Conclusion#
Specificity determines which CSS rules apply when selectors conflict. Keep specificity low and flat using single-class selectors and methodologies like BEM. Use :where() for base styles that should be easily overridable, and leverage cascade layers for architectural control. Avoid ID selectors, deep nesting, and !important to maintain predictable, maintainable stylesheets.