본문으로 건너뛰기

단원 연습 문제

HTML·CSS 목차선택자문제 14개

8단원 '선택자'의 여섯 레슨에서 12문제를 내고, 2 · 7단원에서 2문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 고르는 요소나 색 값, 고친 줄은 종이에 끝까지 쓴 뒤 정답을 펼치세요. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.

결과를 묻는 문제의 결과 화면과 잰 값은 정답을 펼치면 보입니다. 마우스로 누르거나 Tab을 누른 뒤의 결과는 정답의 결과 화면에서 직접 눌러 봐도 됩니다. 컴퓨터가 있으면 문제의 HTML과 CSS를 파일로 저장해 브라우저로 열고, 개발자 도구 Elements 패널 · Styles 창과 함께 맞춰 봅니다. 결과는 모두 크롬 기준입니다.

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

문제 1

플로우 카페 메뉴판에서 할인하는 줄만 빨갛게 칠하려 합니다. 이 코드에서 빨간 글자로 그려지는 줄은 어느 것일까요?

<p class="red">커피 4000원</p>
<p class=".sale">라테 4500원</p>
<p class="sale">녹차 3500원</p>
.sale {
  color: #d70015;
}
  • ① 라테 줄과 녹차 줄
  • ② 녹차 줄만
  • ③ 커피 줄과 녹차 줄
힌트

CSS의 선택자 .sale과 세 줄의 class 값을 한 글자씩 견주어 보세요.

정답

② — 녹차 줄만 빨갛습니다.

결과 화면
잰 값개발자 도구에서 본 값
  • .sale의 고른 글녹차 3500원
  • p의 글자색rgb(0, 0, 0)

잰 값 둘째 줄은 첫 문단(커피)을 잰 것입니다.

  • 선택자 .sale의 점은 'class 값이 sale인 요소'라는 표시입니다. 이름은 점 뒤의 sale이라, class="sale"인 녹차 줄만 고릅니다(브라우저 규칙 4).
  • ① 라테 줄의 class 값은 점까지 넣은 .sale입니다. HTML의 class에는 점 없이 이름만 씁니다. 점이 붙으면 다른 이름이라 선택자 .sale이 고르지 않습니다.
  • ③ 커피 줄은 이름이 red라 빨개진다고 본 것입니다(이름이 모양을 정한다는 생각). red를 고르는 규칙이 없으니 그대로입니다. 이름은 색이 아니라 맡은 일(sale)로 짓습니다.

다시 볼 레슨: 태그·클래스·ID 선택자 · id와 class

문제 2

동아리 공지의 제목을 먼저 회색으로 정했습니다. 그다음 규칙에서 제목과 첫 줄을 함께 빨갛게 하려고 선택자 목록을 썼는데, 가상 클래스 이름에 오타가 났습니다. 제목 h2의 글자색은 무엇일까요? 색 값을 쓰세요.

<h2>10월 모임</h2>
<ul>
  <li>금요일 7시</li>
  <li>학생회관 2층</li>
</ul>
h2 {
  color: #6e6e73;
}

h2,
li:frist-child {
  color: #d70015;
}
힌트

둘째 규칙의 선택자 목록에서 오타가 난 쪽과 멀쩡한 쪽을 나눠 보세요.

힌트 둘

선택자 목록 가운데 하나를 알아듣지 못하면, 브라우저가 그 하나만 버리는지 규칙 전체를 버리는지 정하세요.

정답

받는 답: #6e6e73

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

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

  • :frist-child는 없는 가상 클래스라 브라우저가 알아듣지 못합니다. 선택자 목록 가운데 하나라도 알아듣지 못하면 브라우저는 그 규칙을 통째로 버립니다(브라우저 규칙 4). 멀쩡한 h2도 함께 빠집니다.
  • 둘째 규칙이 버려졌으니 h2에는 첫째 규칙의 회색이 남습니다. 개발자 도구 Styles 창에는 둘째 규칙이 아예 보이지 않습니다.
  • 흔한 오답은 #d70015입니다. 알아듣지 못한 선택자만 버리고 h2는 고른다고 본 것입니다. 선택자 목록은 한 덩어리라, 하나를 알아듣지 못하면 규칙째 버려집니다.
  • 기본 글자색(검정)도 흔한 오답입니다. 틀린 곳이 있으면 CSS가 다 안 먹는다고 본 것입니다(CSS도 멈춘다는 생각). 첫째 규칙은 그대로 먹습니다.

오타를 고친 li:first-child면 제목과 '금요일 7시'가 함께 빨개집니다. 목록이 길면 틀린 곳 하나가 여럿을 함께 빼니, 걱정되면 규칙을 나눠 씁니다.

