본문으로 건너뛰기

단원 1~16 섞어 풀기

HTML·CSS 목차움직임과 다크 모드문제 14개

하루 지나 풀면 더 오래 남습니다. 16단원을 마친 다음 날 풀어 보세요. 1~16단원에서 14문제를 섞었고 — 반은 10~16단원, 반은 1~9단원입니다 — 어느 레슨의 문제인지는 정답을 펼쳐야 보입니다. 화면에 보일 모양이나 값, 고친 줄은 종이에 끝까지 쓴 뒤 정답을 펼치세요. 막히면 정답 앞의 힌트를 먼저 펼칩니다. 점수는 매기지 않습니다.

결과를 묻는 문제의 결과 화면과 잰 값은 정답을 펼치면 보입니다. 결과 화면은 늘 밝은 화면으로 그려지니, 어두운 화면에서의 값은 잰 값 칸으로 봅니다. 너비를 묻는 문제는 종이에 상자 셈을, 열 수를 묻는 문제는 열 수 셈을, 이긴 값을 묻는 문제는 손 점수판을 그려 풉니다. 컴퓨터가 있으면 문제의 HTML과 CSS를 파일로 저장해 브라우저로 열고, 개발자 도구 Computed 창에서 값을 맞춰 봅니다. 결과는 모두 크롬 기준입니다.

문제 1

플로우 카페 칠판의 네 칸입니다. 칸마다 메뉴 두 개 사이에서 줄을 바꿔 쳤습니다. 화면에서 두 줄로 보이는 칸을 모두 고르세요. 기호를 다 쓰세요.

<p>라테
녹차</p>
<pre>쿠키
머핀</pre>
<textarea>주스
우유</textarea>
<p>빙수<br>단팥</p>
  • ㉠ p 라테 · 녹차
  • ㉡ pre 쿠키 · 머핀
  • ㉢ textarea 주스 · 우유
  • ㉣ p 빙수 · 단팥(br 있음)
힌트

칸마다 친 줄바꿈이 브라우저가 그릴 때 어떻게 되는지 하나씩 적어 보세요.

힌트 둘

p 안의 줄바꿈은 빈칸 하나로 합쳐집니다. 친 그대로 두는 요소가 따로 있습니다.

정답

㉡ · ㉢ · ㉣입니다.

결과 화면
잰 값개발자 도구에서 본 값
  • p의 보이는 글라테 녹차
  • pre의 보이는 글쿠키 / 머핀
  • textarea의 값주스 / 우유
  • p:last-child의 보이는 글빙수 / 단팥

보이는 글의 ' / '는 줄이 바뀐 자리입니다.

  • ㉠ p 안에서 친 줄바꿈은 그릴 때 빈칸 하나가 되어 한 줄 '라테 녹차'입니다(브라우저 규칙 2).
  • ㉡ pre와 ㉢ textarea는 안의 줄바꿈과 빈칸을 친 그대로 둡니다.
  • ㉣ br는 줄을 바꾸라는 요소라 두 줄입니다.
  • ㉠도 골랐다면 친 대로 화면에 나온다고 본 것입니다(친 대로 나온다는 생각).
  • ㉣만 골랐다면 pre · textarea도 p처럼 합친다고 본 것입니다. 메뉴판 같은 글은 p 안에서 br나 목록으로 나눕니다.

다시 볼 레슨: 공백 규칙과 특수 문자 · 여러 줄 글과 고르는 칸

문제 2

여행 일정 페이지의 기차표 두 장입니다. 둘째 표에만 box-sizing: border-box⁠를 줬습니다. 아래 표를 채워 (가) 첫째 표가 차지하는 너비 (나) 둘째 표가 차지하는 너비 (다) 둘째 표의 내용 너비를 쓰세요. 숫자만 씁니다.

<div class="ticket">서울</div>
<div class="ticket b">부산</div>
.ticket {
  width: 160px;
  padding: 12px;
  border: 4px solid #d2d2d7;
  margin: 8px;
}

.b {
  box-sizing: border-box;
}
걸음첫째 표둘째 표
1. 내용 칸……
2. 안쪽 여백……
3. 테두리……
4. 바깥 여백은 따로……
힌트

두 표 모두 width: 160px에서 출발합니다. 표마다 걸음 칸에 넣을 값을 CSS에서 찾아 적어 보세요.

