CSS로 스타일링을 진행할 때, 일괄적으로 모든 요소들을 동일하게 스타일링하는 경우보다
우리가 원하는 특정 요소만 선택해서 그 요소만을 스타일링 하고 싶은 경우가 많을 것이다.
이 때, css에게 어떤 요소를 스타일링하고 싶은지 구체적으로 특정해주고 싶을 때 사용하는 것이
바로 선택자(selector)이다.
이 장에서는 class 선택자, ID 선택자, 유사 class 등 특정 요소를 선택해 스타일링하는 방법을 알아볼 것이다.
5.1 Set up
다음과 같이 html, css를 생성해주자.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>CSS selector</h1>
<p>CSS 선택자는 개별 html 요소들을 <em>선택</em>할 수 있게 만들어준다.</p>
<p>이 선택자는 웹 페이지의 어떤 box도 선택할 수 있게 해준다는 점에 매우 유용하다.</p>
<p>시간이 되면 <a href='https://internetingishard.com'>Interneting Is Hard</a>
페이지에 방문해보자.
</p>
<div>Button One</div>
</body>
</html>
아직 style.css에는 내용물이 없고 우선 만들어두기만 하면 된다.
5.2 Class Selectors
html element의 class와 연동된다고 보면 된다.
html 요소 중 동일한 class value를 가진 요소들만을 선택해 스타일링해준다.
첫 문단에 다음과 같이 class를 추가하고, css에서 동일한 class를 스타일링 해보자.
<p class='synopsis'>CSS 선택자는 개별 html 요소들을 <em>선택</em>할 수 있게 만들어준다.</p>
/* css stylesheet */
.synopsis {
color: #7E8184;
font-style: italic;
}
이걸 브라우저에서 불러와보면 다음과 같이 렌더링되는 것을 확인할 수 있다.

