본문 바로가기
기술

CSS 가상 선택자 정리, 가상 클래스, 가상 요소

by 해피스트 2025. 3. 14.

종종 사용하는 CSS 가상 선택자를 사용할 때 찾아보는 수고를 덜기 위해 정리한다. 

  1. CSS 가상 선택자 정리
  2. CSS 가상 클래스와 가상 요소 차이
  3. CSS :hover, ::before, :nth-child 사용법

CSS 가상 선택자는 특정 상태의 요소를 선택하거나, 특정 요소 내부의 부분을 스타일링할 수 있도록 도와주는 선택자다.

가상 선택자는 : 또는 ::로 시작하며, 크게 가상 클래스가상 요소로 나뉜다.


1. 가상 클래스 (:)

요소의 특정 상태나 사용자 동작에 따라 스타일을 적용하는 선택자입니다.

(1) 동적 상태 관련

선택자 설명

:hover 마우스를 올렸을 때 적용
:active 클릭되었을 때 적용
:focus 포커스가 맞춰졌을 때 적용 (ex. 입력 필드)
:focus-visible 키보드로 포커스 이동 시만 스타일 적용 (브라우저 자동 판단)

(2) 구조적 선택자

선택자 설명

:first-child 부모의 첫 번째 자식 요소
:last-child 부모의 마지막 자식 요소
:nth-child(n) 부모의 n번째 자식 요소 (n은 숫자, 수식 가능)
:nth-last-child(n) 뒤에서부터 n번째 자식 요소
:only-child 부모 안에 유일한 자식 요소일 때 적용
:first-of-type 같은 태그 중 첫 번째 요소
:last-of-type 같은 태그 중 마지막 요소
:nth-of-type(n) 같은 태그 중 n번째 요소
:nth-last-of-type(n) 같은 태그 중 뒤에서 n번째 요소
:only-of-type 특정 태그가 부모 안에서 유일할 때 적용

 

예제

p:first-child { color: red; }  /* 부모의 첫 번째 자식이 <p>라면 빨강색 */
p:nth-child(2) { font-weight: bold; }  /* 부모의 두 번째 자식이 <p>라면 굵게 */

(3) 상태 관련 선택자

선택자 설명

:checked 체크된 <input type="checkbox">, <input type="radio"> 요소
:disabled 비활성화된 <input>, <button> 요소
:enabled 활성화된 <input>, <button> 요소
:required required 속성이 있는 <input> 요소
:optional required 속성이 없는 <input> 요소
:valid 유효한 입력값을 가진 <input> 요소
:invalid 유효하지 않은 입력값을 가진 <input> 요소

 

예제

input:focus { border: 2px solid blue; } /* 포커스된 input 테두리 변경 */
input:valid { background-color: lightgreen; } /* 유효한 입력값일 때 배경 변경 */

(4) 기타 특수 선택자

선택자 설명

:not(선택자) 특정 선택자를 제외한 요소 선택
:is(선택자1, 선택자2, …) 여러 선택자 중 하나라도 해당하면 선택
:where(선택자1, 선택자2, …) :is()와 같지만, 우선순위가 0
:has(선택자) 특정 요소를 포함한 부모 요소 선택

 

예제

p:not(.no-style) { color: blue; }  /* .no-style 클래스가 없는 <p>만 파랑색 */
:is(h1, h2, h3) { font-family: Arial; }  /* h1, h2, h3에 같은 폰트 적용 */
div:has(img) { border: 2px solid red; }  /* <img>를 포함한 <div>에 빨간 테두리 */

2. 가상 요소 (::)

요소의 특정 부분을 스타일링하는 선택자로, 반드시 ::을 사용합니다.

선택자 설명

::before 요소의 앞에 콘텐츠 추가
::after 요소의 뒤에 콘텐츠 추가
::first-letter 첫 번째 문자 스타일 변경
::first-line 첫 번째 줄 스타일 변경
::selection 사용자가 선택한 텍스트 스타일 변경
::placeholder 입력 필드의 placeholder 스타일 변경
::marker 목록(list-item)의 마커 스타일 변경

 

예제

p::before { content: "★ "; color: gold; }  /* 문장 앞에 별 추가 */
p::after { content: " ✨"; }  /* 문장 끝에 이모지 추가 */
p::first-letter { font-size: 2em; font-weight: bold; }  /* 첫 글자 강조 */
p::selection { background: yellow; color: black; }  /* 선택한 텍스트 스타일 변경 */

3. 가상 선택자 예제 코드

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS 가상 선택자 예제</title>
    <style>
        /* 가상 클래스 */
        button:hover { background-color: lightblue; }
        input:focus { border: 2px solid green; }
        p:nth-child(2) { color: red; }

        /* 가상 요소 */
        p::before { content: "🌟 "; color: gold; }
        p::after { content: " ✔"; }
        p::first-letter { font-size: 1.5em; font-weight: bold; }

        /* ::selection */
        ::selection { background: yellow; color: black; }
    </style>
</head>
<body>
    <button>마우스를 올려보세요</button>
    <input type="text" placeholder="입력해 보세요">
    <p>첫 번째 문장</p>
    <p>두 번째 문장</p>
</body>
</html>

4. 결론

  • 가상 클래스 (:) → 요소의 특정 상태를 선택
  • 가상 요소 (::) → 요소 내부의 특정 부분을 스타일링

가상 선택자는 CSS의 강력한 기능 중 하나로, UX/UI 디자인을 더 직관적이고 세밀하게 조정할 수 있다. 


* nth-child / nth-of-type 정리 

부모 안에 모든 요소 중 N번째 요소 

:nth-child(N)

:nth-child(1) 첫번째 선택

:nth-child(2n) 짝수번째 선택 

:nth-child(2n+1) 첫번째 요소부터 2번째 마다 선택

:nth-child(2n+5) 5번째부터 2번째 마다 선택

:nth-child(-2n_5) 첫번째 요소부터 5번째 요소까지 2번째 마다 선택

:nth-child(n+5) 5번째부터 모두 선택

:nth-child(-n+5) 첫번째부터 5번개까지 선택

:nth-child(n+3):nth-child(-n+8) 세번째부터 8번째까지 선택 

:nth-child(odd) 홀수 선택

:nth-child(even) 짝수 선택 

 

부모 안에 A라는 요소 중 N번째 요소

A:nth-child(N)

p:nth-of-type(n+2):nth-of-type(-n+5) 두번째 p부터 5번째 p까지 선택  

 

부모 안에 모든 요소 중 첫번째 요소 

:first-child

 

부모 안에 모든 요소 중 마지막 요소 

:last-child

 

부모 안에 A라는 요소 중 첫번째 요소

A:first-child

 

부모 안에 A라는 요소 중 마지막 요소

A:last-child

 

:nth-child 와 :nth-of-type 차이 

nth-child는 부모 안의 모든 요소로 부터 n차 순으로 지정, 

nth-of-type은 부모 안의 해당 요소의 n차 순으로 지정 

 

CSS 가상 선택자 정리, 가상 클래스, 가상 요소

반응형

댓글