본문으로 건너뛰기

단원 연습 문제

HTML·CSS 목차규칙이 겹칠 때문제 13개

9단원 '규칙이 겹칠 때'의 네 레슨에서 11문제를 내고, 4~5단원에서 2문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 이긴 값이나 차례, 고친 줄은 종이에 끝까지 쓴 뒤 정답을 펼치세요. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.

결과를 묻는 문제의 결과 화면과 잰 값은 정답을 펼치면 보입니다. 이긴 값을 묻는 문제는 종이에 손 점수판(선언 · 출처 · 명시도 · 차례)을 그려 풀고, 정답의 점수판과 견주어 보세요. 컴퓨터가 있으면 문제의 HTML과 CSS를 파일로 저장해 브라우저로 열고, 개발자 도구 Styles 창에서 취소선이 그어진 선언을 찾아 맞춰 봅니다. 결과는 모두 크롬 기준입니다.

이 단원을 이미 안다면 1 · 2 · 4 · 6 · 7 · 8번을 먼저 풀어 보세요. 건너뛸지 볼 때는 힌트를 펴지 않고 풉니다. 다 맞히면 이 단원은 건너뛰어도 됩니다. 틀린 문제와 힌트를 펴고 맞힌 문제는 정답 끝의 '다시 볼 레슨'으로 갑니다. 끝의 두 문제(12 · 13번)는 직접 만들어 보는 문제라, 건너뛸지 가릴 때는 풀지 않아도 됩니다. 11번까지 풀고 쉬었다가 12번부터 이어 풀어도 됩니다. ⟨컴퓨터⟩가 붙은 문제는 컴퓨터에서 파일을 만들어 풉니다. 폰으로만 본다면 그 문제 끝의 폰 물음 하나로 대신합니다.

문제 1

동아리 공지에서 회비 안내만 빨갛게 하려고 클래스 규칙을 먼저 쓰고, 문단 전체의 글자색 규칙을 그 아래에 썼습니다. '회비는 금요일까지'의 글자색은 무엇일까요? 색 값을 쓰세요.

<p class="due">회비는 금요일까지</p>
<p>모임은 7시</p>
.due {
  color: #d70015;
}

p {
  color: #1d1d1f;
}
힌트

첫 문단에 닿는 선언 둘을 적고, 저마다 선택자의 명시도를 세 칸(ID · 클래스 · 태그)으로 세어 보세요.

정답

받는 답: #d70015

결과 화면
잰 값개발자 도구에서 본 값
  • .due의 글자색rgb(215, 0, 21)
  • p:last-child의 글자색rgb(29, 29, 31)

같은 답으로 치는 꼴: rgb(215, 0, 21) · rgb(215 0 21) · #D70015. 잰 값 둘째 줄은 둘째 문단을 잰 것입니다.

첫 문단의 손 점수판입니다.

속성선언출처명시도차례이긴 값
color.due · #d70015우리 CSS0-1-01#d70015
p · #1d1d1f우리 CSS0-0-12

출처가 같아 명시도로 갑니다. 왼쪽 칸부터 견주면 ID 칸은 둘 다 0, 클래스 칸에서 .due가 1로 이깁니다. 차례 칸까지 가지 않습니다.

  • 한 요소의 한 속성에 선언이 여럿 닿으면 하나만 이깁니다. 출처가 같으면 명시도가 높은 쪽이 이깁니다(브라우저 규칙 5).
  • 흔한 오답은 #1d1d1f입니다. 나중에 쓴 규칙이 이긴다고 본 것입니다(뒤가 늘 이긴다는 생각). 차례는 명시도까지 같을 때만 봅니다.

다시 볼 레슨: 명시도

문제 2

카페 메뉴판의 '커피' 줄 하나를 네 선택자가 모두 고릅니다. (가) 선택자마다 명시도를 세 칸으로 쓰세요. (나) 명시도가 높은 차례대로 기호를 늘어놓으세요.

<ul id="menu" class="list">
  <li class="item">커피</li>
</ul>
  • ㉠ .list .item
  • ㉡ li
  • ㉢ #menu .item
  • ㉣ ul.list li.item
힌트

선택자를 조각으로 나눠 # · . · 태그 이름이 저마다 몇 개인지 세어 보세요.

힌트 둘

빈칸(결합자)은 점수가 없습니다. 세 칸은 왼쪽 칸부터 견주고, 왼쪽 칸에서 갈리면 오른쪽은 보지 않습니다. 세 칸을 더한 합으로 견주지 않습니다.

정답

받는 답: (가) ㉠ 0-2-0 · ㉡ 0-0-1 · ㉢ 1-1-0 · ㉣ 0-2-2 / (나) ㉢ ㉣ ㉠ ㉡

네 선택자가 저마다 다른 색을 주면 이렇게 그려집니다.

<ul id="menu" class="list">
  <li class="item">커피</li>
</ul>
.list .item {
  color: #d70015;
}

li {
  color: #6e6e73;
}

#menu .item {
  color: #005bb5;
}