class 이름 전에 (.)을 붙이면 해당 이름을 가진 class를 지정한다는 의미이다.
이는 p element에만 적용되는 것이 아니라 어떤 html 요소에도 적용된다.
이를 이용해 이번엔 button one을 담은 div를 스타일링 해보자.
html, css를 각각 다음처럼 수정, 추가해주자.
<div class='button'>Button One</div>
/* css stylesheet */
.button {
color: #FFF;
background: #5995DA;
font-weight: bold;
padding: 20px;
text-align: center;
border: 2px solid #5D6063;
border-radius: 5px;
width: 200px;
margin: 20px auto;
}
5.3 Container Divs
복수의 element들을 하나로 묶어주는 것을 통해 웹 페이지의 레이아웃을 좀 더 효율적으로 할 수 있다.
너무 많은 수의 element들을 한 번만 배치하는 것보다 우선 몇 가지의 파트로 나눠 큰 틀을 잡고,
그 안에서 세세한 조정을 거치도록 도와주는 것이 div의 역할 중 하나이다.
div로 html element들을 묶어보자. (보통 wrap한다고 표현)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class='page'> <!-- 이 div 추가 -->
<h1>CSS selector</h1>
<p class="synopsis">CSS 선택자는 개별 html 요소들을 <em>선택</em>할 수 있게 만들어준다.</p>
<p>이 선택자는 웹 페이지의 어떤 box도 선택할 수 있게 해준다는 점에 매우 유용하다.</p>
<p>시간이 되면 <a href='https://internetingishard.com'>Interneting Is Hard</a>
페이지에 방문해보자.
</p>
<div class="button">Button One</div>
</div> <!-- 여기까지 -->
</body>
</html>
css도 다음처럼 추가한다.
.page {
width: 600px;
margin: 0 auto;
}
이제 브라우저의 윈도우의 크기에 상관없이 웹 페이지는 항상 600px 넓이를 가지고 가용한 공간의 중앙에 위치한다.
이 작업은 방금 button을 중앙에 배치한 것과 완전히 동일한 작업인데, div 하나로 다른 element들을 모두 묶음으로써
한 번에 모든 element를 중앙에 배치했다.
5.4 class style 재사용
이렇게 class를 지정해 스타일링한 css는 html element에 동일한 class를 줌으로써 계속해서 재활용할 수 있다.
버튼을 하나 더 만들고 동일한 class를 줘보자.
<!-- 전략 -->
<div class='button'> Button Two </button>
</div>
</body>
</html>
다시 불러오면 완전히 동일한 스타일링을 가진 버튼이 하나 더 생긴 것을 볼 수 있다.
5.5 class style 수정
여기서 두 번째 버튼을 좀 수정해주고 싶다고 해보자. 이 때는 .button css 아래에 다른 스타일링을 줘서
위쪽의 스타일링을 덮어씌울 수 있다.
Button Two에 class를 하나 더 주고 css를 추가하자.
<button class='button second'> Button Two </button>
/* css stylesheet */
.second {
font-style:italic;
background: #EEB75A;
}
CSS에 코드를 작성하는 순서가 중요하다. 컴퓨터는 코드를 위에서 아래로 읽고,
나중에 읽은 코드와 먼저 읽은 코드가 충돌한다면 특별한 제한 사항이 없는 한 나중에 읽은 코드로
먼저 읽은 코드를 덮어씌워 버린다.
여기서 Button Two의 배경색을 바꾸려면 .second에 대한 코드를 .button에 대한 코드 아래에 배치해야 한다.
5.6 자손 선택자
첫 문단 synopsis로 돌아가보자. <em> element안의 글자는 더 이상 다른 글자와 구분이 되지 않는다.
.synopsis에 대한 코드가 모든 글자를 itailc으로 바꿔버렸기 때문이다.
이를 다시 다른 글자들과 구분하기 위해 선택자를 사용해 스타일링을 해보자.
<em>에 class를 줘서 구현할 수도 있지만 자손 선택자를 활용하면 조금 더 편하고 깔끔하게 코드를 짤 수 있다.
다음과 같이 CSS에 추가해보자.
/* css stylesheet */
.synopsis em {
font-style: normal;
}
이렇게 사용하는 것이 자손 선택자인데, 한 element 안에 있는 모든 해당하는 element들을 스타일링 해준다.
예를 들어 .synopsis 안에 div가 하나 더 있고 그 안에 em에 있더라도 이 em까지 모두 스타일링이 적용된다.
이 점이 앞으로 배울 자식 선택자와는 다른 점이다.
5.7 자식 선택자
자손 선택자가 안에 포함한 모든 element를 선택한다면, 자식 선택자는 이보다 조금 더 조건이 타이트하다.
자식 선택자는 부모 element의 바로 하위에 있는 element에만 적용된다.
html을 다음과 같이 수정해보자.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="page">
<h1>CSS selector</h1>
<div> <h1> for the example of child selector </h1> </div> <!-- 이걸 추가 -->
<p class="synopsis">CSS 선택자는 개별 html 요소들을 <em>선택</em>할 수 있게 만들어준다.</p>
<p>이 선택자는 웹 페이지의 어떤 box도 선택할 수 있게 해준다는 점에 매우 유용하다.</p>
<p>시간이 되면 <a href='https://internetingishard.com'>Interneting Is Hard</a>
페이지에 방문해보자.
</p>
<div class="button">Button One</div>
<div class="button second">Button Two</div>
</div>
</body>
</html>
이제 조금 전처럼 자손 선택자를 h1 element들에 대해 적용해보자.
/* css stylesheet */
.page h1 {
font-size: 60px;
}
이렇게 놓고 h1 element들을 보면 둘 모두 60px로 렌더링되는 것을 확인할 수 있다.
이제 이 자손 선택자를 자식 선택자로 바꿔보자. (>) 하나만 넣어주면 된다.
.page > h1 {
font-size: 60px;
}
이렇게 수정하고 다시 불러와보면 첫 번째 h1 element만이 60px로 나오는 것을 알 수 있다.
이는 두 번째 h1 element와 .page 사이에 <div>가 하나 막고 있기 때문이다.
.page 바로 하위에 있는 자식 element인 첫 번째 h1은 자식 선택자에 의해 선택되어 스타일링 되지만
사이에 <div> 하나를 낀 두 번째 <h1> element는 '자식'이 아닌 '자손' 이기 때문에
자식 선택자의 적용을 받지 않는다.
5.8 유사 선택자 (pseudo class)
HTML element에만 선택자를 붙일 수 있는 것이 아니다. 여기에 더해 사용자가 뭘 하는지에 따라
그 시점에만 스타일링을 따로 주는 것도 가능하다.
가장 쉬운 예시로 외부 링크로 연결되는 anchor element에서 사용자가 마우스를 올렸을 때만
색을 달라지게 하는 것이 있다.
그럴 때 사용하는 것이 바로 유사 선택자이다.
다음과 같이 CSS를 추가해보자.
a:link {
color:blue;
text-decoration:none;
}
a:visited {
color: purple;
}
a:hover {
color:aqua;
text-decoration:none;
}
한 번도 링크에 방문한 적이 없다면 a element가 파란색을,
방문한 적이 있다면 보라색을, 마우스를 갖다대면 하늘색으로 변하는 것을 확인할 수 있을 것이다.
이런 유사 선택자를 2개 이상 중첩해 사용하는 것도 가능하다.
방문한 적이 있는 a element에 마우스를 갖다댈때 다른 색으로 지정하고 싶다면 다음과 같이
CSS를 추가하면 된다.
a:visited:hover{
color: orange;
}
이는 텍스트뿐 아니라 어떤 html element에도 적용될 수 있다.
button들의 element 종류를 idv에서 a로 바꿔보자. 다음처럼 html을 수정하면 된다.
<a class="button" href="#">Button One</a>
<a class="button second" href="#">Button Two</a>
CSS에는 다음과 같이 추가한다.
.button:link,
.button:visited {
color: #FFF;
background: #5995DA;
font-weight: bold;
padding: 20px;
text-align: center;
border: 2px solid #5D6063;
border-radius: 5px;
width: 200px;
margin: 20px auto;
/* 여기까진 같고 아래 두줄만 추가하면 된다 */
display:block;
text-decoration: none;
}
텍스트 뿐만 아니라 button class를 가진 element의 영역 전체를 바꿔줄 수도 있다.
다음 CSS를 추가해보자.
.button:link,
.button:visited:hover {
color:#FFF;
background: #76AEED;
}
여기까지 하고 불러오면 버튼 영역에 마우스를 갖다대면 버튼 배경색 전체가 바뀌는 것을 확인할 수 있을 것이다.
다른 유사 선택자중 하나로 nth-child가 있다.
이는 자식 선택자가 여러 개 있을 경우, 그 중 n번째 요소만을 골라 스타일링하는 선택자이다.
다음과 같이 html을 수정하자.
<body>
<div class="page">
<h1>CSS selector</h1>
<div> <h1>for the example of child selector</h1></div>
<div class="pwrap">
<p class="synopsis">CSS 선택자는 개별 html 요소들을 <em>선택</em>할 수 있게 만들어준다.</p>
<p>이 선택자는 웹 페이지의 어떤 box도 선택할 수 있게 해준다는 점에 매우 유용하다.</p>
<p>시간이 되면 <a href='https://internetingishard.com'>Interneting Is Hard</a>
페이지에 방문해보자.
</p>
</div>
<a class="button" href="#">Button One</a>
<a class="button second" href="#">Button Two</a>
</div>
</body>
p element들을 감싸는 div 를 하나 만들고, class는 pwrap이라는 value를 주었다.
이제 CSS에서 두 번째 p element만 골라 글자 크기를 키워보자.
.pwrap > p:nth-child(2) {
font-size: 30px;
}
5.9 id selector
class와 동일한 방식으로 사용하지만, class와 id의 다른 점은 id는 한 html 파일에 단 하나만 존재한다는 사실이다.
따라서 id를 지정해 스타일링하면 무조건 그 element 하나만을 스타일링할 수 있다.
단점이라면 class처럼 여러 개의 element를 한 번에 스타일링해주거나 재활용은 하지 못한다.
3번째 p element에 id='para3'라는 값을 주고 CSS를 다음과 같이 추가해보자.
#para3 {
color:red;
font-weight: bold;
}
id를 지정할때는 앞에 #을 붙여주면 된다.
다시 불러와보면 세 번째 문단 글자의 색과 굵기가 변했음을 확인할 수 있다.
5.9.1 priority
지금까지 본 것처럼 스타일링을 하는 방법은 여러가지가 있다.
그런데 복수의 방법으로 하나의 element를 스타일링할 경우, 그리고 스타일링의 내용들간의 충돌이 있을 경우,
어떤 스타일링의 내용을 우선시 할 것인지는 규칙이 있다.
우선 순위가 같을 경우 위에서 아래로 읽고 나중에 온 것이 먼저 온 것을 덮어쓰지만 우선 순위가 다를 경우,
먼저 온 것이 우선 순위가 높으면 먼저 온 것이 덮어씌워지지 않게 된다.
id selector는 class selector에 대해 우선순위를 가진다.
3번째 p element에 class='para3'를 주고 CSS에서 #para3 아래에 .para3에 대해 다음과 같이 추가해보자.
.para3 {
color: blue;
}
만약 id 선택자와 class 선택자의 우선순위가 동일하다면 나중에 온 .para3에 의해 글자색이 파랗게 변해야 하지만
id selector의 우선 순위가 더 높아 글자 색은 그대로 red임을 알 수 있다.
5.9.2 문서 특정 위치로 이동
id선택자와 a의 href attribute를 사용하면 문서의 특정 위치로 사용자를 이동시켜주는 것도 가능하다.
다음과 같이 html을 수정해주자.
<a class="button" id="buttonOne" href="#buttonTwo">Button One</a>
<a class="button second" id='buttonTwo' href="#buttonOne">Button Two</a>
href에 id 선택자와 함께 아이디를 적어주고 클릭하면 해당하는 id를 가진 element로 바로 이동시켜줄 수 있다.
조금 더 차이를 눈에 띄게 보기 위해 css에 다음과 같이 추가하자.
#buttonOne {
margin-bottom: 2000px;
}
이제 html을 불러와서 버튼을 클릭하면 버튼 서로가 서로의 위치로 보내주는 것을 확인할 수 있다.
'CSS' 카테고리의 다른 글
| Ch 04. CSS Box Model (0) | 2022.04.12 |
|---|---|
| Ch 03. CSS (Cascading Style Sheets) (0) | 2022.01.25 |
| Ch 02. Links & Images (0) | 2022.01.24 |
| Ch 01. Introduction (0) | 2022.01.16 |