10단원 '박스 모델'의 일곱 레슨에서 10문제를 내고, 4 · 9단원에서 3문제를 섞었습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 값이나 고친 줄은 종이에 끝까지 쓴 뒤 정답을 펼치세요. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.
결과를 묻는 문제의 결과 화면과 잰 값은 정답을 펼치면 보입니다. 너비를 묻는 문제는 종이에 상자 셈을 적어 풀고, 정답의 셈과 견주어 보세요. 컴퓨터가 있으면 문제의 HTML과 CSS를 파일로 저장해 브라우저로 열고, 개발자 도구 Computed 창의 상자 그림과 값을 맞춰 봅니다. 결과는 모두 크롬 기준입니다.
이 단원을 이미 안다면 1 · 3 · 4 · 5 · 7 · 10번을 먼저 풀어 보세요. 건너뛸지 볼 때는 힌트를 펴지 않고 풉니다. 다 맞히면 이 단원은 건너뛰어도 됩니다. 틀린 문제와 힌트를 펴고 맞힌 문제는 정답 끝의 '다시 볼 레슨'으로 갑니다. 끝의 두 문제(12 · 13번)는 직접 만들어 보는 문제라, 건너뛸지 가릴 때는 풀지 않아도 됩니다. 11번까지 풀고 쉬었다가 12번부터 이어 풀어도 됩니다. ⟨컴퓨터⟩가 붙은 문제는 컴퓨터에서 파일을 만들어 풉니다. 폰으로만 본다면 그 문제 끝의 폰 물음 하나로 대신합니다.
문제 1
짝마다 두 코드의 화면이 같은지 다른지 쓰세요. 다르면 어디가 다른지도 한 줄로 쓰세요. 셋 모두 같은 답이 나와도 됩니다.
(가)
<p class="tip">약불로 볶기</p>
.tip {
border: 3px #6e6e73;
}
<p class="tip">약불로 볶기</p>
(나)
<h3>재료</h3>
<p>밥 2공기</p>
h3 {
margin: 0 0 20px;
}
p {
margin: 20px 0 0;
}
<h3>재료</h3>
<p>밥 2공기</p>
h3 {
margin: 0 0 20px;
}
p {
margin: 0;
}
(다)
<p class="memo">불 끄기</p>
.memo {
padding-bottom: 20px;
padding: 8px;
background-color: #f5f5f7;
}
<p class="memo">불 끄기</p>
.memo {
padding: 8px;
padding-bottom: 20px;
background-color: #f5f5f7;
}
힌트
짝마다 두 코드에서 바뀐 곳을 찾고, 그 줄이 상자의 어느 겹(내용 · 안쪽 여백 · 테두리 · 바깥 여백)을 정하는지 적어 보세요.
힌트 둘
(가)는 테두리가 그려지려면 무엇이 꼭 있어야 하는지, (나)는 위아래로 맞닿은 바깥 여백이 어떻게 되는지, (다)는 짧게 적기가 적지 않은 칸을 어떻게 하는지 떠올리세요.
정답
(가) 같다 · (나) 같다 · (다) 다르다 — 뒤 코드는 글 아래 칠한 면이 더 넓다
- (가) 테두리는 종류가 있어야 그려집니다. 종류(
solid같은)를 빠뜨리면 종류가 처음 값none이 되어 굵기도 0 — 테두리가 없는 뒤 코드와 같습니다. - (나) 제목 아래 20px과 문단 위 20px은 위아래로 맞닿아 겹쳐, 큰 값 하나 20px만 남습니다 — 바깥 여백 겹침입니다. 문단 위 여백을 0으로 해도 틈은 제목의 20px 그대로입니다.
- (다) 짧게 적기
padding: 8px은 네 방향을 모두 정합니다. 앞 코드는 그 줄이 뒤에 와서 아래 20px을 8px로 되돌리고, 뒤 코드는 뒤에 쓴padding-bottom이 아래만 20px로 바꿉니다(브라우저 규칙 4). - (가) 다르다는 굵기와 색만 있으면 그려진다고 본 것입니다.
- (나) 다르다는 바깥 여백이 늘 더해진다고 본 것입니다(바깥 여백은 늘 더해진다는 생각) — 앞 코드를 40px 틈으로 본 것입니다.
- (다) 같다는 짧게 적기가 앞에서 정한 칸은 건드리지 않는다고 본 것입니다(짧게 적기는 적은 칸만 바꾼다는 생각).
문제 2
레시피 노트 카드에 안쪽 여백 · 노란 바탕 · 회색 글자를 줬습니다. 화면에서는 카드 안이 모두 노랗게 보입니다. (가) Computed 창의 background-color가 노랑 rgb(255, 246, 204)로 나오는 요소를 모두 고르세요. (나) Computed 창의 글자색이 회색 rgb(110, 110, 115)로 나오는 요소를 모두 고르세요. 기호를 다 쓰세요.
<div class="card">
<h3>미역국</h3>
<p>
조리 40분 <em>쉬움</em>
</p>
<button>담기</button>
</div>
.card {
padding: 12px;
background-color: #fff6cc;
color: #6e6e73;
}
- ㉠
div카드 - ㉡
h3미역국 - ㉢
p조리 40분 - ㉣
em쉬움 - ㉤
button담기
힌트
다섯 요소마다 그 요소에 직접 닿는 선언을 적어 보세요.
힌트 둘
기본 스타일의 선언도 셉니다. 그다음 속성마다 물려받는 속성인지 보세요. 글자색은 물려받고 바탕색은 물려받지 않습니다. 바탕을 칠하지 않은 요소는 투명해서 뒤의 바탕이 비쳐 보입니다.
정답
(가) ㉠ · (나) ㉠ ㉡ ㉢ ㉣
.card의background-colorrgb(255, 246, 204)h3의background-colorrgba(0, 0, 0, 0)em의background-colorrgba(0, 0, 0, 0)h3의 글자색rgb(110, 110, 115)em의 글자색rgb(110, 110, 115)button의 글자색rgb(0, 0, 0)button의background-colorrgb(239, 239, 239)
- (가) 바탕색은 물려받지 않는 속성이라, 안쪽 요소의
background-color는 처음 값인 투명입니다. 투명한 상자 뒤로 카드의 노랑이 비쳐 노랗게 보일 뿐입니다 — 보이는 색과 계산된 값이 다릅니다. 단추는 기본 스타일이 바탕을 직접 정해 회색 단추입니다. - (나) 글자색은 물려받는 속성이라 닿는 선언이 없는 ㉡ ㉢ ㉣이 부모를 따라 회색입니다(브라우저 규칙 5). 단추는 기본 스타일이 글자색을 직접 정해 둬 물려받지 않습니다(크롬 기준).
- (가)에 ㉡ ㉢ ㉣까지 골랐다면 바탕색도 물려받는다고 본 것입니다(다 물려받는다는 생각).
- (나)에 ㉤까지 골랐다면 단추도 부모 글자색을 물려받는다고 본 것입니다. 단추 · 링크는 기본 스타일이 직접 닿습니다.
문제 3
강릉 여행 일정 페이지의 '숙소 위치' 링크를 넓은 띠처럼 보이게 하려고 너비와 바탕색을 줬습니다. 이 코드는 화면에 어떻게 보일까요? 보기 셋 가운데 고르세요.
<a
class="map"
href="map.html"
>숙소 위치</a>
.map {
width: 200px;
background-color: #d6ecff;
}
힌트
a가 처음에 어떤 display로 놓이는지 적어 보세요.
힌트 둘
그 display에서 width가 먹는지 보세요.
정답
③ — 글자만큼만 칠한 띠입니다.
a는 처음display가inline입니다. 인라인 상자는 너비 · 높이 · 위아래 바깥 여백을 쓰지 않고, 안의 글자만큼 차지합니다.width선언은 알아들었지만 효과가 없습니다 — Styles 창에서 흐린 글로 보입니다(크롬 기준).- ①은 인라인에도 너비가 먹는다고 본 것입니다. 너비를 먹이려면
display: inline-block을 줍니다. - ②는
width를 주면 블록처럼 줄을 차지한다고 본 것입니다. 줄을 통째로 차지하는 것은display: block입니다.
다시 볼 레슨: 블록과 인라인 display
문제 4
플로우 카페 쿠폰 칸입니다. (가) Computed 창에서 .coupon의 width는 몇 px로 나올까요? (나) 쿠폰이 차지하는 너비는 몇 px일까요? 숫자만 쓰세요.
<div class="coupon">
라테 500원 할인
</div>
.coupon {
width: 180px;
padding: 12px 20px;
border: 3px dashed #d70015;
margin: 10px;
}
힌트
상자 셈의 네 걸음을 차례로 적으세요. padding의 값 둘이 어느 방향인지부터 정합니다.
정답
(가) 180 · (나) 226
.coupon의width180px.coupon의 너비226px
| 걸음 | 셈 | 값 |
|---|---|---|
| 1. 내용 칸 | width | 180 |
| 2. 안쪽 여백 더하기 | 180 + 20 × 2 | 220 |
| 3. 테두리 더하기 | 220 + 3 × 2 | 226 |
| 4. 바깥 여백은 따로 | 이웃과의 사이 10 — 넣지 않음 | — |
width는 따로 정하지 않으면 내용 칸만 잽니다. Computed 창의width도 내용 칸 180px이고, 차지하는 너비는 그 바깥에 안쪽 여백과 테두리를 더한 값입니다(브라우저 규칙 6).padding: 12px 20px은 위아래 12 · 좌우 20입니다. 너비에는 좌우 20만 듭니다.- (나)에서 흔한 오답은 180입니다(
width가 차지하는 너비라는 생각). - 210은 좌우에 12를 더한 것 — 값 둘의 차례를 거꾸로 본 것입니다. 246은 바깥 여백까지 더한 것입니다.
다시 볼 레슨: 너비와 box-sizing · 여백 짧게 적기
문제 5
바둑 동아리 공지 페이지의 본문 칸입니다. 창 폭이 900px일 때 .page의 margin-left는 몇 px일까요?
<div class="page">
<h1>바둑 동아리</h1>
</div>
.page {
max-width: 600px;
padding: 0 20px;
margin: 0 auto;
}
- ① 122px
- ② 130px
- ③ 142px
힌트
.page의 부모 body의 내용 칸 너비와 .page가 차지하는 너비를 먼저 셈하세요.
힌트 둘
max-width도 따로 정하지 않으면 내용 칸을 잽니다. auto 둘은 남는 자리를 똑같이 나눕니다.
정답
①입니다.
900px.page의 너비640px.page의margin-left122px
body는 기본 스타일로 바깥 여백 8px이 있어 내용 칸이 900 − 16 = 884px입니다..page는 내용 칸 600에 좌우 안쪽 여백 20씩을 더해 640px을 차지합니다(브라우저 규칙 6).- 남는 자리 884 − 640 = 244를
auto둘이 나눠 왼쪽이 122px입니다. - ③ 142는
max-width600이 안쪽 여백까지 든 너비라고 본 것입니다(width가 차지하는 너비라는 생각). - ② 130은 창 폭 900에서 바로 나눈 것입니다.
body의 바깥 여백 8px이 양쪽에서 먼저 빠집니다.
다시 볼 레슨: 가운데 모으기 · 너비와 box-sizing
문제 6
강릉 여행 일정 페이지에서 본문을 가운데로 모으고 아래를 24px 띄우려고, 짧게 적기 한 줄에 값 셋을 적었습니다. 창 폭 1280px에서 (가) main의 너비는 몇 px일까요? (나) main의 margin-left는 몇 px일까요?
<main>
<h1>강릉 여행 일정</h1>
</main>
main {
max-width: 520px;
margin: 0 auto 24;
}
힌트
두 선언을 하나씩 보고, 알아듣지 못하는 값이 든 선언이 있는지 표시하세요.
힌트 둘
브라우저는 알아듣지 못한 선언 하나만 버리고 나머지는 그대로 씁니다. 버린 선언은 없던 것과 같습니다.
정답
(가) 520 · (나) 0
1280pxmain의 너비520pxmain의margin-left0px
24에 단위가 없어margin: 0 auto 24;한 줄을 통째로 버립니다(브라우저 규칙 4).main의 바깥 여백은 처음 그대로 0이라 가운데로 모이지 않고 왼쪽에 붙습니다.max-width: 520px은 그대로 먹어 너비는 520px입니다.- (나) 372는 단위 빠진
24만 버리고0 auto는 먹는다고 본 것입니다. 버리는 단위는 값 하나가 아니라 선언 하나입니다. - (가) 1264는 규칙 전체가 버려진다고 본 것입니다(CSS도 멈춘다는 생각).
- 고치려면
24px로 단위를 붙입니다.
문제 7
강릉 여행 일정의 하루 칸에 바깥 여백을 위 0 · 오른쪽 12px · 아래 24px · 왼쪽 12px로 주려 합니다. 짧게 적기 margin 한 줄에 값 셋으로 ____ 자리를 채우세요.
.day {
margin: ____;
}
힌트
값이 셋일 때 첫째 · 둘째 · 셋째가 어느 방향인지, 빠진 방향은 어느 값을 따르는지 적어 보세요.
정답
받는 답: 0 12px 24px
<div class="day">
첫날 — 경포대
</div>
.day {
margin: 0 12px 24px;
}.day의margin-top0px.day의margin-right12px.day의margin-bottom24px.day의margin-left12px
- 값 셋은 위 · 좌우 · 아래입니다. 넷째(왼쪽)가 빠지면 맞은편 오른쪽 값을 따릅니다.
- 다르게 써도 되는 곳: 값 넷
0 12px 24px 12px도 같은 여백입니다.0대신0px도 같습니다. - 흔한 오답은
0 24px 12px입니다. 셋째 값을 왼쪽이나 오른쪽으로 본 것입니다 — 그러면 아래가 12px, 좌우가 24px이 됩니다.
다시 볼 레슨: 여백 짧게 적기
문제 8
레시피 노트 카드 제목의 아래 여백만 줄이려고 클래스 규칙을 먼저 쓰고, 모든 h2의 여백 규칙을 그 아래에 썼습니다. 카드 제목 '잡채'의 margin-bottom은 몇 px일까요? 숫자만 쓰세요.
<div class="recipe-card">
<h2 class="title">잡채</h2>
</div>
.recipe-card .title {
margin-bottom: 4px;
}
h2 {
margin-bottom: 16px;
}
힌트
두 규칙의 선택자마다 명시도를 세 칸으로 세어 보세요.
힌트 둘
차례는 명시도까지 같을 때만 봅니다.
정답
4입니다.
.title의margin-bottom4px
| 속성 | 선언 | 출처 | 명시도 | 차례 | 이긴 값 |
|---|---|---|---|---|---|
margin-bottom | .recipe-card .title · 4px | 우리 CSS | 0-2-0 | 1 | 4px |
h2 · 16px | 우리 CSS | 0-0-1 | 2 |
- 클래스 둘(0-2-0)이 태그 하나(0-0-1)보다 명시도가 높아, 뒤에 쓴
h2규칙에 지지 않습니다(브라우저 규칙 5). - 흔한 오답은 16입니다. 나중에 쓴 규칙이 늘 이긴다고 본 것입니다(뒤가 늘 이긴다는 생각).
문제 9
하고 싶은 일에 쓸 이름을 쓰세요.
- (가)
width에 적은 값이 테두리까지 넣은 너비가 되게 하는 선언(속성과 값) - (나) 상자의 모서리를 둥글게 하는 속성
- (다) 줄 안에서 글처럼 흐르면서 너비와 높이는 먹는
display값 - (라) 정한 높이를 넘친 글을 상자 안에서 굴려 볼 수 있게 하는
overflow값
힌트
(가)는 리셋 규칙 * 안에 늘 쓰는 한 줄입니다. (라)는 넘친 글을 잘라 감추는 값과 다릅니다.
정답
받는 답: (가) box-sizing: border-box · (나) border-radius · (다) inline-block · (라) auto
- 같은 답으로 치는 꼴: (라)
scroll도 상자 안에서 굴려 봅니다.scroll은 넘치지 않아도 스크롤 막대 자리를 늘 그려, 넘칠 때만 막대가 생기는auto를 받는 답으로 둡니다. - 틀리는 꼴 — (가)
box-sizing: content-box는 처음 값이라 내용 칸만 잽니다. (나)border-style은 테두리 종류입니다. (다)inline은 너비 · 높이를 쓰지 않고,block은 줄을 통째로 차지합니다. (라)hidden은 넘친 글을 잘라 감춰 끝까지 읽을 수 없습니다.
다시 볼 레슨: 너비와 box-sizing · 블록과 인라인 display · 둥근 모서리·그림자·넘치는 내용
문제 10
레시피 노트의 폴더입니다. 같은 잡채 그림을 두 곳에서 씁니다.
recipe-note/
index.html
css/
style.css
images/
japchae.svg
(가) index.html의 img가 이 그림을 보이게 src에 적을 주소를 쓰세요. (나) index.html이 link로 이어 읽는 css/style.css 안에서 같은 그림을 머리 칸 배경으로 깔려면 url()에 적을 주소를 쓰세요.
<img
src="____"
alt="잡채"
width="200"
height="150"
/>
.hero {
background-image:
url("____");
}
힌트
두 주소의 출발점을 폴더 나무에 하나씩 표시하고, 거기서 그림까지 가는 길을 적어 보세요.
힌트 둘
주소마다 그 주소를 적은 파일이 어느 폴더에 있는지 먼저 짚으세요. HTML의 주소는 HTML 파일의 폴더에서, CSS 안 url()은 CSS 파일의 폴더에서 출발합니다.
정답
받는 답: (가) images/japchae.svg · (나) ../images/japchae.svg
<!-- index.html -->
<img
src="images/japchae.svg"
…
/>
/* css/style.css */
.hero {
background-image: url(
"../images/japchae.svg"
);
}- (가)
img의src는index.html이 있는recipe-note/에서 출발해images/안으로 갑니다. - (나) 같은 그림이어도
url()은style.css가 있는css/에서 출발합니다.../로 한 단계 올라가recipe-note/에서images/로 들어갑니다(브라우저 규칙 1). - (나)에서 흔한 오답은 (가)와 같은
images/japchae.svg입니다.url()도 HTML 파일에서 출발한다고 본 것입니다(출발점이 늘 같다는 생각). 그러면 브라우저는css/images/japchae.svg를 찾아 배경이 비고, 오류도 뜨지 않습니다. - 이 문제의 결과는 정답 칸에 그리지 않습니다. 결과 화면은 CSS를 파일로 따로 잇지 않고 한 페이지 안에 넣어 그려서,
url()의 출발점이 실제 폴더와 달라지기 때문입니다. 컴퓨터에서 폴더를 만들어 확인해 보세요.
다시 볼 레슨: 배경 그림과 그러데이션 · 경로 읽기
문제 11
플로우 카페 머리 띠에 연하늘 바탕색을 깔고, 그 위에 로고 그림을 되풀이해 깔았습니다. 그런데 바탕이 하얗습니다. Computed 창에서 .brand의 background-color는 rgba(0, 0, 0, 0)(투명)이고, Styles 창에는 .brand 규칙이 경고 표시 없이 보입니다. 이 페이지는 CSS를 HTML 안 style 요소에 썼습니다. 고칠 줄을 골라 고쳐 보세요.
힌트
.brand 규칙의 선언을 위에서부터 읽으며 줄마다 무엇을 정하는지 적어 보세요.
힌트 둘
바탕색을 정하는 줄을 모두 찾아 보세요. 짧게 적기 줄도 셉니다. 짧게 적기 background는 적지 않은 칸(색 · 크기 · 자리 …)을 처음 값으로 되돌립니다. 그림만 바꾸는 풀어 적은 속성이 따로 있습니다.
위아래 화살표로 줄을 옮기고 Enter로 고릅니다.
여기서 고친 코드는 저장하지도 보내지도 않습니다. 새로 열면 처음 코드입니다.
정답
받는 답: 5번 줄의 background:를 background-image:로 고칩니다. 고친 style 요소 안 규칙을 떼어 그리면 이렇습니다.
<p class="brand">
플로우 카페
</p>
.brand {
height: 48px;
background-color: #d6ecff;
background-image:
url("images/logo.png");
}.brand의background-colorrgb(214, 236, 255).brand의 배경 그림 주소images/logo.png
찾는 차례 4번에서 찾습니다.
- 1번 — 로고 그림이 보이니 규칙도 그림 파일도 닿았습니다.
- 2번 — Elements 패널에
p.brand가 있습니다. - 3번 — Styles 창에
.brand규칙이 보입니다. 닿았습니다. - 4번 — 경고 표시가 없으니 다 알아들었습니다. 이겼나를 봅니다. 같은 규칙 아래 줄의 짧게 적기
background를 펼치면background-color가 들어 있습니다 — 적지 않은 색 칸을 처음 값인 투명으로 되돌려, 앞 줄의 연하늘을 이겼습니다(나중이 이김 — 브라우저 규칙 4 · 5).
다르게 고쳐도 되는 곳:
-
4번 줄
background-color줄을background두 줄 아래로 옮겨도 연하늘이 이깁니다 — 줄 둘을 고쳐야 해서 받는 답으로 두지 않았습니다. -
4번 줄을 지우고 5번 줄의 짧게 적기에 색을 함께 적어도(
background: #d6ecff뒤에url()) 같습니다. -
흔한 오답은
background-color줄에!important를 붙이는 것입니다. 바탕이 돌아와 위 상자도 이룸으로 보지만, 짧게 적기가 색을 되돌리는 줄은 그대로 남고 다음 구역 규칙이 이 색을 바꾸지 못합니다 — 증상만 덮은 것입니다. -
4번 줄의 색 값만 다른 꼴(
rgb(214 236 255))로 바꾸는 것도 흔합니다. 그 줄이 지는 것은 값 때문이 아니라 아래 줄 때문이라 그대로 투명입니다.
다시 볼 레슨: 배경 그림과 그러데이션 · 여백 짧게 적기
문제 12 (만들어 보기)
레시피 노트 카드의 CSS입니다. 상자 셈의 네 걸음으로 이 카드가 차지하는 너비를 구하도록 아래 표의 …를 채우세요.
<article class="recipe-card">
<h2>된장찌개</h2>
</article>
.recipe-card {
width: 230px;
padding: 14px;
border: 2px solid #d2d2d7;
margin: 10px;
}| 걸음 | 셈 | 값 |
|---|---|---|
| 1. 내용 칸 | … | … |
| 2. 안쪽 여백 더하기 | … | … |
| 3. 테두리 더하기 | … | … |
| 4. 바깥 여백은 따로 | … | … |
나와야 할 결과는 둘입니다.
- 위 카드가 차지하는 너비.
- 같은 카드에
box-sizing: border-box;를 더했을 때의 내용 칸 너비 — 같은 네 걸음을 거꾸로 셈합니다.
힌트
걸음마다 셈에 넣을 값을 CSS에서 찾아 적어 보세요. 둘째 결과는 네 걸음을 바깥에서 안으로 거꾸로 밟습니다.
힌트 둘
걸음마다 '왼쪽 · 오른쪽 두 쪽'을 셈에 넣습니다. box-sizing: border-box면 width가 곧 차지하는 너비입니다. 거기서 테두리와 안쪽 여백을 빼면 내용 칸이 남습니다.
정답
모범 답 — 첫째 결과입니다.
| 걸음 | 셈 | 값 |
|---|---|---|
| 1. 내용 칸 | width | 230 |
| 2. 안쪽 여백 더하기 | 230 + 14 × 2 | 258 |
| 3. 테두리 더하기 | 258 + 2 × 2 | 262 |
| 4. 바깥 여백은 따로 | 이웃과의 사이 10 — 넣지 않음 | — |
<article class="recipe-card">
<h2>된장찌개</h2>
</article>
.recipe-card {
width: 230px;
padding: 14px;
border: 2px solid #d2d2d7;
margin: 10px;
}.recipe-card의 너비262px.recipe-card의width230px
둘째 결과 — border-box면 차지하는 너비가 230이고, 거꾸로 빼면 230 − 2 × 2 − 14 × 2 = 198입니다.
<article class="recipe-card">
<h2>된장찌개</h2>
</article>
.recipe-card {
box-sizing: border-box;
width: 230px;
padding: 14px;
border: 2px solid #d2d2d7;
margin: 10px;
}.recipe-card의 너비230px.recipe-card의 내용 너비198px
위 두 결과가 맞고 표의 칸을 모두 채웠으면 맞습니다. 넷째 걸음까지 적어 둡니다 — 카드 둘 사이의 간격을 셈할 때 그 칸이 답을 냅니다.
흔한 잘못:
- 둘째 · 셋째 걸음에서 한 쪽만 더해 244 · 246을 쓴 것은 왼쪽 · 오른쪽 두 쪽을 놓친 것입니다.
- 넷째 걸음에서 바깥 여백까지 더해 282를 쓴 것은 바깥 여백을 상자의 너비로 본 것입니다. 바깥 여백은 상자 밖의 빈 자리입니다.
다시 볼 레슨: 너비와 box-sizing
문제 13 (만들어 보기)
레시피 노트의 아홉째 단계입니다(⟨컴퓨터⟩ · 30분 안팎 · 걸음마다 멈춰도 됩니다). 리셋과 본문 가운데 모으기, 레시피 카드의 여백 · 둥근 모서리 · 그림자, 폼 칸과 표의 상자를 정리합니다. 9단원 연습 문제의 만들어 보기를 마쳤다면 그 폴더에서 이어 갑니다.
이 단계 시작 파일 — 9단원 끝 상태
recipe-note 폴더에 세 파일을 받아 둡니다.
recipe-note 안에 images 폴더를 만들고 그림 여섯을 받아 둡니다. 앞 단계에서 받았으면 그대로 씁니다.
할 일 — 걸음 셋입니다. 이 단계는 style.css만 고칩니다. 여백 · 테두리 · 둥근 모서리는 모두 px로 씁니다.
걸음 1 — 리셋과 본문. 파일 맨 위(/* 기본 */ 구역 앞)에 /* 리셋 */ 구역을 두고 모든 요소에 box-sizing: border-box를 줍니다. 그다음 '기본' 구역에서 고칩니다.
| 고를 요소 | 바꿀 것 |
|---|---|
body | 바깥 여백 0 |
main | 가장 넓어도 960px · 좌우 가운데 · 안쪽 여백 위아래 24px 좌우 16px |
| 머리글 · 바닥글(선택자 목록) | 안쪽 여백 위아래 16px 좌우 24px — '머리글 · 내비' 구역에 |
걸음 2 — 레시피 카드. '레시피 목록' 구역에 씁니다. 배지는 두 페이지가 함께 쓰니 '기본' 구역에 둡니다.
| 고를 요소 | 바꿀 것 |
|---|---|
목록 .recipe-list | 바깥 여백 · 안쪽 여백 0 · 글머리 점 없음(list-style-type) |
카드 .recipe-card | 가장 넓어도 320px · 아래 바깥 여백 16px만 · 안쪽 여백 16px · 테두리 1px 실선 #d2d2d7 · 둥근 모서리 12px · 바탕 #ffffff · 그림자 0 2px 8px #d2d2d7 |
| 카드 안 그림 | 블록으로 놓고 아래 바깥 여백 12px |
카드 안 h2 · p | h2 바깥 여백 0 · p는 위 8px만 |
배지 .badge | 인라인 블록 · 안쪽 여백 위아래 2px 좌우 10px · 테두리 1px 실선 #d2d2d7 · 알약 모양(999px) · 바탕 #f5f5f7 · 글자 #005bb5 14px |
걸음 3 — 폼 · 표 · 단추.
| 고를 요소 | 바꿀 것 |
|---|---|
글자 칸 input[type="text"] · 한 줄 평 칸(선택자 목록) | 너비 100% · 안쪽 여백 8px · 테두리 1px 실선 #d2d2d7 · 둥근 모서리 6px · 글자 16px · 글꼴 물려받기 |
별점 칸 select | 너비만 빼고 위와 같이 |
폼 안 div | 아래 바깥 여백 12px |
공통 단추 button | 안쪽 여백 위아래 8px 좌우 16px · 테두리 없음 · 둥근 모서리 8px |
표 · 칸 th · td | 표는 칸 선을 한 줄로(border-collapse) · 칸은 안쪽 여백 위아래 6px 좌우 12px · 테두리 1px 실선 #d2d2d7 |
6단원에서 따로 쓴 input · textarea의 글자 크기 규칙은 걸음 3의 규칙에 합칩니다. 라디오까지 너비 100%가 되지 않게 글자 칸은 input[type="text"]로 고릅니다.
확인 목록:
- 넓은 창에서 본문이 가운데에 모이고, Computed 창의
mainmargin-left와margin-right가 같다(Computed 창 · 걸음 1). body의margin-top이 0px이다(Computed 창 · 걸음 1).- 카드는 테두리 · 둥근 모서리 · 그림자가 있는 흰 칸이고, 차지하는 너비가 320px이다(화면 · Computed 창 · 걸음 2).
- 카드와 카드 사이가 16px 띄어 있다 — 카드의 위아래 바깥 여백이 겹쳐도 16px이다(Computed 창 · 걸음 2).
- 배지는 양 끝이 반원인 알약 모양이다(화면 · 걸음 2).
- 글자 칸과 한 줄 평 칸이 폼 오른쪽 밖으로 삐져나오지 않는다 — 두 칸의 오른쪽 끝이 아래 '다시 만들어 볼 건가요?' 틀의 오른쪽 끝과 나란하다. 창 폭이 넓어도 좁아도 같다(화면 · 걸음 1 · 3).
- 영양 정보 표의 칸 사이 선이 한 줄로 그어져 있다(화면 · 걸음 3).
폰으로만 따라왔다면 이 물음 하나로 대신합니다. 걸음 1의 리셋을 빼면 너비 100%인 글자 칸은 어떻게 될까요?
- ① 폼 안에 꼭 맞는다.
- ② 폼 오른쪽 밖으로 조금 삐져나온다.
- ③ 폼 양쪽 밖으로 똑같이 삐져나온다.
힌트
걸음마다 그 걸음의 확인 목록을 봅니다. 걸음 2의 카드 너비는 상자 셈으로 먼저 어림하고 Computed 창에서 맞춰 봅니다.
정답
모범 답입니다. 바뀐 곳 가운데 몇 곳만 싣습니다 — 다 고친 style.css는 아래 받기 파일과 같습니다(index.html · kimchi.html은 9단원 끝 상태 그대로).
/* 리셋 */
* {
box-sizing: border-box;
}main {
max-width: 960px;
margin: 0 auto;
padding: 24px 16px;
}/* 레시피 목록 */
.recipe-list {
margin: 0;
padding: 0;
list-style-type: none;
}.recipe-card {
max-width: 320px;
margin: 0 0 16px;
padding: 16px;
border: 1px solid #d2d2d7;
border-radius: 12px;
background: #ffffff;
box-shadow:
0 2px 8px #d2d2d7;
}목록 카드 둘을 떼어 넓은 창(1280px)에서 그린 모습입니다. 받기 파일과 같은 선언만 골랐습니다.
<main>
<ul class="recipe-list">
<li class="recipe-card">
잡채
</li>
<li class="recipe-card">
미역국
</li>
</ul>
</main>
* {
box-sizing: border-box;
}
body {
margin: 0;
}
main {
max-width: 960px;
margin: 0 auto;
padding: 24px 16px;
}1280px.recipe-list {
margin: 0;
padding: 0;
list-style-type: none;
}
.recipe-card {
max-width: 320px;
margin: 0 0 16px;
padding: 16px;
border: 1px solid #d2d2d7;
border-radius: 12px;
box-shadow:
0 2px 8px #d2d2d7;
}1280pxmain의margin-left160px.recipe-card의 너비320px.recipe-card + .recipe-card의 위 틈16px.recipe-card의border-top-left-radius12px
첫 결과 화면은 앞 CSS만, 둘째 결과 화면은 이어 쓴 CSS까지 그린 것입니다. margin-left 160px은 폭 1280 틀의 값입니다. 내 창에서 잰 값은 창 폭과 스크롤 막대에 따라 달라도, margin-right와 같으면 맞습니다.
확인 목록을 다 채웠으면 맞습니다. 코드가 모범 답과 달라도 됩니다.
다르게 써도 되는 곳:
- 한 규칙 안 선언의 차례는 바꿔도 됩니다.
- 카드의
margin: 0 0 16px은margin: 0;다음 줄margin-bottom: 16px;처럼 풀어 적어도 같습니다. 차례를 거꾸로 쓰면 짧게 적기가 16px을 되돌립니다. - 바탕은
background-color로 적어도 같습니다.
흔한 잘못:
- 리셋을 빼면 글자 칸이 폼 밖으로 삐져나옵니다 — 너비 100%에 안쪽 여백과 테두리가 더해집니다(
width가 차지하는 너비라는 생각). - 카드에
max-width대신width: 320px을 주면, 360px보다 좁은 창에서 카드가 오른쪽으로 넘칩니다. - 그림자 색을 더 진한 회색으로 고르면, 16단원 다크 모드의 어두운 바탕에서 카드 둘레가 빛나는 테두리처럼 보입니다. 11단원에서 반투명한 검정으로 바꿉니다.
폰 물음의 답은 ②입니다. 리셋이 없으면 너비 100%는 내용 칸만 재어, 안쪽 여백과 테두리만큼 폼보다 넓어집니다. ①은 width가 차지하는 너비라고 본 것이고(width가 차지하는 너비라는 생각), ③은 상자가 가운데에서 양쪽으로 커진다고 본 것입니다. 상자는 왼쪽 끝 자리를 그대로 두고 오른쪽으로 커집니다.
다시 볼 레슨: 상자 네 겹 · 너비와 box-sizing · 가운데 모으기 · 여백 짧게 적기 · 둥근 모서리·그림자·넘치는 내용