힌트 둘

표마다 그 160이 상자 네 겹 가운데 어디까지를 재는지 먼저 정하세요. border-box면 width가 테두리까지를 잽니다. 그때는 셈을 거꾸로 — 160에서 테두리와 안쪽 여백을 빼서 내용 칸을 구합니다.

정답

(가) 192 · (나) 160 · (다) 128

결과 화면
잰 값개발자 도구에서 본 값
  • .ticket의 너비192px
  • .b의 너비160px
  • .b의 내용 너비128px
걸음첫째 표둘째 표
1. 내용 칸width 160160 − 24 − 8 = 128
2. 안쪽 여백160 + 12 × 2 = 184128 + 24 = 152
3. 테두리184 + 4 × 2 = 192152 + 8 = 160
4. 바깥 여백은 따로8 — 넣지 않음8 — 넣지 않음
  • 첫째 표는 box-sizing 처음 값이라 width가 내용 칸만 잽니다. 그 바깥에 안쪽 여백과 테두리를 더해 192입니다(브라우저 규칙 6).
  • 둘째 표는 width가 테두리까지라 차지하는 너비가 160 그대로이고, 내용 칸이 그만큼 줄어 128입니다.
  • (가)를 160이라고 썼다면 width가 차지하는 너비라고 본 것입니다(width가 차지하는 너비라는 생각).
  • (나)를 192라고 썼다면 border-box를 놓친 것입니다. 208 · 176은 바깥 여백까지 더한 값입니다.

다시 볼 레슨: 너비와 box-sizing · 상자 네 겹

문제 3

레시피 노트의 요리 팁 칸입니다. 이 칸의 세 속성 padding-top · padding-left · color마다 손 점수판을 채워 이긴 값을 쓰세요. 짧게 적기 padding 한 줄은 풀어 적은 네 줄로 나눠 적습니다. CSS는 style.css 한 파일이고, 둘째 블록은 첫째 블록 바로 아래에 이어집니다.

<div>
  <p class="tip">약불로 3분</p>
</div>
body {
  color: #6e6e73;
}

div .tip {
  padding-top: 20px;
}
.tip {
  padding-left: 16px;
  padding: 8px;
}

p {
  color: #1d1d1f;
}
속성선언출처명시도차례이긴 값
padding-top……………
…………
padding-left……………
…………
color……………
힌트

속성마다 이 p에 닿는 선언을 모두 모읍니다. padding: 8px 한 줄은 네 방향 줄로 나눠 적고, 필요한 방향만 표에 옮깁니다.

힌트 둘

짧게 적기는 적지 않은 칸까지 값을 냅니다. 닿는 선언이 하나라도 있는 속성은 부모에게 물려받지 않습니다.

정답

받는 답: padding-top 20px · padding-left 8px · color #1d1d1f

속성선언출처명시도차례이긴 값
padding-topdiv .tip · 20px우리 CSS0-1-1220px
.tip · padding: 8px의 위 → 8px우리 CSS0-1-03
padding-left.tip · padding: 8px의 왼쪽 → 8px우리 CSS0-1-038px
.tip · 16px우리 CSS0-1-03
colorp · #1d1d1f우리 CSS0-0-14#1d1d1f

차례 칸은 규칙 차례입니다 — body 1 · div .tip 2 · .tip 3 · p 4. 한 규칙의 선언은 같은 번호라, padding-left의 두 줄처럼 번호까지 같으면 그 규칙 안에서 나중에 쓴 줄이 이깁니다. 줄은 명시도의 점수판처럼 이긴 선언부터 적었습니다 — 코드 차례로 적어도 칸의 값이 같으면 맞습니다.

첫 결과 화면은 첫째 블록만, 둘째는 둘째 블록까지 이어 그린 것입니다.

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

