본문으로 건너뛰기

칸 여러 개 차지하기

HTML·CSS 목차격자로 배치: grid레슨 74 / 93

목차

grid-column: span 2는 그 항목이 열 둘과 그 사이 간격을 함께 차지하게 하는 선언입니다. 부모가 그은 열 경계는 그대로 두고 커질 항목에만 쓰며, 나머지 항목은 HTML 차례대로 다음 빈 자리로 밀립니다.

레시피 목록에서 오늘의 추천 카드만 두 칸 넓게 보이고 싶을 때가 있습니다. 격자를 새로 짜지 않고 그 카드가 옆 칸까지 차지하게 하면 됩니다. 다만 넓어진 카드 때문에 뒤 카드들의 자리가 바뀌고, 열이 하나뿐인 좁은 격자에서는 보이지 않는 열이 생겨 칸이 어긋납니다. 이 레슨은 칸을 차지하는 셈과 뒤 항목이 놓이는 차례를 봅니다.

그림 준비 중

1커질 항목에 span 2

<div class="grid">
  <div class="wide">1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>
.grid {
  display: grid;
  grid-template-columns:
    repeat(3, 1fr);
  gap: 16px;
  width: 300px;
}

.grid div {
  background-color: #d2d2d7;
}

.wide {
  grid-column: span 2;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .wide의 너비194.66px
  • .grid div:nth-child(3)의 너비89.33px
  • .grid의 줄 수3
  • .grid div:nth-child(6)의 왼쪽 자리8px

grid-column은 항목이 차지할 열을 정하는 CSS 속성이고, span 2는 '열 둘에 걸쳐'라는 뜻입니다. 이 선언은 부모가 아니라 커질 항목에 씁니다. 놓는 방식은 부모가 정하고, 자식은 그 안에서 차지할 칸(제 몫)만 정합니다(브라우저 규칙 7).

두 열을 차지한 너비에는 그 사이 간격도 듭니다. 열 하나가 89.33px이니 89.33 × 2 + 16, 약 194.7px입니다.

2나머지는 HTML 차례대로 다음 자리로

1절의 결과 화면에서 상자 여섯의 자리를 봅니다.

줄놓인 상자
첫째 줄1번(첫째 · 둘째 열) · 2번(셋째 열)
둘째 줄3번 · 4번 · 5번
셋째 줄6번(첫째 열)

잰 값의 줄 수 3 · 6번의 왼쪽 자리 8px(첫째 열)이 이 표입니다. 상자는 여섯 그대로인데, 1번이 한 칸을 더 쓰면서 6번이 셋째 줄로 밀렸습니다. 격자는 HTML 차례대로 다음 빈 자리를 채웁니다 — 상자를 합치거나 내용을 옮기지 않습니다.

3열이 하나뿐이면 보이지 않는 열이 생긴다

앞 레슨의 카드 격자는 폭이 좁으면 한 열이 됩니다. 그 격자에 span 2를 남겨 두었습니다.

<div class="grid">
  <div class="wide">1</div>
  <div>2</div>
</div>
.grid {
  display: grid;
  grid-template-columns: repeat(
    auto-fill,
    minmax(260px, 1fr)
  );
  gap: 16px;
  width: 300px;
}

.wide {
  grid-column: span 2;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .grid의 grid-template-columns284px 0px
  • .wide의 너비300px
  • .grid div:nth-child(2)의 너비284px
  • .grid의 열 수1

열은 하나뿐인데 1번이 둘을 달라고 해, 브라우저가 보이지 않는 둘째 열(0px)과 간격 16px을 더 만들었습니다. 1번은 300px, 2번은 16px 좁은 284px이라 오른쪽 끝이 어긋납니다. 잰 값 '열 수'는 보이는 상자가 놓인 열만 세어 1입니다. 숨은 열은 Computed 창의 grid-template-columns⁠에 284px 0px로 보입니다. 상자가 더 있으면 그 둘째 열에도 놓여, 아주 좁은 칸에 글이 눌립니다.

좁은 화면에서는 span 2를 풀어야 합니다 — 화면 폭에 따라 규칙을 바꾸는 법은 15단원 모바일 먼저와 미디어 쿼리에서 봅니다.

예제

오늘의 추천 떡볶이 카드를 두 칸으로 넓힙니다. 결과 화면을 펴기 전에, 잡채와 미역국 카드가 몇째 줄 몇째 열에 놓일지 적어 보세요.

<ul class="recipe-list">
  <li>김치볶음밥</li>
  <li>계란말이</li>
  <li>된장찌개</li>
  <li class="best">떡볶이</li>
  <li>잡채</li>
  <li>미역국</li>
</ul>
.recipe-list {
  display: grid;
  grid-template-columns:
    repeat(3, 1fr);
  gap: 16px;
  width: 272px;
  padding: 0;
  list-style: none;
}

.best {
  grid-column: span 2;
}
결과 화면 보기
결과 화면
잰 값개발자 도구에서 본 값
  • .recipe-list li의 너비80px
  • .best의 너비176px
  • .recipe-list li:nth-child(5)의 왼쪽 자리200px
  • .recipe-list li:nth-child(6)의 왼쪽 자리8px
  • .recipe-list의 줄 수3

첫 줄은 김치볶음밥 · 계란말이 · 된장찌개 세 장입니다. 떡볶이가 둘째 줄 첫째 · 둘째 열(80 × 2 + 16 = 176px)을 차지하고, 잡채는 그 옆 셋째 열(왼쪽 200px)에 놓입니다. 미역국은 셋째 줄 첫째 열입니다.

자주 틀리는 곳

틀린 생각: span 2를 부모에 쓰면 항목이 두 칸씩 차지한다.

열을 정하는 곳이 부모이니, 칸 수도 부모에 쓸 것 같습니다.

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
</div>
.grid {
  display: grid;
  grid-template-columns:
    repeat(3, 1fr);
  grid-column: span 2;
  gap: 16px;
  width: 300px;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .grid의 grid-column-startspan 2
  • .grid div의 너비89.33px

선언은 닿았지만 상자는 89.33px 그대로입니다. grid-column은 그 요소가 부모 격자 안에서 차지할 칸이라, .grid의 부모(body)가 격자가 아니면 쓰이지 않습니다.

맞는 규칙: 차지할 칸은 커질 항목 자신에 씁니다.

틀린 생각: 두 칸을 차지하면 너비는 열 둘의 합이다.

열 100px 둘을 차지하면 200px일 것 같습니다.

<div class="grid">
  <div class="wide">1</div>
  <div>2</div>
  <div>3</div>
</div>
.grid {
  display: grid;
  grid-template-columns:
    100px 100px;
  gap: 20px;
}

.wide {
  grid-column: span 2;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .wide의 너비220px

두 열 사이의 간격 20px까지 차지해 220px입니다.

맞는 규칙: 걸친 열의 너비에 그 사이 간격을 더합니다.

틀린 생각: 빈 자리가 생기면 다음 항목이 메운다.

셋째 상자가 두 칸을 차지하면 첫 줄 셋째 칸이 비는데, 넷째 상자가 그 칸에 들어갈 것 같습니다.

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div class="wide">3</div>
  <div>4</div>
</div>
.grid {
  display: grid;
  grid-template-columns:
    repeat(3, 1fr);
  gap: 16px;
  width: 300px;
}

.grid div {
  height: 40px;
}

.wide {
  grid-column: span 2;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .grid div:nth-child(3)의 위 자리64px
  • .grid div:nth-child(4)의 위 자리64px

셋째 상자는 첫 줄 셋째 칸(한 칸)에 들지 않아 둘째 줄로 갔고, 넷째 상자는 그 뒤 자리(둘째 줄 셋째 열)로 갔습니다. 첫 줄 셋째 칸은 빈 채 남습니다.

맞는 규칙: 격자는 HTML 차례대로 앞으로만 채웁니다. 앞의 빈 자리를 뒤 항목으로 메우려면 부모에 grid-auto-flow: dense⁠를 씁니다 — 그러면 화면 차례가 HTML 차례와 달라지고, Tab 차례는 HTML 차례 그대로입니다.

확인 문제

1. 예제의 span 2를 span 3으로 바꿨습니다. 떡볶이 카드의 너비는 몇 px일까요?

힌트

1절에서 span 2의 너비를 셈한 식을 찾아, 같은 꼴로 span 3을 셈해 보세요.

힌트 둘

걸친 너비에는 걸친 열 사이의 간격도 듭니다. 떡볶이가 걸칠 열의 수와 그 사이 간격의 수를 셉니다.

정답

받는 답: 272

<ul class="recipe-list">
  <li>김치볶음밥</li>
  <li>계란말이</li>
  <li>된장찌개</li>
  <li class="best">떡볶이</li>
  <li>잡채</li>
  <li>미역국</li>
</ul>
.recipe-list {
  display: grid;
  grid-template-columns:
    repeat(3, 1fr);
  gap: 16px;
  width: 272px;
  padding: 0;
  list-style: none;
}

.best {
  grid-column: span 3;
}
결과 화면
잰 값개발자 도구에서 본 값
  • .best의 너비272px
  • .recipe-list li:nth-child(5)의 왼쪽 자리8px
  • 열 셋(80 × 3)과 그 사이 간격 둘(16 × 2)을 더해 272px — 목록 한 줄을 다 차지합니다.
  • 240을 썼다면 사이 간격을 빼놓은 것입니다.
  • 떡볶이가 둘째 줄을 혼자 쓰니, 잡채 · 미역국은 셋째 줄 첫째 · 둘째 열로 갑니다.

2. 추천 카드가 열 두 칸을 차지하게 하려 합니다. ____ 자리에 알맞은 값을 쓰세요.

.best {
  grid-column: ____;
}
힌트

'열 둘에 걸쳐'를 나타내는 낱말과 숫자를 떠올려 봅니다.

정답

span 2

.best {
  grid-column: span 2;
}

이 규칙은 카드에 둡니다. 목록(부모)에는 열을 정하는 grid-template-columns⁠를 둡니다.

3. 여행 일정을 날짜마다 한 줄 머리로 놓았습니다. 결과 화면은 몇 줄일까요?

<ul class="trip">
  <li class="day">1일</li>
  <li>바다</li>
  <li>시장</li>
  <li class="day">2일</li>
  <li>박물관</li>
</ul>
.trip {
  display: grid;
  grid-template-columns:
    repeat(3, 1fr);
  gap: 8px;
  width: 280px;
  padding: 0;
  list-style: none;
}

.day {
  grid-column: span 3;
}
힌트

다섯 칸을 HTML 차례대로 한 줄씩 놓아 봅니다. '2일'이 둘째 줄 셋째 칸(한 칸)에 들어갈 수 있는지 봅니다.

정답

받는 답: 4

결과 화면
잰 값개발자 도구에서 본 값
  • .trip의 줄 수4
  • .trip li:nth-child(5)의 왼쪽 자리8px
  • '1일'이 첫 줄을 다 쓰고, 바다 · 시장이 둘째 줄 첫째 · 둘째 열에 놓입니다.
  • '2일'은 세 칸이 필요해 둘째 줄 셋째 칸에 들지 않고 셋째 줄을 다 씁니다. 박물관은 넷째 줄 첫째 열입니다.
  • 3을 썼다면 박물관이 둘째 줄 빈 셋째 칸을 메운다고 본 것입니다. 격자는 앞으로만 채웁니다.

컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요. hello.html의 body 안을 1절 HTML로, style 요소 안의 규칙을 1절 CSS로 바꿔 저장 · 새로고침합니다. class="wide"를 셋째 상자로 옮기면 첫 줄 셋째 칸이 비고, .grid 규칙에 grid-auto-flow: dense;⁠를 더하면 넷째 상자가 그 칸을 메웁니다. 개발자 도구 Elements 패널에서 .grid 줄 끝의 grid 표시를 누르면 빈 자리까지 격자 선으로 보입니다.

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

HTML·CSS 목차로