다시 볼 레슨: 태그·클래스·ID 선택자 · 규칙의 모양

문제 3

여행 일정 목록에서 날짜 줄에만 바탕색을 칠하려 합니다. 이 선택자가 고르는 요소를 모두 고르세요. 기호를 다 쓰세요.

<ol class="days">
  <li>
    첫째 날
    <ol>
      <li>해운대</li>
      <li>광안리</li>
    </ol>
  </li>
  <li>둘째 날</li>
</ol>
.days > li {
  background-color: #d6ecff;
}
  • ㉠ ol.days
  • ㉡ li 첫째 날
  • ㉢ 첫째 날 안의 ol
  • ㉣ li 해운대
  • ㉤ li 광안리
  • ㉥ li 둘째 날
힌트

ol.days에서 시작하는 요소 나무를 그려 보세요.

힌트 둘

해운대와 광안리의 li는 ol.days에서 몇 겹 안에 있나요?

정답

㉡ ㉥ — 첫째 날과 둘째 날의 li입니다.

결과 화면
잰 값개발자 도구에서 본 값
  • .days > li의 고른 글첫째 날 · 둘째 날
  • .days li li의 background-colorrgba(0, 0, 0, 0)

잰 값 둘째 줄의 rgba(0, 0, 0, 0)은 바탕을 칠하지 않았다는 뜻입니다.

  • > 결합자는 바로 한 겹 안(자식)만 고릅니다. 해운대와 광안리의 li는 ol.days → 첫째 날 li → ol 안이라 세 겹 안입니다(브라우저 규칙 4).
  • 흔한 오답은 ㉡ ㉣ ㉤ ㉥입니다. > 결합자를 빈칸(후손)과 같은 뜻으로 본 것입니다. .days li라면 이 넷을 고릅니다.
  • 결과 화면에서는 해운대와 광안리 뒤도 하늘색으로 보입니다. 첫째 날 li 안에 안쪽 목록이 들어 있어, 첫째 날의 바탕이 그 아래까지 칠해지기 때문입니다. 해운대와 광안리의 li에는 바탕색이 없습니다.

다시 볼 레슨: 하위·자식·형제 선택자

문제 4

카페 메뉴판의 디저트 안내 문단 안에 목록을 넣고, 그 목록 줄만 파랗게 하려고 하위 선택자를 썼습니다. '쿠키'의 글자색은 무엇일까요? 색 값을 쓰세요.

<p class="note">오늘의 디저트
  <ul>
    <li>쿠키</li>
    <li>스콘</li>
  </ul>
</p>
body {
  color: #1d1d1f;
}

.note li {
  color: #005bb5;
}
힌트

개발자 도구 Elements 패널에서 이 코드를 펼치면 p.note 안에 무엇이 보일지 떠올려 보세요.

힌트 둘

문단 p 안에는 목록 같은 블록을 넣을 수 없습니다. 브라우저가 <ul>을 만났을 때 열린 p를 어떻게 하는지, 그 나무에서 li가 .note 안에 있는지 보세요.

정답

받는 답: #1d1d1f

결과 화면
잰 값개발자 도구에서 본 값
  • li의 글자색rgb(29, 29, 31)
  • body의 나무<p class="note">오늘의 디저트 </p><ul><li>쿠키</li><li>스콘</li></ul><p></p>

같은 답으로 치는 꼴: rgb(29, 29, 31) · rgb(29 29 31) · #1D1D1F.

  • 브라우저는 <ul>을 만나면 열린 p를 거기서 닫고 목록을 그 뒤에 짓습니다. 끝의 </p>는 빈 문단 하나가 됩니다(브라우저 규칙 2). 오류 메시지는 없습니다.
  • 그래서 li는 p.note 안에 있지 않고, .note li는 아무것도 고르지 못합니다(브라우저 규칙 4). 목록 줄은 body의 글자색을 물려받습니다.
  • 흔한 오답은 #005bb5입니다. 친 대로 p 안에 목록이 들어 있다고 본 것입니다(틀리면 멈춘다는 생각 — 브라우저는 멈추지도, 친 대로 두지도 않고 고쳐 짓습니다). 선택자는 Elements 패널의 지은 나무를 보고 씁니다.

'오늘의 디저트'를 문단 대신 div로 감싸거나, 문단과 목록을 따로 두고 목록에 이름표를 붙이면 됩니다.

다시 볼 레슨: 목록 ul·ol·li · 요소 안의 요소 · 하위·자식·형제 선택자

문제 5

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

(가)

