
CSS 선택자 가이드
- CSS 선택자는 HTML 문서에서 스타일을 적용할 요소를 선택하는 데 사용.
- 다양한 선택자를 조합해서 특정 요소를 정확하게 선택하고 스타일을 지정할 수 있음.
기본적인 선택자
* {
margin: 0;
padding: 0;
}
- 태그 선택자 (Type Selector)
- 특정 HTML 태그 이름을 가진 모든 요소를 선택.
div {
border: 1px solid black;
}
- 클래스 선택자 (Class Selector)
- class 속성 값이 특정 값과 일치하는 모든 요소를 선택.
- 클래스 이름은 .으로 시작.
<p class="text blue">이 텍스트는 파란색입니다.</p>
<p class="text">이 텍스트는 기본 스타일입니다.</p>
.text {
font-size: 16px;
}
.blue {
color: blue;
}
- ID 선택자 (ID Selector)
- id 속성 값이 특정 값과 일치하는 요소를 선택.
- id 이름은 #으로 시작. id는 문서 내에서 유일해야 함.
<div id="container">
<h1>컨테이너 제목</h1>
<p>컨테이너 내용</p>
</div>
#container {
background-color: lightgray;
padding: 20px;
}
- 속성 선택자 (Attribute Selector)
<input type="text" name="username">
<input type="password" name="password" required>
<a href="https://www.example.com">링크</a>
<a href="https://www.example.org" target="_blank">새 창으로 열기</a>
input[type="text"] {
border: 1px solid blue;
input[required] {
background-color: lightyellow;
}
a[href^="[https://www.example](https://www.example)"]{
color: green;
}
a[target="_blank"] {
font-weight: bold;
}
결합자 (Combinators)
- 자손 결합자 (Descendant Combinator)
- 특정 요소의 하위에 있는 모든 요소를 선택 (깊이에 상관없이). 공백 문자( )으로 구분.
<div>
<p>div의 자식 문단</p>
<span>
<p>span의 자손 문단</p>
</span>
</div>
div p {
text-decoration: underline;
}
- 자식 결합자 (Child Combinator) -
- 특정 요소의 바로 아래 자식 요소를 선택. > 기호로 구분.
<div>
<p>div의 자식 문단</p>
<span>
<p>span의 자손 문단</p>
</span>
</div>
div > p {
background-color: yellow;
}
- 인접 형제 결합자 (Adjacent Sibling Combinator)
- 특정 요소 바로 뒤에 오는 형제 요소를 선택. + 기호로 구분.
<ul>
<li>아이템 1</li>
<li class="active">활성 아이템</li>
<li>아이템 3</li>
<li>아이템 4</li>
</ul>
.active + li {
color: green;
}
- 일반 형제 결합자 (General Sibling Combinator)
- 특정 요소 뒤에 오는 모든 형제 요소를 선택. ~ 기호로 구분.
<ul>
<li>아이템 1</li>
<li class="active">활성 아이템</li>
<li>아이템 3</li>
<li>아이템 4</li>
</ul>
.active ~ li {
font-style: italic;
}
의사 클래스 선택자 (Pseudo-Classes)
- :hover
- 마우스 커서가 요소 위에 올라와 있을 때 요소를 선택.
button:hover {
background-color: orange;
cursor: pointer;
}
- :active
- 요소가 활성화되었을 때 (마우스 버튼을 누르고 있는 동안) 요소를 선택.
button:active {
background-color: red;
transform: translateY(2px);
}
input:focus {
border: 2px solid blue;
outline: none;
}
- :visited
- 사용자가 방문한 링크를 선택. 보안상의 이유로 스타일 제한적.
a:visited {
color: purple;
}
a:link {
color: green;
}
<div lang="en">This is English text.</div>
<div lang="ko">이것은 한국어 텍스트입니다.</div>
:lang(ko) {
font-weight: bold;
}
- :first-child
- 부모 요소의 첫 번째 자식 요소인 경우 선택.
<ul>
<li>첫 번째 아이템</li>
<li>두 번째 아이템</li>
<li>세 번째 아이템</li>
</ul>
li:first-child {
font-weight: bold;
}
<ul>
<li>첫 번째 아이템</li>
<li>두 번째 아이템</li>
<li>세 번째 아이템</li>
</ul>
li:last-child {
text-decoration: underline;
}
- :nth-child(n)
- 부모 요소의 n번째 자식 요소를 선택. n에는 숫자, even, odd, 수식 사용 가능.
<ul>
<li>아이템 1</li>
<li>아이템 2</li>
<li>아이템 3</li>
<li>아이템 4</li>
<li>아이템 5</li>
</ul>
li:nth-child(2) {
color: red;
}
li:nth-child(odd) {
background-color: lightgray;
}
li:nth-child(3n + 1) {
font-size: 1.2em;
}
- :nth-last-child(n)
- 부모 요소의 뒤에서부터 n번째 자식 요소를 선택.
<ul>
<li>아이템 1</li>
<li>아이템 2</li>
<li>아이템 3</li>
<li>아이템 4</li>
<li>아이템 5</li>
</ul>
li:nth-last-child(2) {
color: blue;
}
li:nth-last-child(odd){
font-weight: bold;
}
- :first-of-type
- 부모 요소의 특정 타입 자식 요소 중 첫 번째 요소를 선택.
<div>
<p>첫 번째 문단</p>
<span>스팬 요소</span>
<p>두 번째 문단</p>
</div>
p:first-of-type {
font-weight: bold;
}
- :last-of-type
- 부모 요소의 특정 타입 자식 요소 중 마지막 요소를 선택.
<div>
<p>첫 번째 문단</p>
<span>스팬 요소</span>
<p>두 번째 문단</p>
</div>
p:last-of-type{
text-decoration: underline;
}
- :nth-of-type(n)
- 부모 요소의 특정 타입 자식 요소 중 n번째 요소를 선택.
<div>
<p>문단 1</p>
<p>문단 2</p>
<span>스팬 요소</span>
<p>문단 3</p>
<p>문단 4</p>
</div>
p:nth-of-type(2) {
color: red;
}
- :nth-last-of-type(n)
- 부모 요소의 특정 타입 자식 요소 중에서 뒤에서 n번째 요소를 선택
<div>
<p>문단 1</p>
<p>문단 2</p>
<span>스팬 요소</span>
<p>문단 3</p>
<p>문단 4</p>
</div>
p:nth-last-of-type(2) {
color: red;
}
<div>
<p>유일한 문단</p>
</div>
<div>
<p>첫 번째 문단</p>
<p>두 번째 문단</p>
</div>
p:only-child {
background-color: lightgreen;
}
- :only-of-type
- 부모 요소의 특정 타입 자식 요소가 하나만 있는 경우 선택.
<div>
<p>문단</p>
<span>스팬</span>
</div>
<div>
<p>문단 1</p>
<p>문단 2</p>
</div>
p:only-of-type {
border: 1px solid blue;
}
- :empty
- 자식 요소가 없는 요소를 선택 (텍스트 노드 포함).
<div></div>
<div>텍스트</div>
<div><span></span></div>
div:empty {
border: 2px dashed red;
height: 20px;
}
<input type="text" value="활성화됨">
<input type="text" disabled value="비활성화됨">
<button>활성화된 버튼</button>
<button disabled>비활성화된 버튼</button>
input:enabled {
background-color: lightgreen;
}
button:enabled{
color: blue;
}
<input type="text" value="활성화됨">
<input type="text" disabled value="비활성화됨">
<button>활성화된 버튼</button>
<button disabled>비활성화된 버튼</button>
input:disabled {
background-color: lightgray;
border: 1px solid gray;
}
button:disabled {
color: gray;
cursor: not-allowed;
}
<input type="checkbox" id="agree" checked>
<label for="agree">동의합니다.</label>
input:checked + label {
font-weight: bold;
color: green;
}
- :indeterminate
- 상태가 결정되지 않은 폼 요소를 선택. (예: 그룹 체크박스 중 일부만 선택된 경우)
<input type="checkbox" id="group"> <label for="group">그룹 체크박스</label>
<script>
document.getElementById('group').indeterminate = true;
</script>
input:indeterminate + label {
color: purple;
font-style: italic;
}
<form>
<input type="radio" name="option" value="1" checked> Option 1
<input type="radio" name="option" value="2"> Option 2
<input type="submit" value="Submit">
</form>
input:default {
border: 2px solid green;
}
<input type="email" required value="test@example.com">
<input type="email" required value="invalid-email">
input:valid {
border: 2px solid green;
}
- :invalid
- 유효성 검사를 실패한 폼 요소를 선택.
문법: 선택자:invalid { 속성: 값; }
<input type="email" required value="test@example.com">
<input type="email" required value="invalid-email">
input:invalid {
border: 2px solid red;
}
- :required
- required 속성이 있는 폼 요소를 선택.
<input type="text" required>
<input type="text">
input:required {
background-color: lightyellow;
}
<input type="text" required>
<input type="text">
input:optional{
font-style: italic;
}
- :in-range
- min 및 max 속성 범위 내에 있는 폼 요소를 선택
<input type="number" min="10" max="20" value="15">
<input type="number" min="10" max="20" value="5">
input:in-range {
border: 2px solid green;
}
- :out-of-range
- min 및 max 속성 범위 밖에 있는 폼 요소를 선택
<input type="number" min="10" max="20" value="15">
<input type="number" min="10" max="20" value="5">
input:out-of-range {
border: 2px solid red;
}
- :read-only
- readonly 속성이 있는 폼 요소를 선택.
<input type="text" value="읽기 전용 텍스트" readonly>
<input type="text" value="편집 가능한 텍스트">
input:read-only {
background-color: lightgray;
cursor: not-allowed;
}
- :read-write
- readonly 속성이 없는, 편집 가능한 폼 요소를 선택
<input type="text" value="읽기 전용 텍스트" readonly>
<input type="text" value="편집 가능한 텍스트">
input:read-write {
border: 1px solid blue;
}
p::selection {
background-color: yellow;
color: black;
}
의사 요소 선택자 (Pseudo-Elements)
- ::before
- 요소 콘텐츠의 바로 앞에 가상 요소를 생성하여 스타일 적용. content 속성을 사용하여 내용을 추가해야 함.
문법: 선택자::before { 속성: 값; }
<div class="box">내용</div>
.box::before {
content: "시작 ";
color: gray;
}
- ::after
- 요소 콘텐츠의 바로 뒤에 가상 요소를 생성하여 스타일 적용. content 속성을 사용하여 내용을 추가해야 함.
<div class="box">내용</div>
.box::after {
content: " 끝";
color: gray;
}
<p>이것은 문단입니다.</p>
p::first-letter {
font-size: 2em;
color: red;
}
<p>이것은 매우 긴 문단입니다. 내용이 여러 줄로 표시될 수 있습니다.</p>
p::first-line {
background-color: yellow;
}
- ::marker
- 리스트 아이템의 마커 (글머리 기호 또는 번호)를 선택.
<ul>
<li>아이템 1</li>
<li>아이템 2</li>
<li>아이템 3</li>
</ul>
li::marker {
color: blue;
font-size: 1.5em;
}
<input type="text" placeholder="이름을 입력하세요">
input::placeholder {
color: lightcoral;
font-style: italic;
}