CSS
가상 클래스(:)와 가상 엘리먼트(::)의 차이
by yoora · 2025-08-16
- 목차 -
CSS 선택자 사용시 가상 클래스 (:)와 가상 엘리먼트(::)는 어떤 기준으로 구분하며, 이 두가지에 어떤 차이가 있는지 알아보았습니다.
개념
- 가상 클래스 (Pseudo-class, :
)
- 정의 :
- HTML 문서 구조(DOM)에는 명시적으로 존재하지 않지만, 요소의 특정 상태(예: 사용자 상호작용)나 조건(예: 문서 내 위치)을 만족할 때 해당 요소를 선택하는 선택자
- 역할 :
- 사용자 동작(예: hover, focus)이나 문서 구조(예: 첫 번째 요소, 마지막 요소)에 따라 스타일을 동적으로 적용. 요소 자체를 변경하지 않고 상태를 기반으로 필터링.
- 문법 :
- 단일 콜론(
:
)사용.예::hover, :nth-child(2n)
. - 적용대상 :
- 이미 DOM에 존재하는 실제 요소의 상태나 위치를 나타냄. 가상 클래스는 요소를 선택하는데 초점을 맞추며, 새로운 콘텐츠를 생성하지 않음.
- 가상 요소 (Pseudo-element, ::
)
- 정의 :
- 실제 HTML에 없는 가상의 요소를 생성하거나, 기존 요소의 특정 부분을 선택하여 스타일을 적용하는 선택자.
- 역할 :
- 기존 요소의 일부분(예: 첫글자, 첫 줄)이나 앞/뒤에 새로운 콘텐츠(예: 아이콘, 장식)를 추가하여 시각적으로 확장.
- 문법 :
- 이중 콜론
::
사용.CSS3부터 권장 표준으로 채택; CSS2 시절에는 단일 콜론으로 호환 가능하나, 이제는::
를 사용하는 것이 좋음. - 적용대상 :
- 요소의 일부 콘텐츠나 새로 생성된 가상 콘텐츠.가상 요소는 DOM 트리에 실제 노드로 추가되지 않으며, CSS렌더링 계층에서만 처리됨. 따라서 JavaScript로 직접 접근 불가
주요 차이점
구분 | 가상 클래스 : | 가상 요소 :: |
---|---|---|
기능 | 요소의 상태나 조건 선택(필터링 역할) | 가상의 콘텐츠를 생성 또는 요소의 특정 부분 선택(확장 역할) |
문법 | :hover , :first-child 등 | ::before , ::after 등 |
적용 대상 | 기존 DOM 요소의 상태(전체 요소 대상) | 기존 요소의 내부/외부에 생성된 가상 부분(부분적 또는 추가 콘텐츠) |
DOM 반영 여부 | DOM 구조 변화 없음 | CSS로 시각적 요소만 생성(DOM 트리에는 반영되지 않음; 개발자 도구에서 가상으로 보일 수 있음) |
CSS3 표준 권장 | 콜론 1개(항상) | 콜론 2개(: 단일 콜론도 하위 호환성(IE8이하) 위해 지원) |
재사용성 | 여러 상태를 동시에 적용 가능(예: :hover:focus ) | 하나의 요소에 제한적으로 적용 |
사용 시 주의사항
1. 브라우저 호환성
::
문법은 CSS3(2011년)부터 표준이며, 2025년 기준으로 Chrome, Firefox, Safari, Edge 등 주요 브라우저에서 100% 지원.- 구형 브라우저(예: IE8이하) 지원 시
:before
같은 단일 콜론 사용. - 일부 가상 요소(예:
::marker
) 는 비교적 최근 부터 지원되므로, 폴백 스타일 고려 필요.
2. 접근성(ARIA)
::before
,::after
에 넣은content
는 스크린 리더(예: NVDA, VoiceOver)가 무시하거나 선택적으로 읽을 수 있음. 정보는 실제 HTML 요소로 구현 필요.- ARIA 속성을 가상 요소에 직접 적용 불가; 대신 부모 요소에 적용.
3. 선택자 우선순위
- 가상 클래스와 가상 요소 모두 기본 선택자의 우선순위를 따름. (예:
#id:hover
는 클래스보다 우선순위가 높음).
4. content 필수 여부
::before
,::after
는 반드시content
속성이 있어야 생성됨. (빈 문자열 가능)content
에 URL(이미지)이나 attr(HTML 속성 값) 사용 가능, 동적 콘텐츠 생성에 유용.
5. 주의: 제한 사항
- 가상 요소는 인라인 요소(예:
<span>
)에 적용 시 블록처럼 동작할 수 있음. - 가상 클래스 중 일부(예: )
:not()
는 복합 선택자로 확장 가능. - 성능: 과도한 가상 요소 사용은 렌더링 비용증가; 간단한 스타일링에 한정 필요.