<h1>봄 소풍 <em>안내</em></h1>
<p><em>금요일</em> 7시</p>
h1 {
  color: #005bb5;

em {
  color: #d70015;
}
<h1>봄 소풍 <em>안내</em></h1>
<p><em>금요일</em> 7시</p>
h1 {
  color: #005bb5;
}

h1 em {
  color: #d70015;
}

(나)

<h2>커피</h2>
<p class="won">4000원</p>
h2
.won {
  color: #d70015;
}
<h2>커피</h2>
<p class="won">4000원</p>
h2,
.won {
  color: #d70015;
}

(다)

<ul class="menu">
  <li>커피</li>
  <li>라테</li>
</ul>
.menu > li {
  color: #d70015;
}
<ul class="menu">
  <li>커피</li>
  <li>라테</li>
</ul>
.menu li {
  color: #d70015;
}
힌트

짝마다 두 CSS에서 다른 곳 하나를 찾으세요. 그곳 때문에 선택자가 고르는 요소가 달라지는지 봅니다.

힌트 둘

(가)는 닫는 중괄호가 없는 h1 규칙 안에 다음 규칙이 들어가 있다고 읽어 보세요. (나)는 쉼표가 없으면 두 줄이 빈칸으로 이어진 선택자 하나입니다.

정답

(가) 같다 · (나) 다르다 — 앞 코드는 아무것도 빨갛지 않다 · (다) 같다

결과 화면(가) 첫째 코드
결과 화면(가) 둘째 코드
결과 화면(나) 첫째 코드
결과 화면(나) 둘째 코드
결과 화면(다) 첫째 코드
결과 화면(다) 둘째 코드
  • (가) 앞 코드는 h1 규칙의 닫는 중괄호가 빠져, 브라우저가 em 규칙을 h1 규칙 안에 든 중첩 규칙으로 읽습니다. 이것은 뒤 코드의 h1 em과 같은 뜻이라 제목 안 '안내'만 빨갛고, 문단의 '금요일'은 그대로입니다.
  • (나) 앞 코드는 h2와 .won 사이에 쉼표가 없어 h2 .won — 'h2 안의 .won' 하나가 됩니다. 그런 요소가 없어 아무것도 빨갛지 않습니다. 뒤 코드는 선택자 목록이라 제목과 가격이 함께 빨갛습니다(브라우저 규칙 4).
  • (다) 이 목록의 li는 모두 ul.menu의 자식입니다. 한 겹뿐이라 > 결합자와 빈칸이 같은 요소를 고릅니다.
  • (가) 다르다는 두 가지로 나옵니다. 중괄호가 빠지면 아래 규칙이 안 먹는다고 봤거나, em 규칙이 모든 em에 닿는다고 본 것입니다.
  • (다) 다르다는 > 결합자와 빈칸이 늘 다른 요소를 고른다고 본 것입니다. 갈리는 것은 손자 이하가 있을 때입니다.

다시 볼 레슨: 하위·자식·형제 선택자 · 규칙의 모양

문제 6

사진 동아리 일정에서 새로 정한 것을 빨갛게 표시합니다. 이 코드는 화면에 어떻게 보일까요? 보기 셋 가운데 고르세요.

<div class="new">사진전 준비</div>
<div>
  출사
  <b class="new">장소 바뀜</b>
</div>
div .new {
  color: #d70015;
}
힌트

선택자 div .new에서 div와 .new 사이를 보세요.

힌트 둘

그 빈칸 때문에 선택자가 두 요소를 말하는지, 한 요소를 말하는지 정합니다.

정답

③ — 둘째 줄의 '장소 바뀜'만 빨갛습니다.

결과 화면
  • 빈칸으로 띄어 쓴 div .new는 'div 안에 든 .new'입니다. 둘째 줄 div 안의 b만 고릅니다(브라우저 규칙 4).
  • ① 띄어 쓴 것을 붙여 쓴 div.new('class가 new인 div')로 본 것입니다. 빈칸 하나로 고르는 요소가 바뀝니다.
  • ② 빈칸이 있어도 없어도 같다고 보고 .new가 붙은 요소를 모두 고른다고 본 것입니다. 첫째 줄 div는 제가 .new일 뿐, 안에 .new를 품지 않았습니다.

다시 볼 레슨: 조건 겹치기와 속성 선택자 · 하위·자식·형제 선택자

문제 7

동아리 신청 폼에 포커스 표시를 그렸습니다. (가) 이름 칸을 마우스로 누르면 파란 윤곽선이 보일까요? (나) 소식 알림 체크박스를 마우스로 누르면 보일까요? '보인다' · '안 보인다'로 쓰세요.

<label for="person">
  이름
</label>
<input
  type="text"
  id="person"
/>
<input
  type="checkbox"
  id="news"
/>
<label for="news">알림</label>
input:focus-visible {
  outline: 3px solid #005bb5;
}
힌트

두 칸의 type을 보고, 저마다 무엇을 하는 칸인지 적어 보세요.

힌트 둘

:focus-visible은 포커스가 왔다는 표시가 꼭 보여야 할 때만 켜집니다. 마우스로 눌렀을 때 글자 칸과 단추 꼴 칸이 어떻게 다른지 떠올려 보세요.

정답

받는 답: (가) 보인다 · (나) 안 보인다

이름 칸을 마우스로 누른 뒤입니다.

결과 화면
잰 값개발자 도구에서 본 값
  • #person의 :focus-visible켜짐
  • 지금 포커스의 읽는 이름이름

체크박스를 마우스로 누른 뒤입니다.

<label for="person">
  이름
</label>
<input
  type="text"
  id="person"
/>
<input
  type="checkbox"
  id="news"
/>
<label for="news">알림</label>
input:focus-visible {
  outline: 3px solid #005bb5;
}
결과 화면
잰 값개발자 도구에서 본 값
  • #news의 :focus켜짐
  • #news의 :focus-visible꺼짐
  • 두 칸 모두 누르면 포커스가 옵니다(:focus). 크롬은 그 가운데 글자를 칠 칸에만 :focus-visible을 켭니다 — 치는 자리를 보여 줘야 하기 때문입니다. 체크박스는 누르는 것으로 일이 끝나 마우스로는 켜지 않습니다.
  • 체크박스도 Tab으로 오면 :focus-visible이 켜져 윤곽선이 보입니다. 키보드로 다니는 사람에게는 늘 보입니다.
  • (나) 보인다는 :focus-visible을 :focus와 같은 것으로 본 것입니다. 마우스로 누를 때까지 늘 그리려면 :focus를 쓰지만, 단추 꼴 칸에서는 마우스 사용자에게 윤곽선이 거슬려 :focus-visible을 씁니다.

다시 볼 레슨: 마우스와 키보드 상태

문제 8

동아리 페이지에 단추처럼 보이는 것 셋을 같은 모양으로 꾸몄습니다. 페이지를 열고 Tab을 한 번 누르면 윤곽선이 그려지는 것은 어느 것일까요? 그 글을 쓰세요.

<div class="chip">신청</div>
<a class="chip">안내</a>
<button class="chip">
  문의
</button>
.chip {
  background-color: #d2d2d7;
}

.chip:focus-visible {
  outline: 3px solid #005bb5;
}
힌트

세 요소의 태그 이름과 속성을 하나씩 보세요.

힌트 둘

Tab이 멈출지는 모양이 아니라 요소의 역할이 정합니다. 세 요소 가운데 누를 수 있는 역할을 가진 것을 고르세요.

정답

받는 답: 문의

결과 화면
잰 값개발자 도구에서 본 값
  • 지금 포커스의 읽는 이름문의
  • 지금 포커스의 역할button
  • Tab은 누를 수 있는 요소에만 멈춥니다. div는 모양이 단추여도 역할이 없어 건너뜁니다. href가 없는 a도 링크가 아니라 건너뜁니다(브라우저 규칙 3).
  • 그래서 첫 Tab이 button에 멈추고, .chip:focus-visible이 그 단추에만 윤곽선을 그립니다.
  • 흔한 오답은 '신청'입니다. 단추처럼 보이면 단추처럼 동작한다고 본 것입니다(모양이 역할이라는 생각). 누를 일이면 button, 다른 페이지로 가는 일이면 href가 있는 a를 씁니다.

다시 볼 레슨: 링크와 단추 가르기 · 키보드로 다니기

문제 9

레시피 카드의 꼬리표 줄입니다. 꼬리표 가운데 첫째만 빨갛게 하려고 :first-child를 썼습니다. 이 코드는 화면에 어떻게 보일까요? 보기 셋 가운데 고르세요.

<p class="info">
  <b>신메뉴</b>
  <span>한식</span>
  <span>45분</span>
</p>
.info span:first-child {
  color: #d70015;
}
힌트

p.info의 자식을 위에서부터 1 · 2 · 3으로 적어 보세요.

힌트 둘

1번이 무엇인지 보세요. span:first-child는 두 조건이 붙어 있습니다 — span이고, 부모의 첫 자식이고. 둘을 다 갖춘 요소가 있는지 보세요.

정답

② — 모든 글이 검정입니다.

결과 화면
  • span:first-child는 'span이면서 부모의 첫 자식'입니다. p.info의 첫 자식은 b라 두 조건을 다 갖춘 요소가 없습니다. 오류 없이 아무것도 고르지 않습니다(브라우저 규칙 4).
  • ① 앞의 span을 빼고 '첫 자식'만 본 것입니다. 붙여 쓴 조건은 모두 맞아야 합니다.
  • ③ :first-child를 'span 가운데 첫째'로 본 것입니다. 자리는 종류를 가리지 않고 부모의 모든 자식 가운데서 셉니다.

'한식'만 빨갛게 하려면 .info b + span처럼 바로 앞 형제로 고르거나, b를 맨 뒤로 옮깁니다.

다시 볼 레슨: 자리로 고르기 · 하위·자식·형제 선택자

문제 10

하고 싶은 일마다 쓸 가상 클래스를 쓰세요. 괄호가 드는 것은 괄호까지 씁니다.

  • (가) 마우스를 올려 둔 동안만 요소를 고른다
  • (나) 부모 안의 마지막 자식인 요소를 고른다
  • (다) 괄호 안 조건에 맞는 것을 빼고 고른다
  • (라) 골라진 체크박스나 라디오를 고른다
힌트

모두 :으로 시작합니다. (다)는 '아니다'라는 뜻의 영어 낱말입니다.

정답

받는 답: (가) :hover · (나) :last-child · (다) :not() · (라) :checked

같은 답으로 치는 꼴: 앞의 :을 빼고 쓴 hover · (다) 괄호 안을 채운 :not(:last-child) 같은 꼴.

틀리는 꼴 — 까닭:

  • (가) :focus — 키보드나 마우스로 눌러 포커스가 온 요소를 고릅니다. 마우스를 올리기만 해서는 켜지지 않습니다.
  • (나) :last-of-type — 같은 태그 이름 가운데 마지막입니다. 부모의 마지막 자식이 다른 태그면 둘이 갈립니다.
  • (라) :selected — 없는 가상 클래스라 그 규칙째 버려집니다.

다시 볼 레슨: 마우스와 키보드 상태 · 자리로 고르기 · 골라진 칸과 :has()

문제 11

카페 메뉴판에서 추천 표시가 든 메뉴 칸에 회색 바탕을 칠하려 합니다. 이 코드는 화면에 어떻게 보일까요? 보기 셋 가운데 고르세요.

<div class="item">
  커피 <em class="best">추천</em>
</div>
<div class="item">라테</div>
<div class="best">추천</div>
.item:has(.best) {
  background-color: #d2d2d7;
}
힌트

세 줄의 요소마다 태그 이름과 class 값을 적어 보세요.

힌트 둘

:has() 앞의 .item과 괄호 안의 .best 가운데 칠해지는 것은 어느 쪽인지, 그리고 .best를 어디에서 찾는지 보세요.

정답

① — 첫째 줄(커피)만 띠처럼 회색 바탕입니다.

결과 화면
  • .item:has(.best)는 '안에 .best가 든 .item'을 고릅니다. 칠해지는 것은 앞의 .item이고, .best는 그 안에서만 찾습니다(브라우저 규칙 4).
  • 첫째 div 안에는 em.best가 있어 골라지고, 둘째 div(라테) 안에는 없어 골라지지 않습니다.
  • ② :has()가 그 요소 바깥까지 찾는다고 본 것입니다. 라테 칸 바로 뒤의 div.best는 형제라 라테 칸 안에 든 것이 아닙니다.
  • ③ 괄호 안의 요소가 칠해진다고 본 것입니다. 괄호 안은 고르는 조건일 뿐입니다.

다시 볼 레슨: 골라진 칸과 :has()

문제 12

카페 단체 주문 폼의 글자 칸 바탕을 연노랑으로 칠했습니다. 그런데 전화 칸만 연노랑이고 이름 칸은 흰 바탕 그대로입니다. 개발자 도구에서 이름 칸을 골라 보니 Styles 창에 input[type="text"] 규칙이 보이지 않습니다. 고칠 줄을 골라 고쳐 보세요.

힌트

Styles 창에 규칙이 보이지 않습니다. 찾는 차례 몇 번에서 막혔는지 정하고, 선택자의 조건과 이름 칸의 HTML을 견주어 보세요.

힌트 둘

대괄호 [type="text"]는 HTML에 적힌 속성을 봅니다. 두 칸의 여는 태그에 적힌 속성을 하나씩 세어 보세요.

결과 화면일부러 틀린 코드

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

정답

받는 답: 2번 줄의 <input에 type="text"를 넣습니다. 32칸에 맞추면 속성마다 한 줄로 나눠 씁니다.

<label for="person">
  이름
</label>
<input
  type="text"
  id="person"
/>
<label for="tel">전화</label>
<input
  type="text"
  id="tel"
/>
input[type="text"] {
  background-color: #fff6cc;
}
결과 화면
잰 값개발자 도구에서 본 값
  • #person의 background-colorrgb(255, 246, 204)

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

  • 1번 — 전화 칸이 연노랑이니 CSS는 닿았습니다.
  • 2번 — Elements 패널에 input 둘이 다 있습니다.
  • 3번 — 이름 칸을 고르면 Styles 창에 input[type="text"] 규칙이 보이지 않습니다. 규칙이 닿지 않았으니 선택자를 봅니다. 대괄호 선택자는 HTML에 적힌 type 속성을 보는데, 이름 칸의 여는 태그에는 type이 없습니다.

type을 적지 않은 input도 글자 칸으로 그려집니다. 그래도 속성이 적혀 있지 않아 [type="text"]가 고르지 못합니다(브라우저 규칙 4).

다르게 고쳐도 되는 곳: CSS의 선택자를 input으로 바꿔도 이 폼에서는 두 칸이 모두 칠해집니다. 다만 뒤에 체크박스를 더하면 그 칸까지 고르니, 글자 칸만 칠하려면 HTML에 type을 적는 쪽이 낫습니다.

  • 흔한 오답은 규칙에 !important를 붙이는 것입니다. 규칙이 이름 칸에 닿지 않으니 그대로 흰 바탕입니다.
  • 이름 칸만 #person으로 골라 같은 바탕색 규칙을 하나 더 쓰는 것도 흔합니다. 화면은 맞지만 같은 색을 두 곳에 적어, 다음에 색을 바꿀 때 한 곳을 빠뜨리기 쉽습니다 — 증상만 덮은 것입니다.

다시 볼 레슨: 조건 겹치기와 속성 선택자 · 브라우저 기본 스타일과 Styles 창

문제 13 (만들어 보기)

플로우 카페 메뉴판입니다. 첫 줄은 이달의 추천이라 검정 그대로 두고, 둘째 줄부터는 모두 회색 #6e6e73으로 칠하려 합니다. 하위 목표 주석 둘만 남긴 틀의 …를 채워 규칙 하나를 쓰세요. 메뉴 줄은 날마다 늘고 줄어듭니다.

<ul class="menu">
  <li>추천 라테 4500원</li>
  <li>커피 4000원</li>
  <li>녹차 3500원</li>
</ul>
/* 1. 고를 요소 */
…
/* 2. 바꿀 속성과 값 */
…

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

  • 위 세 줄이면 커피와 녹차가 회색이다.
  • 맨 아래에 '쿠키 2000원' 줄을 하나 더 넣어도, 첫 줄만 검정이고 나머지 셋이 회색이다.

확인 목록 — 하위 목표 3 '개발자 도구로 확인'입니다.

  • 첫 줄을 골라 Styles 창을 보면 내 규칙이 보이지 않는다 — 첫 줄에는 닿지 않았다(Styles 창).
  • 줄을 하나 더 넣고 새로고침해도 새 줄이 회색이다(화면).
  • 검사기 Error가 0이다(검사기 — Info는 접어 둠).
힌트

'둘째 줄부터'를 '첫 줄을 뺀 줄'로 바꿔 말해 보세요. 그 말에 맞는 가상 클래스가 이 단원에 있습니다.

정답

모범 답입니다.

<ul class="menu">
  <li>추천 라테 4500원</li>
  <li>커피 4000원</li>
  <li>녹차 3500원</li>
  <li>쿠키 2000원</li>
</ul>
/* 1. 고를 요소 */
.menu li:not(:first-child) {
  /* 2. 바꿀 속성과 값 */
  color: #6e6e73;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .menu li:not(:first-child)의 고른 글커피 4000원 · 녹차 3500원 · 쿠키 2000원
  • li:first-child의 글자색rgb(0, 0, 0)
  • li:last-child의 글자색rgb(110, 110, 115)

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

다르게 써도 되는 곳:

  • .menu li + li — '바로 앞에 li 형제가 있는 li'라 첫 줄만 빠집니다. 같은 화면입니다.
  • 색을 rgb(110 110 115)로 써도 같은 색입니다.

흔한 잘못:

  • :nth-child(2) · :nth-child(3)처럼 줄 번호를 하나씩 적으면 세 줄일 때는 맞지만, 넷째 줄 '쿠키'는 검정으로 남습니다. 줄이 늘고 줄어도 맞게 하려면 자리를 '첫 줄이 아닌 것'으로 고릅니다.
<ul class="menu">
  <li>추천 라테 4500원</li>
  <li>커피 4000원</li>
  <li>녹차 3500원</li>
  <li>쿠키 2000원</li>
</ul>
.menu li:nth-child(2),
.menu li:nth-child(3) {
  color: #6e6e73;
}
결과 화면
잰 값개발자 도구에서 본 값
  • li:last-child의 글자색rgb(0, 0, 0)
  • .menu li로 모두 회색을 칠한 뒤 :first-child만 검정으로 되돌리는 규칙을 하나 더 써도 화면은 같습니다. 다만 규칙 둘이 같은 속성을 두고 겨루게 되어, 어느 쪽이 이기는지는 9단원 '명시도'에서 봅니다.

다시 볼 레슨: 자리로 고르기 · 하위·자식·형제 선택자 · 규칙의 모양

문제 14 (만들어 보기)

레시피 노트의 일곱째 단계입니다(⟨컴퓨터⟩ · 20분 안팎 · 걸음마다 멈춰도 됩니다). 두 페이지의 내비게이션을 꾸미고 지금 보고 있는 페이지를 표시합니다. 후기 폼 칸에 포커스 표시를 그리고, 재료 줄 사이에 선을 그은 뒤 마지막 줄의 선만 지웁니다. 7단원 연습 문제의 만들어 보기를 마쳤다면 그 폴더에서 이어 갑니다.

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

recipe-note 폴더에 세 파일을 받아 둡니다.

recipe-note 안에 images 폴더를 만들고 그림 여섯을 받아 둡니다.

할 일 — 걸음 셋입니다. HTML에 이름표를 셋 붙이고, style.css 끝에 아래 표대로 규칙을 더합니다. 선택자는 표의 '고를 요소'를 보고 직접 정합니다.

걸음 1 — 내비게이션. index.html 내비게이션의 '레시피 목록' 링크와 kimchi.html 내비게이션의 '김치볶음밥' 링크에 class="current"를 붙입니다(그 페이지 자신을 가리키는 링크).

고를 요소바꿀 것
내비게이션 안의 링크밑줄 없음(text-decoration: none)
마우스를 올린 내비게이션 링크밑줄(underline)
내비게이션 안의 .current 링크글자색 #1d1d1f · 굵게

걸음 2 — 후기 폼.

고를 요소바꿀 것
포커스 표시가 켜진 입력 칸 · 고르는 칸 · 여러 줄 글 칸(선택자 목록 하나로)윤곽선 2px solid #005bb5 · 칸과 윤곽선 사이 2px(outline-offset: 2px)

걸음 3 — 재료. kimchi.html 재료 목록 ul에 class="ingredient-list"⁠를 붙입니다. 재료 줄 사이의 선은 CSS가 그립니다 — 10단원 '박스 모델'에서 자세히 봅니다. 첫 줄의 선언은 그대로 옮겨 씁니다.

고를 요소바꿀 것
재료 목록의 줄아래 선 — border-bottom: 1px solid #d2d2d7;
재료 목록의 마지막 줄아래 선 없음(border-bottom: none)

확인 목록:

  • 내비게이션 링크 둘에 밑줄이 없고, 마우스를 올린 링크에만 밑줄이 생긴다(화면 · 걸음 1).
  • 목록 페이지에서는 '레시피 목록', 김치볶음밥 페이지에서는 '김치볶음밥' 링크가 짙은 색으로 굵다(화면 · 걸음 1).
  • 본문의 '조리 순서' 링크는 밑줄이 그대로다 — 내비게이션 밖 링크는 건드리지 않았다(화면 · 걸음 1).
  • 이름 칸을 마우스로 누르면 파란 윤곽선이 보이고, 별점 칸 · 한 줄 평 칸에도 Tab으로 오면 보인다(화면 · 걸음 2).
  • 재료 다섯 줄 사이에 선이 있고 마지막 '김가루 조금' 아래에는 선이 없다. 재료 줄을 하나 더 넣어 저장하면 새 마지막 줄만 선이 없다 — 확인한 뒤 되돌린다(화면 · 걸음 3).
  • 두 페이지 모두 검사기 Error가 0이다(검사기 — Info는 접어 둠 · 세 걸음 끝).

폰으로만 따라왔다면 이 물음 하나로 대신합니다. 재료가 늘고 줄어도 마지막 재료 줄의 선만 지우는 선택자는 어느 것일까요?

  • ① .ingredient-list:last-child li
  • ② .ingredient-list li:nth-child(5)
  • ③ .ingredient-list li:last-child
힌트

걸음마다 그 걸음의 확인 목록을 봅니다. 걸음 1은 '내비게이션 안의 링크'를 내비게이션 밖 링크와 가르는 선택자부터 정하고, 걸음 3의 '마지막 줄'은 자리로 고르는 가상 클래스를 씁니다.

정답

모범 답입니다. 바뀐 곳만 싣습니다 — 다 고친 세 파일은 아래 받기 파일과 같습니다.

<!-- index.html 내비 -->
<a
  class="current"
  href="index.html"
>레시피 목록</a>
…
<!-- kimchi.html -->
<a
  class="current"
  href="kimchi.html"
>김치볶음밥</a>
…
<ul class="ingredient-list">
  …
</ul>
/* 머리글 · 내비 */
nav a {
  text-decoration: none;
}

nav a:hover {
  text-decoration: underline;
}

nav a.current {
  color: #1d1d1f;
  font-weight: bold;
}
/* 후기 폼 */
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: 2px solid #005bb5;
  outline-offset: 2px;
}

걸음 3의 두 규칙은 선택자가 길어 표로 싣습니다(style.css에는 위 규칙들과 같은 꼴로 씁니다).

선택자선언
.ingredient-list liborder-bottom: 1px solid #d2d2d7;
.ingredient-list li:last-childborder-bottom: none;

김치볶음밥 페이지의 내비게이션을 이 규칙으로 그리고 '레시피 목록'에 마우스를 올리면 이렇습니다.

<nav>
  <a
    href="index.html"
  >레시피 목록</a>
  <a
    class="current"
    href="kimchi.html"
  >김치볶음밥</a>
</nav>
nav a {
  text-decoration: none;
}

nav a:hover {
  text-decoration: underline;
}

nav a.current {
  color: #1d1d1f;
  font-weight: bold;
}
결과 화면
잰 값개발자 도구에서 본 값
  • nav a의 text-decoration-lineunderline
  • nav a.current의 text-decoration-linenone
  • nav a.current의 글자색rgb(29, 29, 31)
  • nav a.current의 font-weight700

이름 칸을 마우스로 누른 뒤입니다.

<label for="nickname">
  이름 (필수)
</label>
<input
  type="text"
  id="nickname"
/>
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: 2px solid #005bb5;
  outline-offset: 2px;
}
결과 화면
잰 값개발자 도구에서 본 값
  • #nickname의 outline-stylesolid
  • #nickname의 outline-colorrgb(0, 91, 181)

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