rgb(29, 29, 31)로 써도 같은 답입니다.

  • padding-top — 출처가 같아 명시도로 갑니다. div .tip(0-1-1)이 뒤에 쓴 .tip(0-1-0)을 이겨, 짧게 적기가 낸 위 8px은 집니다.
  • padding-left — 같은 규칙 안 두 줄이라 명시도까지 같고, 나중에 쓴 짧게 적기가 왼쪽 칸에도 8px을 내 16px을 이깁니다(브라우저 규칙 4 · 5).
  • color — p 규칙이 직접 닿아 body의 회색을 물려받지 않습니다. 명시도가 낮아도 물려받은 값보다 닿은 선언이 먼저입니다(브라우저 규칙 5).
  • padding-top을 8px로 썼다면 뒤에 쓴 규칙이 늘 이긴다고 본 것입니다(뒤가 늘 이긴다는 생각).
  • padding-left를 16px로 썼다면 짧게 적기가 앞에서 정한 칸은 건드리지 않는다고 본 것입니다(짧게 적기는 적은 칸만 바꾼다는 생각).
  • color를 #6e6e73으로 썼다면 부모 값이 늘 내려온다고 본 것입니다.

반만 쓴 표는 안 쓴 것과 같습니다 — 세 줄이 저마다 다른 칸에서 갈렸습니다.

다시 볼 레슨: 명시도 · 나중에 쓴 규칙 · 여백 짧게 적기 · 물려받기

문제 4

플로우 카페 메뉴판의 한 줄입니다. 바깥 묶음에 display: flex를 줬습니다. 화면에 어떻게 보일까요? 보기 셋 가운데 고르세요.

<div class="menu">
  <div>
    <div>라테</div>
    <div>녹차</div>
  </div>
  <div>쿠키</div>
</div>
.menu {
  display: flex;
}
힌트

나무를 그려 .menu 안의 div 넷이 저마다 무엇 안에 드는지 적어 보세요.

힌트 둘

.menu의 직계 자식이 몇 개인지 세어 보세요. display: flex는 부모가 정하고 직계 자식에게만 닿습니다. 손자는 제 부모의 놓는 방식을 따릅니다.

정답

③ — 왼쪽에 라테 · 녹차가 위아래, 오른쪽에 쿠키입니다.

결과 화면
  • .menu의 직계 자식은 둘 — 라테 · 녹차를 담은 div와 쿠키 div입니다. 이 둘이 flex 항목이 되어 한 줄에 나란히 놓입니다(브라우저 규칙 7).
  • 라테와 녹차는 항목 안의 블록이라 일반 흐름대로 위아래로 쌓입니다.
  • ①은 flex가 후손까지 닿는다고 본 것입니다(flex가 후손까지라는 생각). 셋을 한 줄에 두려면 안쪽 div에도 display: flex를 주거나 묶음을 풀어야 합니다.
  • ②는 flex가 아무 일도 하지 않는다고 — 나란히 놓일 요소 자신에게 줘야 한다고 — 본 것입니다.

다시 볼 레슨: flex는 부모에

문제 5

사진 동아리 공지의 띠입니다. '모집' 배지를 띠의 가로 가운데, 세로 아래 끝에 놓으려 합니다. ____ 두 자리에 들어갈 속성 이름을 쓰세요.

.band {
  display: flex;
  height: 80px;
  ____: center;
  ____: flex-end;
}

.badge {
  width: 80px;
  height: 24px;
}

나와야 할 결과는 둘입니다. 띠는 <div class="band"> 안에 <span class="badge">모집</span> 하나를 담았고, 화면 폭 320에서 띠 너비는 304px입니다.

  • 배지의 왼쪽 자리가 8 + (304 − 80) ÷ 2 = 120px이다(가로 가운데).
  • 배지의 위 자리가 8 + 80 − 24 = 64px이다(세로 아래 끝).
힌트

띠의 주축이 가로인지 세로인지 먼저 정하고, 주축 정렬과 교차축 정렬의 이름을 떠올리세요.

정답

받는 답: 첫째 justify-content · 둘째 align-items

<div class="band">
  <span class="badge">
    모집
  </span>
</div>
.band {
  display: flex;
  height: 80px;
  justify-content: center;
  align-items: flex-end;
}

.badge {
  width: 80px;
  height: 24px;
}
결과 화면폭 320px
잰 값개발자 도구에서 본 값
  • .badge의 왼쪽 자리120px
  • .badge의 위 자리64px
  • flex-direction 처음 값이 row라 주축은 가로입니다. 주축 정렬 justify-content가 가로 가운데를, 교차축 정렬 align-items가 세로 아래 끝을 맡습니다(브라우저 규칙 7).
  • 둘을 바꿔 쓰면 배지가 왼쪽 자리 232 · 위 자리 36 — 오른쪽 끝, 세로 가운데에 놓입니다.
  • span도 flex 항목이 되면 width · height를 씁니다. 그래서 배지 크기가 글자와 상관없이 80 × 24입니다.

