CSS 의사 요소
작성일 : 2025.03.12
CSS 의사 요소(Pseudo-Elements): 웹 디자인의 숨은 영웅
웹 개발을 하다 보면 HTML 요소를 추가하지 않고도 시각적 효과를 구현해야 할 때가 많습니다. 이럴 때 구원자와 같은 역할을 하는 것이 바로 CSS의 **의사 요소(Pseudo-Elements)**입니다. 의사 요소는 실제 DOM에 존재하지 않는 가상의 요소를 선택해 스타일을 적용할 수 있게 해주는 강력한 CSS 기능입니다. 오늘은 이 의사 요소에 대해 자세히 알아보겠습니다.
의사 요소란?
의사 요소(Pseudo-Element)는 HTML 문서에 실제로 존재하지 않는 "가상의" 요소를 선택할 수 있게 해주는 CSS 선택자입니다. 이를 통해 문서의 특정 부분에 스타일을 적용하거나, 완전히 새로운 시각적 요소를 추가할 수 있습니다.
의사 요소는 더블 콜론(::)으로 표시합니다:
선택자::의사요소 {
속성: 값;
}
예를 들어, 모든 단락의 첫 글자를 크게 표시하고 싶다면:
p::first-letter {
font-size: 2em;
font-weight: bold;
color: darkred;
}
의사 요소 vs 의사 클래스
의사 요소는 종종 의사 클래스(Pseudo-Classes)와 혼동됩니다. 둘 다 콜론을 사용하지만 그 목적과 기능은 다릅니다:
- 의사 요소(::): 요소의 특정 부분을 선택하거나 가상의 요소를 생성합니다.
- 의사 클래스(:): 요소의 특정 상태에 기반하여 선택합니다.
예를 들어:
a:hover- 의사 클래스: 마우스가 링크 위에 있을 때p::first-line- 의사 요소: 단락의 첫 번째 줄
역사적 참고: CSS2에서는 의사 요소도 단일 콜론(:)을 사용했습니다. CSS3에서 의사 클래스와 의사 요소를 구분하기 위해 더블 콜론(::)이 도입되었으나, 하위 호환성을 위해 대부분의 브라우저는 이전 문법도 지원합니다.
주요 의사 요소 종류
1. ::before와 ::after
가장 많이 사용되는 의사 요소로, 선택한 요소의 내용 앞이나 뒤에 가상 요소를 생성합니다. 이 요소들을 사용할 때는 반드시 content 속성을 지정해야 합니다.
blockquote::before {
content: """;
font-size: 3em;
color: #ccc;
}
blockquote::after {
content: """;
font-size: 3em;
color: #ccc;
}
2. ::first-line
요소의 첫 번째 줄에 스타일을 적용합니다. 화면 크기가 변하면 첫 줄에 해당하는 텍스트도 동적으로 변합니다.
p::first-line {
font-variant: small-caps;
color: #663399;
}
3. ::first-letter
요소의 첫 글자에 스타일을 적용합니다.
p::first-letter {
font-size: 2em;
float: left;
margin-right: 5px;
color: #ff4500;
}
4. ::selection
사용자가 선택한(드래그한) 텍스트에 스타일을 적용합니다.
::selection {
background-color: #ffb7b7;
color: #333;
}
5. ::placeholder
입력 필드의 플레이스홀더 텍스트에 스타일을 적용합니다.
input::placeholder {
color: #aaa;
font-style: italic;
}
6. ::marker
목록 항목의 마커(불릿, 숫자 등)에 스타일을 적용합니다.
li::marker {
color: #ff6b6b;
font-weight: bold;
}
::before와 ::after 활용 사례
::before와 ::after는 가장 유연하고 강력한 의사 요소로, 다양한 디자인 패턴에 활용됩니다.
1. 장식 요소 추가
h2::before,
h2::after {
content: "";
display: inline-block;
width: 30px;
height: 2px;
background: #333;
margin: 0 10px;
vertical-align: middle;
}
2. 툴팁 삼각형 화살표 만들기
.tooltip::before {
content: "";
position: absolute;
top: -10px;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent black transparent;
}
3. 아이콘 추가하기
.external-link::after {
content: "↗";
display: inline-block;
margin-left: 5px;
font-size: 0.8em;
}
4. 클리어픽스(Clearfix)
플로팅된 요소를 포함하는 컨테이너의 높이 문제를 해결하는 전통적인 방법입니다.
.clearfix::after {
content: "";
display: block;
clear: both;
}