다르게 써도 되는 곳:

  • nav a.current 대신 .current만 써도 됩니다 — 이 페이지에서 .current는 내비게이션 링크뿐입니다.
  • 걸음 2의 선택자 목록을 규칙 셋으로 나눠 써도 같은 화면입니다.
  • 걸음 3은 재료 줄 가운데 :not(:last-child)인 줄에만 선을 그어도 됩니다. 그러면 지우는 규칙이 없어도 마지막 줄에 선이 없습니다.
  • 구역 주석은 없어도 화면이 같습니다. 9단원 연습 문제에서 구역 차례로 정리합니다.

흔한 잘못:

  • 걸음 1에서 a를 골라 밑줄을 지우면 본문의 '조리 순서' 링크 밑줄도 사라집니다 — 확인 목록 셋째 줄이 걸립니다.
<nav>
  <a
    href="index.html"
  >레시피 목록</a>
</nav>
<p>
  <a href="#steps">
    조리 순서
  </a>
</p>
a {
  text-decoration: none;
}
결과 화면
잰 값개발자 도구에서 본 값
  • p a의 text-decoration-linenone
  • 걸음 3에서 .ingredient-list:last-child li⁠로 쓰면 '부모의 마지막 자식인 재료 목록 안의 모든 줄'이 됩니다. 재료 목록이 section의 마지막 자식이라 다섯 줄의 선이 모두 사라집니다.
  • :nth-child(5)처럼 번호로 고르면 지금은 맞지만, 재료가 늘면 다섯째 줄 아래 선이 사라지고 새 마지막 줄에는 선이 남습니다 — 확인 목록 다섯째 줄이 걸립니다.

폰 물음의 답은 ③입니다. ①은 위 흔한 잘못처럼 모든 줄의 선을 지우고, ②는 재료가 다섯 줄일 때만 맞습니다.

다시 볼 레슨: 마우스와 키보드 상태 · 자리로 고르기 · 하위·자식·형제 선택자 · 태그·클래스·ID 선택자

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

HTML·CSS 목차로