다시 볼 레슨: 주축 정렬 · 교차축 정렬 · 자주 쓰는 세 모양

문제 6

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

(가)

<p>1일 해변
<p>2일 시장
<p>1일 해변</p>
<p>2일 시장</p>

(나)

<ul>
  <li>버스
  <li>기차
</ul>
<ul>
  <li>버스</li>
</ul>
<p>기차</p>

(다)

<p>꼭 <strong>선크림</p>
<p>챙기기</strong></p>
<p>꼭 <strong>선크림</strong></p>
<p><strong>챙기기</strong></p>
힌트

짝마다 앞 코드의 여는 태그와 닫는 태그를 하나씩 짝지어 표시해 보세요.

힌트 둘

닫는 태그가 없거나 엇갈린 곳에서 브라우저가 어디서 요소를 닫을지 표시해 보세요. 브라우저는 틀린 HTML에서 멈추지 않고, 정해진 규칙대로 고쳐 지어 끝까지 그립니다.

정답

(가) 같다 · (나) 다르다 — 앞 코드는 '기차'도 점이 붙은 목록 줄이다 · (다) 같다

결과 화면(가) 첫째 코드
결과 화면(가) 둘째 코드
결과 화면(나) 첫째 코드
결과 화면(나) 둘째 코드
결과 화면(다) 첫째 코드
결과 화면(다) 둘째 코드
  • (가) 새 p가 열리면 열려 있던 p는 저절로 닫힙니다. 두 문단으로 고쳐 지어 뒤 코드와 같습니다(브라우저 규칙 2).
  • (나) 새 li가 열리면 앞 li가 닫혀, 앞 코드는 두 줄 목록입니다. 뒤 코드의 '기차'는 목록 밖 문단이라 점이 없고 들여 있지 않습니다.
  • (다) 엇갈린 태그를 브라우저가 고쳐 지어, 둘째 문단의 '챙기기'도 strong 안에 다시 넣습니다. 두 낱말 모두 굵게, 두 문단으로 그려져 뒤 코드와 같습니다.
  • (가) · (다)를 다르다고 했다면 틀린 곳에서 그리기가 멈추거나 그 뒤가 다 깨진다고 본 것입니다(틀리면 멈춘다는 생각). 화면이 같아도 검사기는 (다)에 오류를 냅니다 — 고쳐 짓기에 기대지 말고 바르게 닫습니다.

다시 볼 레슨: 요소 안의 요소 · 문단과 강조

문제 7

여행 사진첩 목록입니다. 화면 폭 360(휴대전화)과 1280(넓은 화면)에서 열이 각각 몇 개일까요? 아래 열 수 셈 표를 채워 숫자로 쓰세요.

<ul class="photos">
  <li>바다</li>
  <li>시장</li>
  <li>절</li>
  <li>숲</li>
  <li>다리</li>
  <li>섬</li>
</ul>
.photos {
  display: grid;
  grid-template-columns: repeat(
    auto-fill,
    minmax(170px, 1fr)
  );
  gap: 16px;
  max-width: 720px;
  margin: 0 auto;
  padding: 0;
  list-style-type: none;
}
걸음폭 360폭 1280
1. 목록이 놓인 폭……
2. 열 n개에 드는 폭(170 × n + 16 × (n − 1))……
3. 1에 드는 가장 큰 n……
힌트

먼저 두 폭에서 목록 상자의 너비를 구하세요 — body의 바깥 여백 8px과 max-width를 봅니다.

힌트 둘

열 사이 간격은 열 수보다 하나 적습니다. 간격까지 더한 폭이 목록 너비를 넘지 않는 가장 큰 열 수가 답입니다.

정답

폭 360에서 1 · 폭 1280에서 3

결과 화면폭 360px
잰 값개발자 도구에서 본 값
  • .photos의 열 수1
  • .photos의 너비344px