ul.list li.item {
  color: #1d1d1f;
}
결과 화면
결과 화면
잰 값개발자 도구에서 본 값
  • li의 글자색rgb(0, 91, 181)
  • ㉢ #menu .item은 ID 칸이 1이라, 다른 셋이 클래스 칸 · 태그 칸에서 얼마나 많아도 집니다. '커피'는 ㉢의 파랑입니다(브라우저 규칙 5).
  • ㉣ 0-2-2와 ㉠ 0-2-0은 클래스 칸까지 같고 태그 칸에서 ㉣이 높습니다.
  • 흔한 오답은 ㉣ ㉢ ㉠ ㉡이나 ㉣ ㉠ ㉢ ㉡입니다. 세 칸을 더해 ㉣(합 4)을 ㉢(합 2)보다 높게 본 것입니다. 명시도는 받아올림이 없습니다 — 클래스가 열한 개인 0-11-0도 1-0-0에 집니다.

다시 볼 레슨: 명시도

문제 3

여행 일정의 버스 시간을 회색으로 정한 뒤, 이 목록의 시간만 파랗게 하려고 ID를 넣은 규칙을 더 썼습니다. 시간의 글자색은 무엇일까요? 색 값을 쓰세요.

<ul id="bus">
  <li class="time">8시 10분</li>
</ul>
.time {
  color: #6e6e73;
}

#bus .time {
  color: #05bb5;
}
힌트

둘째 규칙의 색 값을 # 뒤부터 한 글자씩 세어 보세요.

힌트 둘

알아듣지 못한 선언도 겨루기에 드는지 정하세요. 겨루기에 드는 선언만 손 점수판에 적습니다.

정답

받는 답: #6e6e73

결과 화면
잰 값개발자 도구에서 본 값
  • .time의 글자색rgb(110, 110, 115)
  • .time의 color 선언rgb(110, 110, 115)

같은 답으로 치는 꼴: rgb(110, 110, 115) · rgb(110 110 115).

  • #05bb5는 # 뒤가 다섯 자리입니다. 16진수 색은 여섯 자리(줄여 쓰면 세 자리)라 브라우저가 알아듣지 못하고, 오류 없이 그 선언만 버립니다(브라우저 규칙 4). Styles 창에서는 그 줄에 경고 표시와 취소선이 보입니다(크롬 기준).
  • 버려진 선언은 겨루기에 들지 않습니다. 시간에 닿는 color 선언은 .time의 회색 하나뿐이라 그것이 이깁니다.
  • 흔한 오답은 #05bb5나 #005bb5입니다. ID가 든 규칙이 명시도로 이긴다고 먼저 본 것입니다. 명시도는 알아들은 선언끼리만 견줍니다.
  • 기본 글자색(검정)도 흔한 오답입니다. 틀린 줄이 있으면 CSS가 다 안 먹는다고 본 것입니다(CSS도 멈춘다는 생각).

다시 볼 레슨: 색 쓰기 · 규칙의 모양 · 명시도

문제 4

짝마다 두 코드의 화면이 같은지 다른지 쓰세요. 다르면 어디가 다른지도 한 줄로 쓰세요. 셋 모두 같은 답이 나와도 됩니다.

(가)

<p class="sweet cold">라테</p>
.cold {
  color: #d70015;
}

.sweet {
  color: #005bb5;
}
<p class="sweet cold">라테</p>
.sweet {
  color: #005bb5;
}

.cold {
  color: #d70015;
}

(나)

<p id="star" class="cold">
  라테
</p>
#star {
  color: #005bb5;
}

.cold {
  color: #d70015;
}
<p id="star" class="cold">
  라테
</p>
.cold {
  color: #d70015;
}

#star {
  color: #005bb5;
}

(다)

<p class="sweet cold">라테</p>
.cold {
  color: #d70015;
}

.sweet {
  color: #005bb5;
}
<p class="cold sweet">라테</p>
.cold {
  color: #d70015;
}

.sweet {
  color: #005bb5;
}
힌트

짝마다 두 코드에서 바뀐 곳을 찾으세요 — CSS 규칙의 차례인지, HTML 속성 값의 차례인지 봅니다.

힌트 둘

짝마다 두 선택자의 명시도를 먼저 견주세요. 차례는 명시도까지 같을 때만 봅니다.

정답

(가) 다르다 — 앞 코드는 파랑, 뒤 코드는 빨강 · (나) 같다 · (다) 같다

결과 화면(가) 첫째 코드
결과 화면(가) 둘째 코드
결과 화면(나) 첫째 코드
결과 화면(나) 둘째 코드
결과 화면(다) 첫째 코드
결과 화면(다) 둘째 코드
  • (가) .cold와 .sweet는 둘 다 0-1-0입니다. 명시도까지 같으면 나중에 쓴 쪽이 이겨, 규칙 자리를 바꾸면 색이 뒤집힙니다(브라우저 규칙 5).
  • (나) #star(1-0-0)가 .cold(0-1-0)보다 명시도가 높아, 자리를 바꿔도 늘 파랑입니다.
  • (다) 바뀐 것은 HTML class 값 안의 이름 차례입니다. 이기는 차례가 보는 '나중'은 CSS 규칙의 차례라, 두 화면이 같은 파랑입니다.
  • (나) 다르다는 나중에 쓴 규칙이 늘 이긴다고 본 것입니다(뒤가 늘 이긴다는 생각).
  • (다) 다르다는 class 값에 뒤에 적은 이름이 이긴다고 본 것입니다.

