캐스케이드에서 레이어까지 비겼을 때, 선택자가 요소를 얼마나 구체적으로 가리키는지로 승부를 내는 점수. (A, B, C) 세 자리로 매기고 앞자리부터 비교한다.
| 자리 | 세는 것 | 예 |
|---|---|---|
| A | ID 선택자 | #header |
| B | 클래스, 속성 선택자(Attribute Selector), 가상 클래스(Pseudo-class) | .btn, [disabled], :hover |
| C | 태그, 가상 요소(Pseudo-element) | div, ::before |
#nav .list li a:hover { } /* (1, 2, 2) */
.list li a { } /* (0, 1, 2) */직관과 다른 점
- 속성 선택자(
[type="email"])는 클래스와 같은 B 자리다 → 속성 선택자와 형제 선택자 - 자리별 비교라서 낮은 자리를 아무리 쌓아도 높은 자리 하나를 못 이긴다. 클래스 11개
(0, 11, 0)도 ID 하나(1, 0, 0)에 진다 - 점수에 들어가지 않는 것: 전체 선택자(Universal Selector)
*, 결합자(Combinator,>,+,~, 공백)..section *의 명시도는.section하나만큼인(0, 1, 0)이다 :where()는 안에 무엇을 넣어도 0이다. 라이브러리가 덮어쓰기 쉬운 기본 스타일을 만들 때 쓴다:is(),:not(),:has()는 자신은 0이고 괄호 안에서 가장 센 인자의 점수를 가져온다.:is(#a, .b) span은(1, 0, 1)이다- 완전히 같으면 나중에 선언된 규칙이 이긴다
인라인 스타일과 !important
둘 다 명시도보다 위 단계에서 갈린다. 인라인 스타일은 어떤 선택자 규칙보다 세고, !important는 그마저 이긴다. !important끼리 부딪히면 그때 다시 레이어와 명시도로 비교한다. 명시도를 올려서 이기려 하기보다 @layer로 순서를 정하면 싸움 자체가 줄어든다.