걸음폭 360폭 1280
1. 목록이 놓인 폭360 − 16 = 3441280 − 16 = 1264 → max-width 720
2. 열 n개에 드는 폭1개 170 · 2개 3563개 542 · 4개 728
3. 1에 드는 가장 큰 n1(2개 356은 344를 넘음)3(4개 728은 720을 넘음)
<ul class="photos">
  <li>바다</li>
  <li>시장</li>
  <li>절</li>
  <li>숲</li>
  <li>다리</li>
  <li>섬</li>
</ul>
.photos {
  display: grid;
  grid-template-columns:
    repeat(
      auto-fill,
      minmax(170px, 1fr)
    );
  gap: 16px;
  max-width: 720px;
  margin: 0 auto;
  padding: 0;
  list-style-type: none;
}
결과 화면폭 1280px
잰 값개발자 도구에서 본 값
  • .photos의 열 수3
  • .photos의 너비720px
  • 남는 폭은 1fr이 열마다 나눠 가져, 폭 1280의 세 열은 (720 − 32) ÷ 3 ≈ 229px씩입니다.
  • 2 · 4라고 썼다면 열 사이 간격을 빼고 센 것입니다(344 ÷ 170 · 720 ÷ 170). 간격도 폭을 차지합니다.
  • 폭 1280을 6이라고 썼다면 창 폭으로 센 것입니다. 열 수는 목록이 놓인 상자의 폭(여기서는 max-width 720)으로 셉니다.

다시 볼 레슨: 들어가는 만큼 열 만들기 · 가운데 모으기

문제 8

사진 동아리 소식 상자에 빨간 글자와 빨간 테두리를 줬습니다. 안의 문단 p의 (가) 글자색 (나) Computed 창의 border-top-style은 무엇일까요? (가)는 코드에 적힌 꼴로 씁니다.

<div class="news">
  <p>사진 걷기는 토요일</p>
</div>
.news {
  color: #d70015;
  border: 2px solid #d70015;
}
힌트

p에 직접 닿는 선언이 있는지 먼저 보세요.

힌트 둘

닿는 선언이 없을 때 부모 값을 받는 속성과 처음 값으로 가는 속성이 따로 있습니다. 두 속성이 각각 어느 쪽인지 따져 보세요.

정답

(가) #d70015 · (나) none

결과 화면
잰 값개발자 도구에서 본 값
  • p의 글자색rgb(215, 0, 21)
  • p의 border-top-stylenone
  • 글자색은 물려받는 속성이라, 닿는 선언이 없는 p가 부모 .news의 빨강을 받습니다(브라우저 규칙 5).
  • 테두리는 물려받지 않는 속성이라 p는 처음 값 none — 테두리가 없습니다. 빨간 테두리는 바깥 상자 하나에만 그려집니다.
  • (나)를 solid라고 썼다면 부모의 속성을 다 물려받는다고 본 것입니다(다 물려받는다는 생각). 그랬다면 문단마다 테두리가 겹쳐 그려졌을 것입니다.
  • rgb(215, 0, 21) · rgb(215 0 21)도 같은 답입니다.

다시 볼 레슨: 물려받기 · 상자 네 겹

문제 9

사진 동아리 공지의 '여름 행사' 칸입니다. '오늘만' 꼬리표를 칸의 오른쪽 위 모서리에 붙였습니다. 꼬리표의 (가) 위 자리 (나) 오른쪽 끝은 각각 페이지 위 · 왼쪽에서 몇 px일까요? 숫자만 쓰세요.

<section class="summer">
  <div class="spot">
    물놀이 사진 찍기
    <span class="tag">
      오늘만
    </span>
  </div>
</section>
.summer {
  position: relative;
  width: 240px;
  padding: 20px;
}

.tag {
  position: absolute;
  top: 0;
  right: 0;
}
힌트

먼저 꼬리표의 기준 상자를 정하고, 그 상자의 왼쪽 위 모서리와 너비를 상자 셈으로 구해 보세요. body의 바깥 여백은 8px입니다.

힌트 둘

기준 상자는 나무를 따라 바깥으로 찾은 첫 position 조상입니다. top · right는 기준 상자의 안쪽 여백 바깥 가장자리에서 잽니다.

정답

(가) 8 · (나) 288

결과 화면
잰 값개발자 도구에서 본 값
  • .tag의 위 자리8px
  • .tag의 오른쪽 끝288px