다시 볼 레슨: 나중에 쓴 규칙 · 명시도

문제 5

여행 일정의 날짜 탭입니다. 마우스를 올리면 빨개지게 하려 했습니다. (가) '첫째 날'에 마우스를 올리면 글자색은 무엇일까요? (나) 두 규칙의 자리를 서로 바꾸면 무엇일까요? 색 값을 쓰세요.

<nav class="tabs">
  <a href="#d1">첫째 날</a>
  <a href="#d2">둘째 날</a>
</nav>
a:hover {
  color: #d70015;
}

.tabs a {
  color: #1d1d1f;
}
힌트

마우스를 올린 '첫째 날'에는 두 규칙이 모두 닿습니다. 두 선택자의 명시도를 세 칸으로 세어 보세요.

힌트 둘

:hover는 가상 클래스입니다. 가상 클래스는 세 칸 가운데 어느 칸에 세는지 정하세요.

정답

받는 답: (가) #1d1d1f — 마우스를 올려도 그대로 · (나) #d70015

결과 화면
잰 값개발자 도구에서 본 값
  • a의 :hover켜짐
  • a의 글자색rgb(29, 29, 31)

두 규칙의 자리를 바꾸고 마우스를 올린 뒤입니다.

<nav class="tabs">
  <a href="#d1">첫째 날</a>
  <a href="#d2">둘째 날</a>
</nav>
.tabs a {
  color: #1d1d1f;
}

a:hover {
  color: #d70015;
}
결과 화면
잰 값개발자 도구에서 본 값
  • a의 글자색rgb(215, 0, 21)

마우스를 올린 '첫째 날'의 손 점수판입니다(처음 코드).

속성선언출처명시도차례이긴 값
color.tabs a · #1d1d1f우리 CSS0-1-12#1d1d1f
a:hover · #d70015우리 CSS0-1-11

명시도까지 같아 나중에 쓴 .tabs a가 이깁니다(브라우저 규칙 5).

  • 가상 클래스 :hover는 클래스 칸에 하나로 셉니다. a:hover와 .tabs a는 둘 다 0-1-1입니다.
  • 마우스를 올리면 a:hover가 '첫째 날'에 닿기는 하지만, 뒤에 쓴 .tabs a에 집니다. 자리를 바꾸면 a:hover가 나중이 되어 이깁니다.
  • (가)의 흔한 오답은 #d70015입니다. 마우스를 올린 상태 규칙은 늘 이긴다고 본 것입니다. 상태 규칙도 같은 이기는 차례를 따릅니다.

자리를 바꾸지 않고 고치려면 .tabs a:hover(0-2-1)처럼 선택자를 더 구체적으로 씁니다.

다시 볼 레슨: 나중에 쓴 규칙 · 마우스와 키보드 상태

문제 6

레시피 노트의 요리 도움말 문단에 글자색과 테두리를 주었습니다. 테두리는 CSS가 그리는 선입니다 — 10단원 '박스 모델'에서 자세히 봅니다. 이 코드는 화면에 어떻게 보일까요? 보기 셋 가운데 고르세요.

<p class="hint">
  도움말 <em>약불로</em>
</p>
.hint {
  color: #005bb5;
  border: 2px solid #005bb5;
}
힌트

규칙이 직접 고른 요소를 적고, 안쪽 em에 직접 닿는 선언이 있는지 보세요.

힌트 둘

안쪽 em은 선언 둘을 저마다 어떻게 받는지 따로 따져 보세요. 글자색과 테두리 가운데 어느 쪽이 물려받는 속성인지 정하세요.

정답

② — 글은 모두 파랗고, 문단 둘레에만 선이 있습니다.

결과 화면
  • em에는 닿는 선언이 없습니다. 그러면 글자 · 색처럼 물려받는 속성은 부모의 값을, 나머지는 처음 값을 씁니다(브라우저 규칙 5).
  • 글자색은 물려받는 속성이라 '약불로'도 부모의 파랑입니다. 테두리는 물려받지 않아 em은 처음 값(테두리 없음)입니다.
  • ① 모든 속성을 물려받는다고 본 것입니다(다 물려받는다는 생각). 테두리까지 내려가면 안쪽 요소마다 선이 겹쳐 그려집니다.
  • ③ 직접 고른 요소에만 값이 들고 안쪽은 아무것도 안 물려받는다고 본 것입니다(다 물려받는다는 생각의 거꾸로).

다시 볼 레슨: 물려받기

문제 7

여행 일정의 첫째 날 구역에 ID 규칙으로 빨간 글자를 주고, 문단에는 따로 글자색을 정했습니다. 빨간 글자로 그려지는 요소를 모두 고르세요. 기호를 다 쓰세요.

<section id="beach">
  <h2>첫째 날</h2>
  <p>
    숙소는 <strong>바닷가</strong>
  </p>
  <a href="map.html">지도</a>
</section>
#beach {
  color: #d70015;
}

