5단원 '구조와 이름표'의 다섯 레슨에서 10문제를 내고, 2~4단원에서 3문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 고를 기호나 화면에 보일 글, 고친 줄은 종이에 끝까지 쓴 뒤 정답을 펼치세요. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.
결과를 묻는 문제의 결과 화면과 잰 값은 정답을 펼치면 보입니다. 잰 값의 역할은 화면 읽기 프로그램이 그 요소를 무엇으로 받는지입니다. 컴퓨터가 있으면 문제의 코드를 파일로 저장해 브라우저로 열고, 개발자 도구 Elements 패널 · Styles 창과 함께 맞춰 봅니다. 결과는 모두 크롬 기준입니다.
이 단원을 이미 안다면 1 · 3 · 5 · 7 · 8 · 9번을 먼저 풀어 보세요. 건너뛸지 볼 때는 힌트를 펴지 않고 풉니다. 다 맞히면 이 단원은 건너뛰어도 됩니다. 틀린 문제와 힌트를 펴고 맞힌 문제는 정답 끝의 '다시 볼 레슨'으로 갑니다. 끝의 두 문제(12 · 13번)는 직접 만들어 보는 문제라, 건너뛸지 가릴 때는 풀지 않아도 됩니다. 11번까지 풀고 쉬었다가 12번부터 이어 풀어도 됩니다. ⟨컴퓨터⟩가 붙은 문제는 컴퓨터에서 파일을 만들어 풉니다. 폰으로만 본다면 그 문제 끝의 폰 물음 하나로 대신합니다.
문제 1
자전거 동아리 첫 페이지입니다. 사이트 이름과 메뉴, 본문, 맨 아래 한 줄을 div로 묶고 이름표를 붙였습니다.
<div class="top">
<p>자전거 동아리</p>
<div class="menu">
<a href="trips.html">
라이딩 일정
</a>
</div>
</div>
<main>
<h1>11월 라이딩</h1>
<p>한강 자전거길을 달립니다.</p>
</main>
<div class="bottom">
<p>모이는 곳은 학교 정문</p>
</div>
(가) 화면 읽기 프로그램이 이 페이지의 영역 목록에 올리는 요소를 모두 고르세요. 기호를 다 쓰세요.
(나) 영역 목록에 머리글 · 내비게이션 · 바닥글도 들게 하려면, ㉠ · ㉡ · ㉣의 div를 저마다 어느 요소로 바꿔야 할까요?
- ㉠
div.top— 사이트 이름과 메뉴를 감쌈 - ㉡
div.menu— 메뉴 링크를 감쌈 - ㉢
main— 11월 라이딩 - ㉣
div.bottom— 모이는 곳 - ㉤ 없음
힌트
㉠ ~ ㉣의 태그 이름을 하나씩 적어 보세요.
힌트 둘
이름표 글자는 가리고 봅니다. top · menu · bottom은 코드를 읽는 사람을 위한 이름표입니다. 화면 읽기 프로그램은 요소의 역할을 어디에서 얻나요?
정답
(가) ㉢ — main 하나뿐입니다. (나) ㉠ header · ㉡ nav · ㉣ footer
.top의 역할generic.menu의 역할genericmain의 역할main.bottom의 역할generic
div의 역할generic은 뜻 없는 묶음이라 영역 목록에 들지 않습니다. 이름표의 글자는 역할을 바꾸지 않습니다 — 역할은 요소에서 나옵니다(브라우저 규칙 3).- (나)대로 바꾸면 화면은 그대로이고, 역할이 넷 모두 영역이 됩니다. 이름표는 그대로 두어도 됩니다 — CSS가 찾을 이름표이고, 역할과는 따로입니다.
<header class="top">
<p>자전거 동아리</p>
<nav class="menu">
<a href="trips.html">
라이딩 일정
</a>
</nav>
</header>
<main>
<h1>11월 라이딩</h1>
<p>한강 자전거길을 달립니다.</p>
</main>
<footer class="bottom">
<p>모이는 곳은 학교 정문</p>
</footer>.top의 역할banner.menu의 역할navigation.bottom의 역할contentinfo
- 흔한 오답은 ㉠ ㉡ ㉢ ㉣입니다.
top·menu같은 이름표가 그 부분이 무엇인지 알려 준다고 본 것입니다. 이름표는 사람과 CSS가 읽는 메모입니다. - ㉤을 고른 것은
main도 화면이 그대로라 영역이 아니라고 본 것입니다. 영역 요소는 화면이 아니라 역할을 바꿉니다.
문제 2
자전거 동아리 사이트에 코스 페이지를 더했습니다. 첫 페이지 index.html에서 쓰던 내비게이션을 그대로 복사해 courses/hangang.html에도 붙였습니다. 이 페이지에서 '처음으로'를 누르면 브라우저는 어느 파일을 열려고 할까요?
bike-club/
index.html
courses/
hangang.html
<nav>
<a href="index.html">
처음으로
</a>
</nav>
<h1>한강 자전거길</h1>
- ①
bike-club/index.html - ②
bike-club/courses/index.html - ③ 아무 파일도 열지 않고 지금 페이지에 머문다
힌트
폴더 나무에서 hangang.html과 index.html이 저마다 어느 폴더에 있는지 짚어 보세요.
힌트 둘
링크를 누른 페이지 hangang.html이 든 폴더에서 출발해, index.html을 한 조각씩 따라가 보세요.
정답
② — bike-club/courses/index.html입니다. 그런 파일이 없어 크롬은 '파일에 액세스할 수 없음' 페이지를 보입니다.
a의 주소courses/index.html
- 링크의 주소는 그 링크가 든 페이지에서 출발합니다(브라우저 규칙 1). 첫 페이지에서는
bike-club/에서 출발해 첫 페이지에 닿던index.html이,courses/안의 페이지에서는courses/안을 찾습니다. - 고치려면 한 칸 올라가
href="../index.html"로 씁니다. 머리글 · 내비게이션은 페이지마다 복사해 쓰기 쉬워, 폴더가 다른 페이지에 옮길 때 주소를 다시 봅니다. - ①은 주소가 늘 사이트 맨 위에서 출발한다고 본 것입니다(출발점이 늘 같다는 생각).
- ③은 없는 파일이면 브라우저가 미리 알고 멈춘다고 본 것입니다. 브라우저는 그 주소로 가 본 뒤에야 없다는 것을 압니다.
문제 3
article로 감싸기 알맞은 것을 모두 고르세요. 기호를 다 쓰세요.
- ① 자전거 동아리 페이지의 라이딩 후기 한 편(제목 · 날짜 · 글)
- ② 그 후기 안의 '준비물' 부분
- ③ 페이지 맨 아래의 '모이는 곳은 학교 정문' 한 줄
- ④ 여행 사이트에 올린 '여수 1박 2일' 일정 글 한 편
힌트
넷마다 그 안에 무엇이 드는지 적어 보세요.
힌트 둘
하나씩 그 부분만 떼어 다른 사이트에 옮겨 실었다고 생각해 보세요. 그것만 읽고도 무슨 말인지 알 수 있나요?
정답
① ④ — 떼어 옮겨도 그것만으로 읽히는 글 한 편입니다.
- ② '준비물'만 떼면 무슨 라이딩의 준비물인지 모릅니다. 후기의 한 부분이라
section입니다. - ③ 페이지 맨 아래 한 줄은 페이지의 바닥글
footer입니다. - 흔한 오답은 ① 하나만 고른 것입니다. 일정 글처럼 짧은 글은
article이 아니라고 본 것입니다 —article은 글의 길이가 아니라 '떼어도 말이 되나'로 고릅니다. - ②를 고른 것은 제목이 달린 덩어리면 모두
article이라고 본 것입니다.
다시 볼 레슨: article과 section 가르기 · 시맨틱 요소
문제 4
여수 여행 일정입니다. 바닥글의 한 줄을 작은 글씨로 보이려고 h6로 썼습니다.
<h1>여수 여행</h1>
<h2>1일 차</h2>
<p>오동도 산책</p>
<h2>2일 차</h2>
<p>향일암 해돋이</p>
<footer>
<h6>사진은 직접 찍었습니다</h6>
</footer>
- (가) 화면 읽기 프로그램이 제목만 모아 읽을 때 드는 줄은 몇 개일까요?
- (나) 바닥글의 한 줄을 제목 차례에서 빼고 작은 글씨로만 두려면,
h6를 어느 요소로 바꾸고 크기는 무엇으로 줄여야 할까요?
힌트
줄마다 태그 이름을 적고, 제목 요소인 줄에 표시해 보세요.
정답
(가) 4 — '여수 여행' · '1일 차' · '2일 차' · '사진은 직접 찍었습니다'입니다. (나) p로 바꾸고, 크기는 CSS의 font-size로 줄입니다.
h6의 역할headingh6의 글자 배율0.67footer의 역할contentinfo
- Error7줄The heading “h6” (with computed level 6) follows the heading “h2” (with computed level 2), skipping 3 heading levels.
- 제목 차례는 나무의 제목 요소에서 나옵니다(브라우저 규칙 3).
h6는 작게 그려지는 글이 아니라 6단계 제목이라, 바닥글의 한 줄이 '2일 차' 아래 제목으로 들어갑니다. 검사기도h2다음에h6가 와 3단계를 건너뛰었다고 Error를 냅니다. - (나)대로 고치면 작은 글씨로 남고(
h6의 굵기는 빠집니다 — 굵게 두려면font-weight), 제목 차례는 셋이 됩니다.
<footer>
<p>사진은 직접 찍었습니다</p>
</footer>
footer {
font-size: 13px;
}footer p의 역할paragraphfooter p의font-size13px
(나)의 요소를 곁말 요소 small로 쓴 것도 같은 답입니다 — 사진 출처 같은 한 줄에 맞는 요소라 제목 차례에서 빠집니다. 다만 크기는 small이 아니라 CSS font-size로 정합니다. small이 작게 그려지는 것도 기본 스타일의 모양입니다.
- 흔한 오답은 3입니다.
h6를 작은 글씨를 내는 태그로 본 것입니다(태그가 모양이라는 생각). 크기는 CSS로 정합니다.
문제 5
여수 1박 2일 일정의 꼬리표 줄을 두 코드로 썼습니다. 짝마다 두 코드의 화면이 같은지 다른지 고르세요. 다르다면 어디가 다른지 한 줄로 쓰세요. 셋 모두 같은 답이 나와도 됩니다.
(가)
<span>#섬</span>
<span>#배</span>
<span>#섬</span> <span>#배</span>
(나)
<div>#섬</div>
<div>#배</div>
<span>#섬</span>
<span>#배</span>
(다)
<p class="bold">#섬</p>
<p>#섬</p>
힌트
짝마다 두 코드에서 다른 글자만 찾아 표시하세요. 그 글자가 요소의 종류인지, 빈칸 · 줄바꿈인지, 이름표인지 가려 봅니다.
힌트 둘
(가)는 두 span 사이의 빈칸 글이 화면에서 무엇이 되는지, (다)는 이름표 bold를 고르는 CSS 규칙이 있는지 따져 봅니다.
정답
(가) 같다 · (나) 다르다 — 첫 코드는 두 줄, 둘째 코드는 한 줄에 '#섬 #배' · (다) 같다
- (가) 두
span사이의 줄바꿈과 빈칸은 같은 줄 안의 글이라 빈칸 하나로 그려집니다(브라우저 규칙 2). 줄을 바꿔 쓴 코드와 빈칸 하나로 쓴 코드가 같은 화면입니다. - (나) 블록
div는 한 줄을 통째로 차지해 위에서 아래로 쌓이고, 인라인span은 글자처럼 줄 안에서 흐릅니다(브라우저 규칙 7). - (다) 이름표
bold에는 모양이 없습니다. 그 이름표를 고르는 규칙이 없으니 화면은 이름표 없는 문단과 같습니다(브라우저 규칙 4 — 규칙이 닿아야 모양이 바뀝니다). - (가)를 '다르다'로 고른 것은 코드에서 줄을 바꾼 대로 화면도 줄이 바뀐다고 본 것입니다(친 대로 나온다는 생각).
- (나)를 '같다'로 고른 것은 블록 사이의 줄바꿈도 빈칸 하나로 합쳐진다고 본 것입니다. 블록은 늘 새 줄에서 시작합니다.
- (다)를 '다르다'로 고른 것은 이름표의 이름이 모양을 정한다고 본 것입니다(이름이 모양을 정한다는 생각).
다시 볼 레슨: div·span과 블록·인라인 · 공백 규칙과 특수 문자 · id와 class
문제 6
자전거 동아리 페이지의 바닥글입니다. 글을 가운데 두고 회색 작은 글씨로 꾸미려고 했습니다.
<footer class="site-footer">
<p>모이는 곳은 학교 정문</p>
</footer>
.site-footer {
color: #6e6e73;
text-align: centre;
font-size: 13px;
}
- (가) 바닥글의 글자색은?
- (나) 글은 줄의 어디에 놓일까요? 왼쪽 · 가운데 · 오른쪽 가운데 하나로 쓰세요.
- (다) 바닥글의 글자 크기(px)는?
힌트
선언 셋을 한 줄씩 따로 보고, 값의 글자를 하나하나 읽어 보세요.
힌트 둘
브라우저가 알아듣지 못하는 값을 만나면 그 선언을 어떻게 하는지 떠올리고, 그다음 줄에서 무엇을 하는지 따져 봅니다.
정답
(가) #6e6e73 · (나) 왼쪽 · (다) 13
.site-footer p의 글자색rgb(110, 110, 115).site-footer p의text-alignstart.site-footer p의font-size13px
rgb(110, 110, 115)와 #6e6e73은 같은 색입니다. text-align의 start는 글이 시작하는 쪽 — 한국어에서는 왼쪽입니다.
centre는text-align의 값이 아니라 그 선언 한 줄만 버려집니다(브라우저 규칙 4). 앞뒤 선언 둘은 그대로 닿습니다. Styles 창에서는 그 선언에 취소선이 그어지고 ⚠가 붙습니다.- 글자색과 크기는
footer에 주었지만 안의p가 물려받습니다. - (다)에 16을 쓴 것은 틀린 줄 아래는 모두 버려진다고 본 것입니다(CSS도 멈춘다는 생각).
- (나)에 가운데를 쓴 것은 브라우저가 비슷한 글자를 알아서 고쳐 읽는다고 본 것입니다. 값은
center로 씁니다.
다시 볼 레슨: 규칙의 모양 · 글자 꾸미기 · 브라우저 기본 스타일과 Styles 창
문제 7
플로우 카페 메뉴판입니다. 추천 표시로 id="pick"을 두 줄에 붙이고 #pick 규칙을 썼습니다.
<h1 id="pick">오늘의 추천</h1>
<p id="pick">라테 4500원</p>
<p>녹차 3500원</p>
#pick {
color: #d70015;
}
- (가) 빨갛게 그려지는 줄은 몇 줄일까요?
- (나) 이 HTML을 검사기에 넣으면 Error가 뜰까요? 뜬다면 몇 번 줄일까요?
힌트
#pick이 고르는 요소를 줄마다 id를 보며 짚어 보세요.
정답
(가) 2 — '오늘의 추천'과 '라테 4500원'입니다. (나) 뜬다 — 2번 줄
#pick의 고른 글오늘의 추천 · 라테 4500원p:last-child의 글자색rgb(0, 0, 0)
잰 값 둘째 줄은 셋째 줄(녹차)을 잰 것입니다.
- Error2줄Duplicate ID “pick”.
- Warning1줄The first occurrence of ID “pick” was here.
- CSS의
#pick은id가pick인 요소를 모두 고릅니다(브라우저 규칙 4). 그래서 두 줄 다 빨갛습니다. id는 한 페이지에 하나뿐인 이름표입니다. 검사기가 둘째 줄을 'pick이라는 ID가 겹친다'로 잡고, 첫 자리를 Warning으로 알려 줍니다.#pick링크로 옮겨 가거나 JavaScript가id로 찾을 때는 앞쪽 하나만 씁니다.- 여러 줄에 함께 붙일 이름표는
class="pick"이고, CSS는.pick으로 고릅니다. - 흔한 오답은 (가)의 1입니다.
id가 하나뿐이니 CSS도 앞쪽 하나만 칠한다고 본 것입니다 — 앞쪽 하나만 쓰는 것은 링크와 JavaScript입니다.
다시 볼 레슨: id와 class · 검사기로 틀린 HTML 찾기
문제 8
자전거 동아리 공지에서 두 줄을 hidden으로 감춰 두었습니다. 그 두 줄을 고르는 CSS 규칙도 하나씩 있습니다. 결과 화면에 보이는 글을 모두 쓰세요. 아무것도 안 보이면 '없음'이라고 씁니다.
<p class="memo" hidden>
물은 두 병
</p>
<p class="notice" hidden>
도시락 지참
</p>
.memo {
color: #6e6e73;
}
.notice {
display: block;
}
힌트
두 규칙이 저마다 무슨 속성을 정하는지 보세요.
힌트 둘
hidden은 기본 스타일의 어느 선언으로 감추는지 떠올리고, 그 속성을 우리 CSS가 정한 줄이 있는지 봅니다.
정답
받는 답: 도시락 지참
body의 보이는 글도시락 지참.memo의displaynone.notice의displayblock
hidden은 기본 스타일의display: none선언으로 요소를 감춥니다..notice는 우리 CSS가display를 정해, 기본 스타일보다 우리 규칙이 이겨 보입니다..memo규칙은 글자색만 정합니다.display는 기본 스타일 그대로라 '물은 두 병'은 감춰진 채입니다.- '없음'은
hidden이 붙으면 CSS가 무엇을 정해도 감춰진다고 본 것입니다. - '물은 두 병 / 도시락 지참'은 감춘 요소에 규칙이 닿기만 하면 다시 보인다고 본 것입니다. 다시 보이게 하는 것은
display를 정한 규칙뿐입니다. hidden으로 감출 요소에는display를 정하는 규칙이 닿지 않게 합니다.
다시 볼 레슨: id와 class · 브라우저 기본 스타일과 Styles 창
문제 9
자전거 동아리의 라이딩 기록 표입니다. HTML에는 tbody를 쓰지 않았는데, CSS는 tbody를 골라 글자를 빨갛게 칠했습니다.
<table>
<caption>
11월 라이딩 기록
</caption>
<tr>
<th>날짜</th>
<th>거리</th>
</tr>
<tr>
<td>11월 2일</td>
<td>32 km</td>
</tr>
</table>
tbody {
color: #d70015;
}
빨갛게 그려지는 칸을 모두 고르세요. 기호를 다 쓰세요.
- ㉠
caption11월 라이딩 기록 - ㉡
th날짜 - ㉢
th거리 - ㉣
td11월 2일 - ㉤
td32 km - ㉥ 없음
힌트
Elements 패널에 보일 나무를 먼저 그려 보세요.
힌트 둘
CSS가 고르는 것은 파일에 친 글자가 아니라 브라우저가 지은 나무입니다. 줄 tr 둘은 table 바로 안에 그대로 남을까요? 머리 줄도 몸통 줄과 같은 묶음에 들어가는지 따져 봅니다.
정답
㉡ ㉢ ㉣ ㉤ — 줄 둘의 칸 넷이 모두 빨갛습니다.
table의 나무<caption>11월 라이딩 기록 </caption> <tbody> <tr> <th> 날짜</th> <th> 거리</th> </tr> <tr> <td> 11월 2일</td> <td> 32 km</td> </tr> </tbody> caption의 글자색rgb(0, 0, 0)th의 글자색rgb(215, 0, 21)td의 글자색rgb(215, 0, 21)
- 브라우저는
table바로 안의 줄들을 몸통 묶음tbody에 넣어 나무를 짓습니다(브라우저 규칙 2).thead를 쓰지 않았으니 머리 줄도 같은tbody에 듭니다. CSS의tbody는 이렇게 지어진 요소를 골라, 그 안의 칸들이 글자색을 물려받습니다(브라우저 규칙 4). caption은 묶음 밖,table바로 안에 그대로 남아 검은 글자입니다. 잰 값 나무의caption안 앞뒤 빈칸은 줄을 나눠 쓴 자리의 빈칸 글이고, 화면에는 그려지지 않습니다.- ㉥을 고른 것은 나무가 파일에 친 그대로라
tbody가 없다고 본 것입니다. - ㉣ ㉤만 고른 것은 브라우저가 머리 줄을
thead로 알아서 나눈다고 본 것입니다. 머리 줄을 따로 묶으려면thead를 직접 씁니다.
문제 10
하고 싶은 일에 쓸 요소나 속성의 이름을 쓰세요.
- (가) 떼어 다른 곳에 옮겨도 그대로 읽히는 글 한 편을 감싼다
- (나) 뜻 없이, 줄 안의 몇 글자만 묶는다
- (다) 여러 요소에 함께 붙일 수 있는 이름표를 단다
- (라) 표 위에 붙어 그 표가 무엇인지 알리는 제목을 쓴다
힌트
(나)는 블록과 인라인 가운데 어느 쪽인지 먼저 가려 보세요.
정답
받는 답: (가) article · (나) span · (다) class · (라) caption
- 꺾쇠를 붙여
<article>처럼 써도 같은 답입니다. - (가)에
section을 쓰면 다른 답입니다 —section은 한 글 안의 한 부분입니다. - (나)에
div를 쓰면 다른 답입니다 —div는 한 줄을 통째로 차지하는 블록입니다. - (다)에
id를 쓰면 다른 답입니다 —id는 한 페이지에 하나뿐인 이름표입니다. - (라)에
th를 쓰면 다른 답입니다 —th는 표 안의 머리 칸입니다.
다시 볼 레슨: article과 section 가르기 · div·span과 블록·인라인 · id와 class · 표 table
문제 11
자전거 동아리 공지의 한 줄을 굵고 빨갛게 꾸미려고 이름표 둘을 붙였습니다. 굵게는 되는데 빨갛게 되지 않습니다. 검사기에 넣었더니 아래 줄이 떴습니다. 몇 번 줄을 어떻게 고쳐야 할까요? 고칠 줄을 골라 고쳐 보세요.
- Error1줄Duplicate attribute “class”.
힌트
검사기가 짚은 줄의 속성을 하나씩 세어 보세요.
힌트 둘
한 요소에 같은 속성을 두 번 쓰면 브라우저는 그 가운데 하나만 씁니다. 이름표 둘을 한 속성에 담는 꼴을 떠올려 봅니다.
위아래 화살표로 줄을 옮기고 Enter로 고릅니다.
여기서 고친 코드는 저장하지도 보내지도 않습니다. 새로 열면 처음 코드입니다.
정답
받는 답: 1번 줄을 <p class="tip alert">으로 고칩니다.
<p class="tip alert">
우천 시 취소
</p>
.tip {
font-weight: bold;
}
.alert {
color: #d70015;
}p의 글자색rgb(215, 0, 21)p의font-weight700
검사기 Error는 '안 먹을 때 찾는 차례'의 2번 '요소가 나무에 내 생각대로 있나'에서 봅니다.
- 1번 '파일이 닿았나'는 지나갑니다 —
.tip의 굵기가 먹으니 CSS는 닿았습니다. - 2번 — 검사기가 1번 줄에 '
class속성이 겹친다'고 알려 줍니다. 브라우저는 같은 속성을 두 번 만나면 앞의 것만 나무에 둡니다. 그래서 이 문단의 이름표는tip하나이고,.alert이 고를 요소가 없습니다. - 이름표 둘은
class하나 안에 빈칸으로 나눠 적습니다.
다르게 고쳐도 되는 곳: class="alert tip"처럼 차례를 바꿔도 됩니다. 이름표의 차례는 뜻이 없습니다.
- 흔한 오답은
class="tip"을 지우는 것입니다. 빨갛게는 되지만 굵기가 빠집니다. .tip규칙에color: #d70015;를 더 쓰는 것도 흔합니다. 화면은 맞지만 검사기 Error는 그대로이고,alert이름표는 나무에 없습니다 — 증상만 덮은 것입니다.
다시 볼 레슨: id와 class · 검사기로 틀린 HTML 찾기
문제 12 (만들어 보기)
플로우 카페 첫 페이지를 영역으로 나눕니다. 페이지에 들 내용은 아래와 같습니다.
- 가게 이름 '플로우 카페'와 메뉴 페이지(
menu.html)으로 가는 링크 '메뉴' - 제목 '오늘의 메뉴'와 문단 '커피 4000원'
- 맨 아래 한 줄 '서울 플로우길 1'
하위 목표 셋을 차례로 채우세요. 1은 표로, 2 · 3은 코드로 씁니다.
<!-- 1. 페이지의 영역 정하기 -->
…
<!-- 2. 시맨틱 요소로 감싸기 -->
…
<!-- 3. 이름표 붙이기 -->
…
나와야 할 결과는 둘입니다.
- 화면은 영역으로 감싸기 전과 같다.
- 영역 목록에 머리글 · 내비게이션 · 본문 · 바닥글 넷이 들고, 머리글과 바닥글에 CSS가 찾을
class이름표cafe-header·cafe-footer가 붙는다.
힌트
1은 내용 셋마다 '어느 영역인가'를 한 칸씩 적습니다. 2는 1의 표대로 감싸고, 3은 2에서 쓴 여는 태그에 이름표를 더합니다.
정답
1 — 페이지의 영역 정하기
| 페이지의 부분 | 영역 |
|---|---|
| 가게 이름 · 메뉴 링크 | 머리글 header(링크는 nav) |
| '오늘의 메뉴'와 커피 | 본문 main |
| '서울 플로우길 1' | 바닥글 footer |
2 · 3 — 감싼 뒤 이름표를 더한 코드입니다.
<header class="cafe-header">
<p>플로우 카페</p>
<nav>
<a href="menu.html">
메뉴
</a>
</nav>
</header>
<main>
<h1>오늘의 메뉴</h1>
<p>커피 4000원</p>
</main>
<footer class="cafe-footer">
<p>서울 플로우길 1</p>
</footer>.cafe-header의 역할bannernav의 역할navigationmain의 역할main.cafe-footer의 역할contentinfo
확인 목록을 다 채웠으면 맞습니다. 코드가 모범 답과 달라도 됩니다.
다르게 써도 되는 곳:
- 가게 이름을
p대신 메뉴 링크처럼 링크로 써도 됩니다. 영역과 이름표는 같습니다. nav에도 이름표를 붙여도 됩니다.
흔한 잘못:
- 가게 이름을
h1으로 쓰면 제목이 '플로우 카페'와 '오늘의 메뉴' 둘이 되어, 이 페이지의 제목이 무엇인지 흐려집니다. 페이지 전체의 제목은 하나로 둡니다. - 이름표를
class="header"처럼 요소 이름으로 붙여도 화면은 같지만, 3의 결과(cafe-header)와 다릅니다. CSS가 찾는 글자와 똑같이 씁니다. - 메뉴 링크를
nav없이header안에만 두면 영역 목록에 내비게이션이 들지 않습니다.
문제 13 (만들어 보기)
레시피 노트의 넷째 단계입니다(⟨컴퓨터⟩ · 30분 안팎 · 걸음마다 멈춰도 됩니다). 두 페이지를 머리글 · 본문 · 바닥글로 나누고, 목록을 카드 여섯 장으로 바꿔 이름표를 붙이고, 김치볶음밥 페이지에 영양 정보 표를 더합니다.
이 단계 시작 파일 — 4단원 끝 상태
4단원 연습 문제 14번의 모범 답이고, 레시피 한 페이지 만들기의 완성 파일과 같습니다. recipe-note 폴더에 세 파일을 두고 시작합니다.
recipe-note 안 images 폴더에 그림 여섯을 받아 둡니다 — 4단원에서 받은 kimchi.svg가 있으면 그대로 씁니다. 카드에 내 그림을 써도 됩니다 — 가로가 긴 4:3 그림이면 width="200" height="150"에서 찌그러지지 않습니다.
할 일 — 네 걸음입니다.
걸음 1. 두 페이지의 영역 — 두 HTML의 body 안을 세 영역으로 나눕니다(12번의 영역 나누기와 같은 차례).
| 영역 | 이름표 | 넣을 것 |
|---|---|---|
머리글 header | site-header | 사이트 이름 링크 '레시피 노트'(목록 페이지로 — 이름표 site-name) · 내비게이션 nav 안에 링크 둘 '레시피 목록'(목록 페이지) · '김치볶음밥'(김치볶음밥 페이지) |
본문 main | — | 지금 body 안에 있던 내용 |
바닥글 footer | site-footer | 문단 '내가 만든 요리를 기록하는 곳' |
김치볶음밥 페이지 맨 위의 '레시피 목록으로' 문단은 내비게이션이 대신하니 지웁니다.
걸음 2. 목록 페이지의 카드 여섯 — 본문의 제목은 h1 '레시피 목록'으로 바꿉니다(사이트 이름 '레시피 노트'는 머리글에 있습니다). 목록 ul에 이름표 recipe-list, 요리마다 li에 이름표 recipe-card를 붙이고, 카드 한 장 안은 이 차례로 씁니다.
- 그림 —
alt는 요리 이름,width="200" height="150" - 요리 이름과 배지를 묶는
div(이름표recipe-card-head) — 안에 요리 이름h2, 그 뒤 배지span(이름표badge, 글 '한식') - 조리 시간 문단 '조리 N분'
| 요리 | 그림 | 조리 시간 |
|---|---|---|
김치볶음밥(이름을 kimchi.html 링크로) | kimchi.svg | 15분 |
| 계란말이 | gyeran-mari.svg | 20분 |
| 된장찌개 | doenjang.svg | 25분 |
| 떡볶이 | tteokbokki.svg | 20분 |
| 잡채 | japchae.svg | 45분 |
| 미역국 | miyeok-guk.svg | 40분 |
걸음 3. 김치볶음밥 페이지의 글 한 편 — 본문 안의 내용을 article 하나로 감싸고, '재료'(제목과 목록) · '조리 순서'(제목과 목록)를 저마다 section으로 감쌉니다. 정보 문단의 '한식'은 배지 span(이름표 badge)으로 감쌉니다. 조리 순서 section 뒤에 '영양 정보' section을 더합니다 — 제목 h2 '영양 정보'와 표입니다.
| 표에 들 것 | 값 |
|---|---|
| 캡션 | 1인분 기준, 대략의 값 |
| 머리 줄 | 항목 · 양 |
| 줄 다섯(줄 머리 · 양) | 열량 550 kcal · 탄수화물 52 g · 단백질 18 g · 지방 30 g · 나트륨 1550 mg |
걸음 4. CSS 한 걸음 — 머리글 · 바닥글 꾸미기 — style.css 끝에 이름표로 고르는 규칙 둘을 더합니다.
| 고를 요소 | 바꿀 것 |
|---|---|
사이트 이름(.site-name) | 글자색 #1d1d1f · 굵게 |
바닥글(.site-footer) | 글자색 #6e6e73 · 글자 크기 14px · 가운데 |
확인 목록:
- 두 페이지 맨 위에 진한 굵은 '레시피 노트'와 링크 둘이, 맨 아래에 가운데 놓인 회색 한 줄이 있다(화면 · 걸음 1 · 4).
- 두 페이지 모두 Elements 패널에서
body바로 안이header·main·footer셋이다(Elements 패널 · 걸음 1). - 목록 페이지에 카드 여섯 장이 그림 · 이름 · '한식' · 조리 시간 차례로 보이고, 깨진 그림이 없다(화면 · 걸음 2).
- 목록 페이지의
li여섯이 모두class="recipe-card"이다(Elements 패널 · 걸음 2). - 김치볶음밥 페이지의 영양 정보 표가 머리 줄 아래 두 칸씩 다섯 줄로 맞춰지고, Elements 패널에서
table안에tbody가 보인다(화면 · Elements 패널 · 걸음 3). - 창 폭을 360쯤으로 줄여도 두 페이지가 옆으로 밀리지 않는다(화면 · 네 걸음 끝).
- 두 페이지 모두 검사기 Error가 0이다(검사기 — Info는 접어 둠 · 네 걸음 끝).
폰으로만 따라왔다면 이 물음 하나로 대신합니다. 카드 한 장에서 그림 다음에 오는 줄입니다. 차례대로 기호를 늘어놓으세요.
- ㉠
<h2>계란말이</h2> - ㉡
</div> - ㉢
<div class="recipe-card-head"> - ㉣
<p>조리 20분</p> - ㉤
<span class="badge">한식</span>
힌트
걸음마다 그 걸음의 확인 목록을 봅니다. 걸음 1은 12번의 세 하위 목표(영역 정하기 → 감싸기 → 이름표)를 두 페이지에 한 번씩 합니다.
정답
모범 답 전체는 받기 파일입니다. 내 파일과 견줘 봅니다.
걸음 1 · 4 — 두 페이지의 머리글 · 바닥글(본문 main은 그 사이)과 style.css 끝에 더한 규칙 둘입니다. 내비게이션의 링크는 안에서 줄을 나누지 않고, 여는 태그만 나눠 글을 > 바로 뒤에 붙였습니다.
<!-- index.html -->
<header class="site-header">
<a
class="site-name"
href="index.html"
>
레시피 노트
</a>
<nav>
<a
href="index.html"
>레시피 목록</a>
<a
href="kimchi.html"
>김치볶음밥</a>
</nav>
</header>
<footer class="site-footer">
<p>
내가 만든 요리를 기록하는 곳
</p>
</footer>
/* style.css */
.site-name {
color: #1d1d1f;
font-weight: bold;
}
.site-footer {
color: #6e6e73;
font-size: 14px;
text-align: center;
}header의 역할bannernav의 역할navigationfooter의 역할contentinfo.site-name의 글자색rgb(29, 29, 31).site-name의font-weight700.site-footer p의 글자색rgb(110, 110, 115).site-footer p의font-size14px.site-footer p의text-aligncenter
걸음 2 — 김치볶음밥 카드입니다. 나머지 다섯 장은 요리 이름을 링크 없이 <h2>계란말이</h2>처럼 씁니다. 배지도 글을 > 뒤에 붙였습니다.
<!-- index.html -->
<ul class="recipe-list">
<li class="recipe-card">
<img
src="images/kimchi.svg"
alt="김치볶음밥"
width="200"
height="150"
/>
<div
class="recipe-card-head"
>
<h2>
<a
href="kimchi.html"
>
김치볶음밥
</a>
</h2>
<span
class="badge"
>한식</span>
</div>
<p>조리 15분</p>
</li>
…
</ul>걸음 3 — 김치볶음밥 페이지 본문의 뼈대와 영양 정보 표입니다.
<!-- kimchi.html -->
<main>
<article>
<h1>김치볶음밥</h1>
<p>
<span
class="badge"
>한식</span>
· 조리 15분 · 2인분
</p>
…
<section>
<h2>재료</h2>
…
</section>
<section>
<h2 id="steps">
조리 순서
</h2>
…
</section>
<section>
<h2>영양 정보</h2>
…
</section>
</article>
</main><!-- kimchi.html -->
<table>
<caption>
1인분 기준, 대략의 값
</caption>
<thead>
<tr>
<th>항목</th>
<th>양</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">
열량
</th>
<td>550 kcal</td>
</tr>
<tr>
<th scope="row">
탄수화물
</th>
<td>52 g</td>
</tr>
<tr>
<th scope="row">
단백질
</th>
<td>18 g</td>
</tr>
<tr>
<th scope="row">
지방
</th>
<td>30 g</td>
</tr>
<tr>
<th scope="row">
나트륨
</th>
<td>1550 mg</td>
</tr>
</tbody>
</table>table의 읽는 이름1인분 기준, 대략의 값tbody th의 고른 글열량 · 탄수화물 · 단백질 · 지방 · 나트륨td의 역할cell
확인 목록을 다 채웠으면 맞습니다. 코드가 모범 답과 달라도 됩니다.
다르게 써도 되는 곳:
- 내비게이션의 링크 둘을 목록(
ul안li둘)으로 써도 됩니다. 화면은 점이 붙은 두 줄이 되지만 영역 · 링크는 같습니다. - 그림의
alt는 '계란말이 한 접시'처럼 보이는 것을 한 문장으로 써도 됩니다. - 표의
thead·tbody를 쓰지 않아도 됩니다. 브라우저가tbody를 지어 넣어 나무와 화면이 같습니다.
흔한 잘못:
- 내비게이션의 링크 안에서 줄을 나누면(
<a href="index.html">다음 줄에 '레시피 목록') 첫 링크 끝의 빈칸이 링크 안에 남아, 두 링크의 밑줄이 하나로 이어져 보입니다. 줄 안의 빈칸 글은 빈칸 하나로 그려지기 때문입니다(브라우저 규칙 2). - 머리글을
main안에 두면 역할이 머리글(banner)이 아니라sectionheader가 되어, 영역 목록에 머리글이 들지 않습니다. 머리글 · 바닥글은main밖,body바로 안에 둡니다. - 카드의 이름표를
class="recipe card"처럼 띄어 쓰면 이름표가recipe·card둘이 됩니다. 이름표 하나는 붙여 씁니다(recipe-card). .site-footer규칙의 점을 빠뜨려site-footer로 쓰면 그런 태그가 없어 아무것도 고르지 않습니다. 바닥글은 본문과 같은 글씨 그대로입니다.
폰 물음의 답은 ㉢ ㉠ ㉤ ㉡ ㉣입니다. ㉠과 ㉤을 바꾸면 배지가 이름 앞에 옵니다 — 이 단계는 이름 뒤에 둡니다.
다시 볼 레슨: 시맨틱 요소 · article과 section 가르기 · div·span과 블록·인라인 · id와 class · 표 table