하위 선택자
공백을 사용하여 나타냄
앞 요소의 자손인 뒤 요소를 선택
section ul { ... }
자식 선택자
> 를 사용하여 나타냄
앞 요소의 자식인 뒤 요소를 선택(바로 아래 자식을 선택)
section > ul { ... }
인접 형제 선택자
+ 를 사용하여 나타냄
+ 를 기준으로 앞 요소 직후에 나오는 뒤 요소를 선택
h1 + ul { ... }
일반 형제 선택자
~ 를 사용하여 나타냄
~ 을 기준으로 앞 요소 이후에 나오는 모든 뒤 요소를 선택
h1 ~ ul { ... }
a[href] { ... }
a[href="https://velog.io"] { ... }
a[href~="velog"] { ... }
a[href^="http"] { ... }
a[href$=".pdf"]{ ... }
a[href*="velo"] { ... }
a[href|="http"]{ ... }
.foo:first-child: class="foo"인 엘리먼트 중 첫번째 자식인 엘리먼트를 선택
.foo:last-child: class="foo"인 엘리먼트 중 마지막 자식인 엘리먼트를 선택
.foo:nth-child(n): class="foo"인 엘리먼트 중 n번째 자식인 엘리먼트를 선택
.foo:nth-child(odd): class="foo"인 엘리먼트 중 홀수 번째 자식인 엘리먼트를 선택 (2n+1)
.foo:nth-child(even): class="foo"인 엘리먼트 중 짝수 번째 자식인 엘리먼트를 선택 (2n)
.foo:nth-child(3n+1): class="foo"인 엘리먼트 중 3n+1번째 자식인 엘리먼트를 선택
가상 클래스가 실제로 존재하는 요소에 클래스 추가 없이 디자인을 입히기 위한 것이라면, 가상 요소는 아예 실제로 존재하지 않는 요소를 만들게 해준다.
가상 클래스 선택자와의 차이점
p::before { content: 'I am' }
p::after { content: '!!' }