p {
  color: #1d1d1f;
}
  • ㉠ h2 첫째 날
  • ㉡ p 숙소는
  • ㉢ strong 바닷가
  • ㉣ a 지도
힌트

네 요소마다 그 요소에 직접 닿는 선언이 있는지 먼저 적어 보세요.

힌트 둘

기본 스타일의 선언도 셉니다. 물려받기는 그 요소에 닿는 선언이 하나도 없을 때만 씁니다. #beach 규칙은 section 하나에만 닿습니다.

정답

㉠ — 제목 '첫째 날'만 빨갛습니다.

결과 화면
잰 값개발자 도구에서 본 값
  • h2의 글자색rgb(215, 0, 21)
  • p의 글자색rgb(29, 29, 31)
  • strong의 글자색rgb(29, 29, 31)
  • a의 글자색rgb(0, 0, 238)
  • #beach 규칙은 section에만 닿습니다. h2에는 글자색 선언이 하나도 닿지 않아 부모 section의 빨강을 물려받습니다(브라우저 규칙 5).
  • p에는 p 규칙이 직접 닿습니다. 물려받은 값은 직접 닿은 선언에 늘 집니다 — 부모의 규칙이 ID(1-0-0)여도 그 점수는 안쪽으로 내려가지 않습니다.
  • strong은 닿는 선언이 없어 바로 위 부모 p의 #1d1d1f를 물려받습니다.
  • a는 기본 스타일이 글자색을 직접 정해 둬, 물려받지 않고 기본 파랑입니다(크롬 기준).
  • 흔한 오답은 ㉠ ㉡ ㉢ ㉣입니다. ID 규칙의 점수가 안쪽 요소까지 이긴다고 본 것입니다.
  • ㉠ ㉣은 링크도 부모 색을 물려받는다고 본 것입니다(다 물려받는다는 생각). 링크 색을 부모와 같게 하려면 a { color: inherit; }⁠을 씁니다.

다시 볼 레슨: 물려받기 · 명시도

문제 8

카페 메뉴판의 가격 색이 자꾸 다른 규칙에 져서 !important를 붙였습니다. 며칠 뒤 오늘의 메뉴 가격만 빨갛게 하려고 ID 규칙을 더했습니다. 가격의 글자색은 무엇일까요? 색 값을 쓰세요.

<p id="special" class="price">
  라테 4000원
</p>
.price {
  color: #6e6e73 !important;
}

#special {
  color: #d70015;
}
힌트

두 선언 가운데 끝에 무엇이 붙은 선언이 있는지 보세요.

힌트 둘

이기는 차례의 첫 칸은 무엇이었나요? !important는 이기는 차례의 첫 칸(출처 · 중요도)에서 그 선언을 먼저 올립니다. 그 칸에서 갈리면 명시도는 보지 않습니다.

정답

받는 답: #6e6e73

결과 화면
잰 값개발자 도구에서 본 값
  • p의 글자색rgb(110, 110, 115)

같은 답으로 치는 꼴: rgb(110, 110, 115) · rgb(110 110 115).

속성선언출처명시도차례이긴 값
color.price · #6e6e73 !important우리 CSS · 중요0-1-01#6e6e73
#special · #d70015우리 CSS1-0-02

첫 칸 출처 · 중요도에서 !important 선언이 이깁니다. 명시도 칸까지 가지 않습니다(브라우저 규칙 5).

  • 흔한 오답은 #d70015입니다. ID 규칙이 명시도로 이긴다고 본 것입니다. !important는 싸움을 한 단계 위로 올려, 뒤에 오는 어떤 보통 규칙도 이기지 못하게 만듭니다.
  • 이것을 또 !important로 이기려 하면 같은 싸움이 한 단계 위에서 되풀이됩니다. .price의 !important를 지우면 #special이 명시도로 이깁니다.

다시 볼 레슨: !important 대신 · 명시도

문제 9

레시피 노트의 재료 목록입니다. 꼭 있어야 하는 '김치'만 빨갛게 하려고 .must 규칙을 더했는데 검정 그대로입니다. !important 없이 '김치'를 빨갛게 하는 고침을 모두 고르세요.

<ul class="list">
  <li class="must">김치</li>
  <li>김가루</li>
</ul>
.list li {
  color: #1d1d1f;
}

.must {
  color: #d70015;
}
  • ① 아래 규칙의 선택자 .must를 li.must로 바꾼다
  • ② 아래 규칙의 선택자 .must를 .list .must로 바꾼다
  • ③ .must 규칙을 .list li 규칙 위로 옮긴다
힌트

두 선택자의 명시도를 세 칸으로 세고, 고침마다 바뀐 뒤의 점수와 차례를 다시 적어 보세요.

힌트 둘

명시도가 높아지면 차례와 상관없이 이기고, 명시도가 같아지면 나중에 쓴 쪽이 이깁니다.

정답

① ② — 선택자를 구체적으로 쓰는 두 길입니다.

결과 화면
잰 값개발자 도구에서 본 값
  • .must의 글자색rgb(29, 29, 31)

위 잰 값은 고치기 전입니다. ①로 고친 뒤입니다.