걸음셈값
기준 상자.tag → .spot(position 없음) → .summer(relative).summer
기준 상자 위 가장자리body의 바깥 여백8
기준 상자 오른쪽 가장자리8 + 20 + 240 + 20(안쪽 여백까지 — 테두리는 없음)288
  • 꼬리표는 바로 위 부모 .spot이 아니라 position을 준 .summer를 기준으로 놓입니다(브라우저 규칙 8). top: 0 · right: 0은 그 상자의 안쪽 여백 바깥 가장자리(위 8 · 오른쪽 288)에 붙습니다.
  • 28 · 268이라고 썼다면 부모 .spot을 기준으로 본 것입니다(부모 기준이라는 생각).
  • (나)를 248이라고 썼다면 width 240이 칸이 차지하는 너비라고 본 것입니다(width가 차지하는 너비라는 생각). 안쪽 여백 20씩이 바깥에 더해집니다.

다시 볼 레슨: 기준 상자와 absolute · 너비와 box-sizing

문제 10

여행 일정 사이트 폴더입니다. 첫 페이지 index.html이 link로 css/trip.css를 읽습니다. 이 페이지를 열었을 때 브라우저가 받지 못해 비는 그림을 모두 고르세요. 기호를 다 쓰세요.

trip/
  index.html
  css/
    trip.css
  images/
    sea.svg
    bus.svg
    logo.svg
    wave.svg
<!-- index.html -->
…
<img src="images/sea.svg" …>
<img src="../images/bus.svg" …>
/* css/trip.css */
.logo {
  background-image:
    url("../images/logo.svg");
}

.band {
  background-image:
    url("images/wave.svg");
}
  • ㉠ 바다 사진(img — images/sea.svg)
  • ㉡ 버스 사진(img — ../images/bus.svg)
  • ㉢ 로고 배경(url() — ../images/logo.svg)
  • ㉣ 물결 띠 배경(url() — images/wave.svg)
힌트

네 주소마다 출발점을 폴더 나무에 표시하고, 거기서 그림까지 한 칸씩 따라가 보세요.

힌트 둘

index.html과 trip.css가 저마다 어느 폴더에 있는지 먼저 짚으세요. HTML의 주소는 HTML 파일의 폴더에서, CSS 안 url()은 CSS 파일의 폴더에서 출발합니다. trip/ 위로 올라가면 이 폴더 밖입니다.

정답

㉡ · ㉣입니다.

그림출발 폴더따라간 곳받나
㉠trip/trip/images/sea.svg받음
㉡trip/../ → trip/ 위 — 폴더 밖못 받음
㉢trip/css/../ → trip/ → images/logo.svg받음
㉣trip/css/trip/css/images/wave.svg — 없는 폴더못 받음
  • img의 src는 index.html이 있는 trip/에서, url()은 trip.css가 있는 css/에서 출발합니다(브라우저 규칙 1). 같은 images/ 폴더의 그림이어도 적는 주소가 다릅니다.
  • ㉡ · ㉢을 골랐다면 url()도 HTML 파일에서 출발한다고 본 것입니다(출발점이 늘 같다는 생각). 그렇게 보면 ㉢은 폴더 밖, ㉣은 trip/images/라 거꾸로 셉니다.
  • 그림을 받지 못해도 오류는 뜨지 않습니다. img는 깨진 그림 표시와 alt 글이, 배경은 빈 바탕이 남습니다.
  • 이 문제의 결과는 정답 칸에 그리지 않습니다. 결과 화면은 CSS를 파일로 따로 잇지 않고 한 페이지 안에 넣어 그려 url()의 출발점이 실제 폴더와 달라집니다. 컴퓨터에서 폴더를 만들어 확인해 보세요.

다시 볼 레슨: 경로 읽기 · 배경 그림과 그러데이션

문제 11

플로우 카페 '오늘의 메뉴' 목록입니다. 모바일 먼저로, 좁은 화면은 한 열이고 넓어지면 두 열로 바꿨습니다. 화면 폭 639와 640에서 열은 각각 몇 개일까요? 숫자만 쓰세요.

<ul class="specials">
  <li>아이스티</li>
  <li>와플</li>
  <li>스콘</li>
</ul>
.specials {
  display: grid;
}

