내가 원하는 요소만을 선택할 수 있도록
도와준다.태그 선택자
라고도 한다.h1 { color: yellow; }
h2 { color: yellow; }
h3 { color: yellow; }
그룹화 ,
h1, h2, h3 { color: yellow; }
전체 선택자 *
* { color: yellow; }
.genie { font-size: 30px; }
<p class="genie"> ... </p>
다중 클래스
.genie { font-size: 30px; }
.star { color: blue; }
<p class="genie star"> ... </p>
#bar { background-color: yellow; }
<p id="blog"> ... </p>
class 선택자와의 차이점
id는 문서 내에서 유일해야 한다
는 점이다.선택자의 조합
/* 요소와 class의 조합 */
p.genie { ... }
/* <p>이면서 class 속성에 genie가 있어야 */
/* 다중 class */
.star.genie { ... }
/* class 속성에 star와 genie가 모두 있어야 */
/* id와 class의 조합 */
#blog.genie { ... }
/* id가 blog이며 class가 genie인 요소 */
p[class] { color: silver; }
/* <p>이면서 class 속성이 있는 요소이면 적용됨 */
p[class][id] { text-decoration: underline; }
/* <p>이면서 class 속성과 id 속성이 둘다 있어야 적용됨 */
<p class="genie">Hello</p>
<p class="star">CSS</p>
<p class="coding" id="blog">HTML</p>
Hello, CSS, HTML은 은색 글자로 나오고, HTML은 밑줄도 쳐짐.
p[class="genie"] { color: silver; }
p[id="blog"] { text-decoration: underline; }
<p class="color hot">red</p> <p class="cool color">blue</p> <p class="colorful nature">rainbow</p>
p[class~="color"] { font-style: italic; }
/* class 속성의 값이 공백으로 구분한 "bar" 단어가 포함되는 요소 선택 */
p[class^="color"] { font-style: italic; }
/* class 속성의 값이 "bar"로 시작하는 요소 선택 */
p[class$="color"] { font-style: italic; }
/* class 속성의 값이 "bar"로 끝나는 요소 선택 */
p[class*="color"] { font-style: italic; }
/* class 속성의 값이 "bar" 문자가 포함되는 요소 선택 */
다음 코드의 결과가 왜 이렇게 나왔을지 생각해보자❗
p[class~="color"] { font-style: italic; } /* 1, 2번째 요소 */
p[class^="color"] { font-style: italic; } /* 1, 3번째 요소 */
p[class$="color"] { font-style: italic; } /* 2번째 요소 */
p[class*="color"] { font-style: italic; } /* 1, 2, 3번째 요소 */
div > h1 { color: red; }
div span { color: red; }
div + p { color: red; }
위 코드처럼 문서 구조 관련 선택자는 더 복잡하게 사용할 수 있고
아무리 많이 나열되어 있더라도제일 우측에 있는 요소가 실제 선택되는 요소
라는 것이다!
/* body 요소의 자식인 div 요소의 자손인 table 요소 바로 뒤에 인접한 ul 요소 선택! */
body > div table + ul { ... }
그렇다면 굳이 왜 쓰는걸까...?
그 전에 가상 클래스부터 공부하깅!
가상 클래스는 미리 정의해놓은 상황에 적용되도록 약속된 보이지 않는 클래스
이다.
우리가 직접 요소에 클래스를 선언하는 것이 아니라, 약속된 상황이 되면 브라우저 스스로 클래스를 적용한다.
특히나 가상 클래스가 HTML과 CSS에서 좋은 이유는 이들이 정적인 언어이기 때문이다.
CSS에서는 흔하게 사용되는 여러 패턴에 대해서 미리 정의해놓고, 가상 클래스로 제어할 수 있게 하고 있다.
:pseudo-class {
property: value;
}
<ul>
<li>HTML</li>
<li>CSS</li>
<li>JS</li>
</ul>
li:first-child { color: red; }
li:last-child { color: blue; }
첫 번째 li와 마지막 li에 가상 클래스가 적용된다.
내부적으로 가상 클래스가 적용되어
마치 아래의 코드와 같이 동작하는 것이다.<ul> <li class="first-child">HTML</li> <li>CSS</li> <li class="last-child">JS</li> </ul>
a:link { color: blue; }
a:visited { color: gray; }
a:focus { background-color: yellow; }
a:hover { font-weight: bold; }
a:active { color: red; }
HTML 코드에 존재하지 않는 구조 요소에 스타일을 부여
할 수 있다.CSS3부터는
가상 클래스와 가상 요소를 구분하기 위해
가상 요소에는 ::(더블 콜론) 기호를 사용하기로 했다.
하지만 하위 브라우저에서 :: 문법을 지원하지 않는 문제가 있으므로 상황에 따라 : 기호를 사용해야 한다.
::pseudo-element {
property: value;
}
애초에 내용이 없는 상태로 생성되기 때문에 내용을 넣기 위해 content 속성을 이용해야 한다.
p::before { content: "###" }
p::after { content: "!!!" }
p::first-line { ... }
p::first-letter { ... }