<ul class="list">
  <li class="must">김치</li>
  <li>김가루</li>
</ul>
.list li {
  color: #1d1d1f;
}

li.must {
  color: #d70015;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .must의 글자색rgb(215, 0, 21)

③으로 옮긴 뒤입니다.

<ul class="list">
  <li class="must">김치</li>
  <li>김가루</li>
</ul>
.must {
  color: #d70015;
}

.list li {
  color: #1d1d1f;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .must의 글자색rgb(29, 29, 31)
  • 처음에는 .list li(0-1-1)가 .must(0-1-0)를 명시도로 이깁니다(브라우저 규칙 5).
  • ① li.must는 0-1-1이라 .list li와 같습니다. 명시도까지 같으면 나중에 쓴 쪽이 이겨, 아래에 있는 li.must가 이깁니다.
  • ② .list .must는 0-2-0이라 차례와 상관없이 이깁니다.
  • ③ 명시도가 낮은 규칙은 어디로 옮겨도 집니다. 옮겨서 고치는 길은 명시도가 같을 때만 통합니다(뒤가 늘 이긴다는 생각을 거꾸로 쓴 고침).

다시 볼 레슨: !important 대신 · 명시도 · 나중에 쓴 규칙

문제 10

플로우 카페 메뉴판에서 겨울 메뉴 구역을 hidden으로 숨겨 두었습니다. 그 뒤 구역 글자를 회색으로 꾸미면서 display 선언도 함께 적었더니, 숨겨 둔 겨울 메뉴가 화면에 나타났습니다. 이기는 차례의 어느 칸에서 갈려 이렇게 되었을까요?

<section hidden>
  <h2>겨울 메뉴</h2>
</section>
<p>지금은 여름 메뉴입니다.</p>
section {
  display: block;
  color: #6e6e73;
}
결과 화면
  • ① 명시도 — section 선택자의 점수가 hidden 속성보다 높다
  • ② 나중 — HTML의 hidden을 먼저 읽고 CSS를 나중에 읽어 CSS가 이겼다
  • ③ 출처 — 우리 CSS의 display: block이 기본 스타일의 display: none을 이겼다
힌트

hidden이 요소를 숨기는 길을 떠올려 보세요.

힌트 둘

숨기는 일을 하는 선언은 누가 적어 두었나요? hidden은 기본 스타일에 든 display: none 선언으로 요소를 숨깁니다. 기본 스타일과 우리 CSS의 선언이 같은 속성에서 만나면 이기는 차례의 첫 칸에서 갈립니다.

정답

③ — 출처 칸에서 우리 CSS가 이겼습니다.

잰 값개발자 도구에서 본 값
  • body의 보이는 글겨울 메뉴 / 지금은 여름 메뉴입니다.
  • section의 displayblock
  • 브라우저 기본 스타일에는 'hidden이 붙은 요소는 display: none'이라는 규칙이 있습니다. hidden은 이 규칙으로 요소를 숨깁니다.
  • 우리 CSS의 section { display: block; }⁠이 같은 요소의 같은 속성에 닿습니다. 이기는 차례의 첫 칸(출처)에서 우리 CSS가 기본 스타일을 이겨 구역이 보입니다(브라우저 규칙 5).
  • ① 명시도를 먼저 견준다고 본 것입니다. 출처가 다르면 명시도까지 가지 않습니다 — 우리 선택자가 태그 하나(0-0-1)뿐이어도 이깁니다.
  • ② 나중에 읽은 쪽이 이긴다고 본 것입니다(뒤가 늘 이긴다는 생각). 차례는 출처와 명시도가 모두 같을 때만 봅니다.

숨겨 둘 요소에는 display 선언을 적지 않습니다.

다시 볼 레슨: id와 class · 브라우저 기본 스타일과 Styles 창 · !important 대신

문제 11

동아리 공지의 경고 문단만 빨갛게 하려고 .warn 규칙을 맨 아래에 썼는데, 경고 문단이 회색입니다. 개발자 도구에서 경고 문단을 골라 보니 Styles 창에서 .warn의 color 줄에 취소선이 그어져 있고, 그 위의 #fee 규칙 color가 살아 있습니다. 고칠 줄을 골라 고쳐 보세요.

힌트

Styles 창에 .warn은 보이고 취소선이 그어졌습니다. 찾는 차례 몇 번인지 정하고, 이긴 #fee 규칙이 왜 이 문단에 닿았는지 HTML에서 찾으세요.

힌트 둘

경고 문단의 여는 태그에 적힌 속성을 하나씩 보세요. 윗줄에서 복사해 온 것이 남아 있지 않나요?

결과 화면일부러 틀린 코드

여기서 고친 코드는 저장하지도 보내지도 않습니다. 새로 열면 처음 코드입니다.

정답

받는 답: 2번 줄을 <p class="warn">으로 고칩니다 — 윗줄에서 복사해 온 id="fee"를 지웁니다.

<p id="fee">회비 1만 원</p>
<p class="warn">
  늦으면 2천 원 더
</p>
#fee {
  color: #6e6e73;
}

.warn {
  color: #d70015;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .warn의 글자색rgb(215, 0, 21)
  • p의 글자색rgb(110, 110, 115)
  • #fee의 고른 글회비 1만 원

잰 값 셋째 줄 — 이제 #fee가 고르는 것은 첫 문단 하나뿐입니다.

찾는 차례 4번에서 찾습니다.

  • 1번 — 첫 문단이 회색이니 CSS는 닿았습니다.
  • 2번 — Elements 패널에 문단 둘이 있습니다.
  • 3번 — 경고 문단을 고르면 Styles 창에 .warn 규칙이 보입니다. 규칙은 닿았습니다.
  • 4번 — .warn의 color에 취소선이 있습니다. 알아들었지만 졌습니다. 이긴 쪽은 #fee(1-0-0)라 .warn(0-1-0)이 뒤에 있어도 집니다(브라우저 규칙 5). 그런데 #fee는 첫 문단의 이름표입니다 — 경고 문단에도 같은 id가 붙어 있어 닿았습니다.

id는 한 페이지에 하나만 씁니다. CSS는 같은 id의 요소를 둘 다 칠해, 오류 없이 이런 겨루기가 생깁니다. 2번에서 검사기에 넣었다면 'Duplicate ID “fee”.' Error가 먼저 알려 줍니다.

다르게 고쳐도 되는 곳: 2번 줄의 id를 이 문단만의 다른 이름(id="due" 같은)으로 바꿔도 경고 문단이 빨개집니다.

  • 흔한 오답은 .warn 규칙을 더 아래로 옮기는 것입니다. 이미 맨 아래라 그대로 회색입니다 — 명시도가 다르면 차례는 보지 않습니다(뒤가 늘 이긴다는 생각).
  • .warn을 p.warn(0-1-1)으로 바꾸는 것도 흔합니다. ID 칸이 0이라 여전히 #fee에 집니다.
  • .warn의 선언에 !important를 붙이면 빨개지지만, 복사해 온 id는 그대로 남아 다음 겨루기를 또 부릅니다 — 증상만 덮은 것입니다.

다시 볼 레슨: 명시도 · id와 class · !important 대신

문제 12 (만들어 보기)

사진 동아리 신청 페이지의 '신청' 단추입니다. 이 단추의 background가 어느 선언의 값이 되는지 아래 손 점수판의 …를 채워 찾으세요. background는 짧게 적기라 한 줄이 속성 여럿을 정합니다 — 10단원 여백 짧게 적기에서 자세히 봅니다. 이 문제의 세 줄은 모두 background끼리라 쓴 그대로 겨룹니다.

<div class="apply">
  <button>문의</button>
  <button class="primary">
    신청
  </button>
</div>
button {
  background: #f5f5f7;
}

.apply button.primary {
  background: #005bb5;
}

.apply button {
  background: #ffffff;
}
속성선언출처명시도차례이긴 값
background……………
…………
…………

칸은 하위 목표 차례로 채웁니다 — 1. 닿는 선언 모으기(선언 칸) · 2. 출처 · 중요도 · 3. 명시도 세 칸 · 4. 나중(차례 칸 — 코드에 쓴 차례) · 5. 닿는 선언이 없을 때만 물려받기 · 처음 값. 이긴 값 칸은 맨 끝에 채웁니다.

나와야 할 결과는 둘입니다.

  • '신청' 단추의 바탕이 이긴 값의 색이다.
  • '문의' 단추의 바탕은 다른 선언의 색이다 — 같은 표를 '문의' 단추로 한 번 더 채워 그 색을 쓴다.
힌트

선언 칸은 CSS 세 규칙 가운데 '신청' 단추를 고르는 것을 모두 적습니다. 명시도 칸은 선택자마다 # · . · 태그 이름을 셉니다.

정답

모범 답 — '신청' 단추의 손 점수판입니다.

속성선언출처명시도차례이긴 값
background.apply button.primary · #005bb5우리 CSS0-2-12#005bb5
.apply button · #ffffff우리 CSS0-1-13
button · #f5f5f7우리 CSS0-0-11

출처가 모두 같아 명시도에서 0-2-1이 이깁니다. 차례는 보지 않고, 닿는 선언이 있으니 5도 쓰지 않습니다. 줄은 명시도의 점수판처럼 이긴 선언부터 적었습니다 — 코드 차례로 적어도 칸의 값이 같으면 맞습니다.

'문의' 단추에는 .apply button.primary⁠가 닿지 않아 둘만 겨루고, 0-1-1인 .apply button의 #ffffff가 이깁니다.

<div class="apply">
  <button>문의</button>
  <button class="primary">
    신청
  </button>
</div>
button {
  background: #f5f5f7;
}

.apply button.primary {
  background: #005bb5;
}

.apply button {
  background: #ffffff;
}
결과 화면
결과 화면
잰 값개발자 도구에서 본 값
  • .primary의 background-colorrgb(0, 91, 181)
  • button의 background-colorrgb(255, 255, 255)

잰 값은 짧게 적기 background가 정한 바탕색(background-color)을 잰 것입니다. 잰 값 둘째 줄은 '문의' 단추입니다.

위 두 결과가 맞고 표의 칸을 모두 채웠으면 맞습니다. 앞 칸에서 갈렸어도 뒤 칸까지 채워 둡니다 — 다른 단추를 볼 때 그 칸이 답을 냅니다.

흔한 잘못:

  • 차례 칸만 보고 맨 아래 .apply button의 #ffffff를 이긴 값으로 쓴 것은 차례를 명시도보다 먼저 본 것입니다(뒤가 늘 이긴다는 생각).
  • 선언 칸에서 button 규칙을 빼도 '신청'의 답은 같지만, 반만 쓴 표는 안 쓴 것과 같습니다. .apply button 규칙을 지우는 날에는 '문의' 단추의 바탕을 그 빠뜨린 줄이 정합니다.

다시 볼 레슨: 명시도 · 나중에 쓴 규칙

문제 13 (만들어 보기)

레시피 노트의 여덟째 단계입니다(⟨컴퓨터⟩ · 20분 안팎 · 걸음마다 멈춰도 됩니다). 단추 규칙을 '모든 단추의 공통 규칙'과 '제출 단추 규칙'으로 나누고, style.css를 구역 차례로 정리한 뒤, 규칙의 자리를 바꿔 이기는 쪽이 뒤집히는지 봅니다. 8단원 연습 문제의 만들어 보기를 마쳤다면 그 폴더에서 이어 갑니다.

이 단계 시작 파일 — 8단원 끝 상태

recipe-note 폴더에 세 파일을 받아 둡니다. 그림 여섯은 8단원 연습 문제 14번의 시작 파일에서 받은 images 폴더를 그대로 씁니다.

할 일 — 걸음 넷입니다. 이 단계는 style.css만 고칩니다. 바탕은 모두 짧게 적기 background 한 줄로 씁니다 — 한 줄이 속성 여럿을 정하는 꼴로, 10단원 여백 짧게 적기에서 자세히 봅니다. 이 단계의 바탕 선언은 모두 background끼리라 쓴 그대로 겨룹니다.

걸음 1 — 공통 단추 규칙. 6단원에서 쓴 button 규칙(파란 바탕 · 흰 글자)을 지우고, 모든 단추에 닿을 공통 규칙으로 다시 씁니다.

고를 요소바꿀 것
모든 단추바탕 #f5f5f7 · 글자색 #1d1d1f · 글자 크기 16px · 글꼴은 부모의 것 그대로(inherit)
마우스를 올린 단추바탕 #d2d2d7

걸음 2 — 제출 단추 규칙. 태그 이름에 대괄호 조건을 붙인 button[type="submit"]⁠으로 제출 단추만 고릅니다.

고를 요소바꿀 것
제출 단추바탕 #005bb5 · 글자색 #ffffff
마우스를 올린 제출 단추바탕 #1d1d1f

걸음 3 — 구역 차례. style.css를 구역 주석 다섯 /* 기본 */ · /* 머리글 · 내비 */ · /* 레시피 목록 */ · /* 레시피 본문 */ · /* 후기 폼 */의 차례로 나누고, 규칙마다 제 구역 아래로 옮깁니다. 페이지 전체 · 제목 · 링크 · 바닥글 · 공통 단추 규칙은 '기본'에, 제출 단추 규칙은 '후기 폼'에 둡니다. 아직 규칙이 없는 구역은 주석만 둡니다.

걸음 4 — 뒤집어 보기. 제출 단추 규칙 둘 가운데 마우스 올림 규칙을 잠시 지우고, 공통 규칙의 마우스 올림 규칙(button:hover)을 파일 맨 아래로 옮겨 저장합니다. 제출 단추에 마우스를 올려 보고, 확인한 뒤 둘 다 되돌립니다.

확인 목록:

  • 제출 단추 '후기 남기기'는 파란 바탕에 흰 글자이고, 마우스를 올리면 바탕이 거의 검정이 된다(화면 · 걸음 2).
  • 제출 단추를 골라 Styles 창을 보면 공통 button 규칙의 background 줄에 취소선이 있다 — 제출 단추 규칙에 졌다(Styles 창 · 걸음 2).
  • 단추 글자의 글꼴이 본문 글자와 같다(화면 · 걸음 1).
  • style.css를 위에서부터 읽으면 구역 주석 다섯이 차례대로 있고, 두 페이지의 모양은 걸음 3 전과 같다 — 규칙의 자리만 옮겼다(편집기 · 화면 · 걸음 3).
  • 걸음 4의 상태에서 제출 단추에 마우스를 올리면 바탕이 연회색 #d2d2d7이 된다. 마우스를 떼면 다시 파랑이다(화면 · 걸음 4).

폰으로만 따라왔다면 이 물음 하나로 대신합니다. 걸음 1 · 2를 마친 style.css에서 제출 단추에 마우스를 올리면 바탕은 무슨 색일까요?

  • ① #005bb5
  • ② #1d1d1f
  • ③ #d2d2d7
힌트

걸음마다 그 걸음의 확인 목록을 봅니다. 걸음 2는 공통 규칙과 제출 단추 규칙의 명시도를 세 칸으로 세어 보고, 걸음 4는 같은 명시도의 두 규칙을 찾습니다.

정답

모범 답입니다. 바뀐 곳만 싣습니다 — 다 고친 style.css는 아래 받기 파일과 같습니다(index.html · kimchi.html은 8단원 끝 상태 그대로).

/* 기본 */
…
button {
  background: #f5f5f7;
  color: #1d1d1f;
  font-size: 16px;
  font-family: inherit;
}

button:hover {
  background: #d2d2d7;
}
/* 후기 폼 */
…
button[type="submit"] {
  background: #005bb5;
  color: #ffffff;
}

button[type="submit"]:hover {
  background: #1d1d1f;
}

제출 단추에 마우스를 올린 뒤입니다. 마우스를 올리기 전의 모습은 결과 화면에 보입니다.

<form>
  <button type="submit">
    후기 남기기
  </button>
</form>
button {
  background: #f5f5f7;
  color: #1d1d1f;
  font-size: 16px;
  font-family: inherit;
}

button:hover {
  background: #d2d2d7;
}
결과 화면
button[type="submit"] {
  background: #005bb5;
  color: #ffffff;
}

button[type="submit"]:hover {
  background: #1d1d1f;
}
결과 화면
잰 값개발자 도구에서 본 값
  • button의 background-colorrgb(29, 29, 31)
  • button의 글자색rgb(255, 255, 255)

마우스를 올린 제출 단추의 background 손 점수판입니다.

속성선언출처명시도차례이긴 값
backgroundbutton[type="submit"]:hover · #1d1d1f우리 CSS0-2-14#1d1d1f
button[type="submit"] · #005bb5우리 CSS0-1-13
button:hover · #d2d2d7우리 CSS0-1-12
button · #f5f5f7우리 CSS0-0-11

명시도 0-2-1이 가장 높습니다. 대괄호 속성 선택자와 가상 클래스는 클래스 칸에 하나씩 셉니다. 마우스를 떼면 :hover가 붙은 두 줄이 닿지 않아, 남은 둘 가운데 0-1-1인 button[type="submit"]⁠의 #005bb5가 이깁니다.

걸음 4 — 제출 단추의 마우스 올림 규칙을 지우고 button:hover를 맨 아래로 옮긴 뒤 마우스를 올리면 이렇습니다.

<form>
  <button type="submit">
    후기 남기기
  </button>
</form>
button {
  background: #f5f5f7;
  color: #1d1d1f;
}

button[type="submit"] {
  background: #005bb5;
  color: #ffffff;
}

button:hover {
  background: #d2d2d7;
}
결과 화면
잰 값개발자 도구에서 본 값
  • button의 background-colorrgb(210, 210, 215)

button[type="submit"]⁠과 button:hover는 둘 다 0-1-1입니다. 명시도까지 같아 나중에 쓴 button:hover가 이겨 바탕이 연회색으로 뒤집힙니다(브라우저 규칙 5). 공통 규칙 button(0-0-1)은 어디로 옮겨도 제출 단추 규칙에 집니다 — 차례는 명시도가 같을 때만 봅니다. 그래서 공통 규칙을 위('기본')에, 구역 규칙을 아래에 두고, 마우스 올림처럼 같은 점수로 겨루는 규칙은 구역 규칙에 따로 씁니다.

확인 목록을 다 채웠으면 맞습니다. 코드가 모범 답과 달라도 됩니다.

다르게 써도 되는 곳:

  • 한 규칙 안 선언의 차례는 바꿔도 됩니다.
  • 구역 안 규칙의 차례도 바꿔도 됩니다. 이 단계의 구역 안 규칙들은 명시도가 달라 차례로 갈리지 않습니다.
  • 구역 이름은 달라도 됩니다 — 공통 규칙이 위, 구역 규칙이 아래면 됩니다.

흔한 잘못:

  • 걸음 1에서 font-family: inherit을 빠뜨리면 단추 글자만 본문과 다른 글꼴입니다. 단추는 기본 스타일이 글꼴을 직접 정해 둬 body의 글꼴을 물려받지 않습니다.
  • 걸음 2에서 button[type="submit"]:hover⁠를 빠뜨리면 제출 단추에 마우스를 올려도 바탕이 그대로 파랑입니다. button:hover(0-1-1)가 button[type="submit"](0-1-1)보다 앞에 있어 집니다.
  • 걸음 2의 선택자를 button 없이 [type="submit"]으로 쓰면 걸음 1 · 2의 확인 목록은 그대로 맞습니다. 하지만 명시도가 0-1-0이라, 걸음 4에서 button:hover(0-1-1)를 옮기기 전부터, 제출 단추에 마우스를 올리면 연회색이 됩니다 — 자리가 아니라 명시도로 진 것이라 뒤집어 보기가 되지 않습니다.
  • 이기게 하려고 !important를 붙이면 지금은 맞아도, 뒤에 더할 구역 규칙이 이 단추를 바꾸지 못합니다.

폰 물음의 답은 ②입니다. ①은 마우스 올림 규칙이 안 닿는다고 본 것, ③은 button:hover가 늘 이긴다고 본 것입니다.

다시 볼 레슨: 명시도 · 나중에 쓴 규칙 · 물려받기 · !important 대신

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

HTML·CSS 목차로