@media (min-width: 640px) {
  .specials {
    grid-template-columns:
      repeat(2, 1fr);
  }
}
힌트

두 폭마다 조건 min-width: 640px이 맞는지 먼저 적어 보세요.

힌트 둘

min-width: 640px은 '640px 이상'입니다. 조건이 맞지 않는 폭에서는 블록 안 규칙이 아예 닿지 않습니다.

정답

폭 639에서 1 · 폭 640에서 2

결과 화면폭 639px
잰 값개발자 도구에서 본 값
  • .specials의 열 수1
<ul class="specials">
  <li>아이스티</li>
  <li>와플</li>
  <li>스콘</li>
</ul>
.specials {
  display: grid;
}

@media (min-width: 640px) {
  .specials {
    grid-template-columns:
      repeat(2, 1fr);
  }
}
결과 화면폭 640px
잰 값개발자 도구에서 본 값
  • .specials의 열 수2
  • 640은 '640 이상'에 듭니다. 조건이 맞아 두 열 규칙이 닿고, 셋째 메뉴는 둘째 줄로 갑니다(브라우저 규칙 4).
  • 639에서는 조건이 맞지 않아 블록이 닿지 않고, 열을 정하지 않은 격자는 한 열입니다.
  • 1 · 1이라고 썼다면 640을 빼고 641부터라고 본 것입니다(경계를 빼는 생각).
  • 2 · 2라고 썼다면 조건 블록 안 규칙이 늘 든다고 본 것입니다.

다시 볼 레슨: 모바일 먼저와 미디어 쿼리 · 열 만들기

문제 12

레시피 목록의 두 카드입니다. 떡볶이 카드만 노란 면으로 칠하려고 그 카드에 --surface를 다시 뒀습니다. 어두운 화면으로 설정한 브라우저에서 두 카드는 어떻게 보일까요? 어두운 화면은 결과 화면이 그리지 않아 글 보기에서 고릅니다.

<div class="card">잡채</div>
<div class="card spicy">
  떡볶이
</div>
:root {
  --surface: #ffffff;
}

.spicy {
  --surface: #fff3c4;
}

.card {
  background: var(--surface);
}
@media (
  prefers-color-scheme: dark
) {
  :root {
    --surface: #1d2633;
  }
}
  • ① 두 카드 모두 어두운 남색이다
  • ② 두 카드 모두 밝은 채다
  • ③ 잡채 카드는 어두운 남색이고, 떡볶이 카드는 노란 채다
힌트

--surface를 두는 규칙마다 그 규칙이 고르는 요소를 나무에 표시해 보세요.

힌트 둘

카드마다 자기 요소와 조상 가운데 --surface를 둔 요소를 찾아보세요. 변수도 물려받는 값이라, 꺼내 쓰는 요소에서 가장 가까운 조상의 값을 씁니다. 조건 블록은 :root의 값만 바꿨습니다.

정답

③입니다. 결과 화면은 밝은 화면으로 그려집니다 — 첫째는 앞 CSS만, 둘째는 조건 블록까지 그린 것이고, 아래 잰 값이 어두운 화면에서 잰 값입니다.

결과 화면
결과 화면
잰 값개발자 도구에서 본 값
  • .card의 background-colorrgb(29, 38, 51)
  • .spicy의 background-colorrgb(255, 243, 196)
  • 잡채 카드는 제게도 부모에게도 --surface가 없어 :root의 값을 꺼냅니다. 어두운 화면에서는 조건 블록의 #1d2633입니다(브라우저 규칙 5).
  • 떡볶이 카드는 자기 요소에 둔 #fff3c4를 먼저 꺼내, :root가 바뀌어도 노란 채입니다. 어두운 화면에서도 노랑이 맞다면 그대로 두고, 아니라면 조건 블록에 .spicy의 어두운 값도 둡니다.
  • ①은 :root의 값만 바꾸면 꺼내 쓰는 곳이 모두 바뀐다고 본 것입니다. 가운데에서 다시 둔 변수가 있으면 그 아래는 그 값을 씁니다.
  • ②는 var()가 처음에 꺼낸 값을 한 번 베껴 둔다고 본 것입니다.

다시 볼 레슨: CSS 변수 · 변수만 바꾸는 다크 모드

문제 13

