CSS Grid로 카드형 레이아웃 만들기

카드형-레이아웃-만들기-썸네일


안녕하세요. 이코노트허브 입니다.

블로그 하단이나 사이드바에서 "관련 글" 섹션이 카드 형태로 반듯하게 정렬된 걸 보신 적 있으실 겁니다. 이런 격자(그리드) 형태의 레이아웃은 예전엔 만들기 까다로웠지만, CSS Grid가 나온 뒤로는 몇 줄이면 충분합니다.

[Grid, 언제 쓰면 좋을까요?]

지난번 다뤘던 flex는 한 줄(가로 또는 세로)을 정렬할 때 강력합니다. 반면 grid가로와 세로를 동시에 격자처럼 배치해야 할 때 훨씬 편합니다. 카드 3개를 나란히, 그리고 여러 줄로 자동 배치하고 싶다면 grid가 정답입니다.

[기본 문법]

.card-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}

하나씩 뜯어보겠습니다.

  • display: grid: 이 요소를 격자 배치로 만들겠다는 선언입니다.
  • grid-template-columns: repeat(3, 1fr): 열을 3개 만들고, 각 열의 너비를 동일한 비율(1fr)로 나눈다는 뜻입니다. "3개씩 나란히"를 이 한 줄로 표현합니다.
  • gap: 16px: 카드 사이의 간격입니다. 예전처럼 마진을 각 카드에 따로 줄 필요가 없습니다.

[실전 예제: 관련 글 카드]

<div class="card-container">
  <div class="card">
    <img src="이미지주소.jpg" alt="글 제목">
    <h3>글 제목 1</h3>
  </div>
  <div class="card">
    <img src="이미지주소.jpg" alt="글 제목">
    <h3>글 제목 2</h3>
  </div>
  <div class="card">
    <img src="이미지주소.jpg" alt="글 제목">
    <h3>글 제목 3</h3>
  </div>
</div>
.card {
  border: 1px solid #e0e0e0;
  border-radius: 8px;
  padding: 12px;
  overflow: hidden;
}

.card img {
  width: 100%;
  height: auto;
  border-radius: 4px;
}

카드 3개를 감싸는 부모에 card-container 클래스를, 각 카드에 card 클래스를 지정하면 자동으로 3열 격자로 정렬됩니다.

[모바일에서는 열 개수 줄이기]

지난번 배운 미디어 쿼리를 그대로 활용합니다. PC에서는 3열이지만, 스마트폰처럼 화면이 좁을 땐 1열로 바꿔주는 게 훨씬 보기 좋습니다.

@media (max-width: 768px) {
  .card-container {
    grid-template-columns: 1fr;
  }
}

grid-template-columns: 1fr은 열이 1개, 즉 세로로 쭉 나열된다는 뜻입니다.

[더 똑똑한 방법: 자동으로 열 개수 조절하기]

화면 크기별로 미디어 쿼리를 여러 번 쓰는 대신, 아래처럼 하면 화면 크기에 따라 카드 개수가 자동으로 조절됩니다.

.card-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 16px;
}

auto-fitminmax(200px, 1fr)의 조합은 "카드 하나의 최소 너비는 200px로 유지하면서, 한 줄에 들어갈 수 있는 만큼 알아서 채워라"는 뜻입니다. 화면이 넓으면 카드가 4~5개까지 늘어나고, 좁으면 자동으로 1~2개로 줄어듭니다. 미디어 쿼리 없이도 반응형이 해결되는 경우가 많아 실무에서 자주 씁니다.

[초보자가 자주 하는 실수 2가지]

  1. margin으로 간격을 주다가 정렬이 틀어지는 경우: 각 카드에 margin을 따로 주면 양 끝 카드만 간격이 안 맞는 문제가 생깁니다. gap 속성을 쓰면 이런 계산을 할 필요 없이 부모 요소에서 한 번에 해결됩니다.
  2. 이미지 비율이 카드마다 다른 경우: 원본 이미지 크기가 제각각이면 카드 높이가 들쭉날쭉해 보일 수 있습니다. imgwidth: 100%; height: auto;를 기본으로 걸어두면 가로 폭에 맞춰 비율이 자동으로 조정됩니다.

핵심 요약

  • 한 줄 정렬은 flex, 격자(행+열) 정렬은 grid가 더 적합합니다.
  • grid-template-columns: repeat(개수, 1fr)로 열 개수를 지정하고, gap으로 간격을 줍니다.
  • repeat(auto-fit, minmax(최소너비, 1fr))을 쓰면 미디어 쿼리 없이도 화면 크기에 맞춰 열 개수가 자동 조절됩니다.
  • 카드 간격은 margin보다 gap을 쓰는 게 훨씬 깔끔합니다.

지금 블로그 하단에 "관련 글"이나 "추천 글" 섹션이 줄글로만 나열되어 있다면, 이번 카드형 레이아웃 한번 적용해보시는 걸 추천드립니다. 방문자가 훨씬 더 많은 글을 자연스럽게 클릭하게 될 거예요.

댓글 쓰기

자유롭게 질문해주세요. 단, 광고성 댓글 및 비방은 사전 통보 없이 삭제됩니다.

다음 이전