CSS 선택자 우선순위는 스타일 충돌 시 어떤 규칙이 더 강한지 결정하는 기준입니다.
우선순위는 A-B-C-D(4자리) 방식으로 계산됩니다.


✅ 1. 우선순위 점수 구조

범주 설명 예시 점수
A 인라인 스타일 <div style="color:red"> 1000
B ID 선택자 #main 100
C 클래스 / 속성 / 가상 클래스 .note, [type=text], :hover 10
D 태그 / 가상 요소 div, h1, ::before 1

✅ 2. 점수가 포함되는 모든 요소

✔ A. 인라인 스타일 (1000점)

<div style="color: red"></div>

✔ B. ID 선택자 (100점)

#main {}
#header {}

✔ C. 클래스 / 속성 선택자 / 가상 클래스 (10점)

클래스 선택자

.note {}
.active {}

속성 선택자

input[type="text"] {}
a[target="_blank"] {}

가상 클래스 (pseudo-class)

:hover
:focus
:nth-child(2)
:checked

:not() 주의

  • :not() 자체는 점수 없음
  • 괄호 내부는 계산됨
:not(.active)   /* = 클래스 10점 */

✔ D. 태그 선택자 + 가상 요소 (1점)

태그

div
span
ul li

가상 요소

::before
::after
::placeholder

❌ 3. 점수 없는 요소

요소 점수 설명
* 0 전체 선택자
> + ~ 0 결합자(combinator)
:where() 0 명시적으로 우선순위 0
선택자 연결을 위한 공백 0 계산 대상 아님

✨ 4. :is() / :not() / :where() 동작 정리

:is() → 괄호 안에서 가장 높은 것만 계산

:is(.a, #b)   /* #b → 100점 */

:not() → 괄호 안 내용만 계산

:not(.active)   /* 10점 */

:where() → 항상 0점

:where(.box, #id)   /* 0점 */

📘 5. 우선순위 계산 예제

1) ul#list li.note:hover

선택자 점수
#list 100
.note 10
:hover 10
ul 1
li 1

총점 = 122점


2) div::before

  • div = 1
  • ::before = 1
    총 2점

3) a[href][target=_blank]:hover

  • a = 1
  • [href] = 10
  • [target] = 10
  • :hover = 10

총점 = 31점


🎯 6. 최종 요약

범주 점수 포함 요소
A 1000 인라인 스타일
B 100 ID
C 10 클래스, 속성, 가상 클래스
D 1 태그, 가상 요소
0점 0 *, 결합자, :where()