하고 싶은 일마다 쓸 이름을 떠올려 쓰세요.

  • (가) 글의 뜻으로 '이 부분이 중요하다'를 나타내는 태그
  • (나) 떼어 내 다른 곳에 옮겨도 혼자 뜻이 통하는 내용 묶음(레시피 한 편, 후기 한 편)을 감싸는 태그
  • (다) 문서 맨 위 요소의 글자 크기를 1로 삼는 길이 단위
  • (라) flex 부모에서 교차축의 정렬을 정하는 속성
  • (마) 원래 자리를 지키면서 안의 absolute 상자가 기준으로 삼게 하려고 부모에 주는 position 값
힌트

다섯 모두 헷갈리는 짝이 있는 이름입니다 — 짝을 함께 떠올리고, 설명의 어느 말이 둘을 가르는지 견줘 보세요.

힌트 둘

(가) · (나)는 모양이 아니라 뜻을 담는 태그입니다.

정답

받는 답: (가) strong · (나) article · (다) rem · (라) align-items · (마) relative

  • (가) b는 뜻 없이 눈에 띄게 할 때 씁니다. 굵게 보이는 것은 같아도 중요함을 읽는 프로그램에 전하는 쪽은 strong입니다(태그가 모양이라는 생각).
  • (나) section은 제목이 붙는 큰 갈래 하나라 떼어 내면 뜻이 끊길 수 있습니다. 혼자 서는 묶음은 article입니다.
  • (다) font-size의 em은 부모의 글자 크기가 1이라 겹치면 커집니다. 문서 맨 위 요소(html)가 기준인 쪽이 rem입니다.
  • (라) justify-content는 주축을 맡습니다. 교차축은 align-items입니다.
  • (마) absolute는 흐름에서 빠져 원래 자리를 남기지 않습니다. 자리를 지키며 기준 상자가 되는 값은 relative입니다.

다시 볼 레슨: 문단과 강조 · article과 section 가르기 · 글자 크기는 rem · 교차축 정렬 · 기준 상자와 absolute

문제 14

플로우 카페 메뉴판의 메뉴 줄을 flex로 나란히 놓고 사이를 16px 띄웠습니다. 그런데 메뉴 이름이 다닥다닥 붙어 있습니다. 개발자 도구에서 .menu를 골라 보니 Styles 창에 규칙이 보이고, 한 선언에 경고 표시(⚠)와 취소선이 있습니다. 이 페이지는 CSS를 HTML 안 style 요소에 썼습니다. 고칠 줄을 골라 고쳐 보세요.

힌트

찾는 차례대로 1번부터 지워 가세요. 메뉴가 한 줄로 나란한지부터 봅니다.

힌트 둘

경고 표시는 브라우저가 그 선언을 알아듣지 못해 버렸다는 뜻입니다. 길이 값에 무엇이 빠졌는지 보세요.

결과 화면일부러 틀린 코드

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

정답

받는 답: 4번 줄을 gap: 16px;로 고칩니다 — 0이 아닌 길이에는 단위를 붙입니다.

<div class="menu">
  <div>라테</div>
  <div>녹차</div>
</div>
.menu {
  display: flex;
  gap: 16px;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .menu의 column-gap16px
  • .menu의 displayflex

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

  • 1번 — 메뉴가 한 줄로 나란하니 규칙은 닿았습니다.

  • 2번 — Elements 패널에 div.menu 안 div 둘이 있습니다.

  • 3번 — Styles 창에 .menu 규칙이 보입니다.

  • 4번 — gap: 16;에 경고 표시와 취소선이 있습니다. 단위 없는 16은 길이로 알아듣지 못하는 값이라 그 선언만 버렸습니다. 같은 규칙의 display: flex는 그대로 먹어 메뉴는 나란합니다(브라우저 규칙 4).

  • 흔한 오답은 gap: 16 !important;처럼 무게를 더하는 것입니다. 알아듣지 못하는 값은 여전히 버려집니다.

  • 규칙 전체를 다시 쓰거나 다른 이름으로 옮기는 것도 흔합니다. 규칙 전체가 아니라 한 선언만 버려졌다는 것을 Styles 창이 보여 줍니다(CSS도 멈춘다는 생각).

다시 볼 레슨: 규칙의 모양 · gap과 flex: 1

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

HTML·CSS 목차로