행(row)과 열(column)을 동시에 제어하는 2차원 레이아웃 시스템 CSS Grid.
카드 그리드부터 전체 페이지 레이아웃까지, 인터랙티브 데모로 바로 익혀봐요.
행(row)과 열(column)을 동시에 다루는 웹의 2차원 레이아웃 시스템
웹 페이지를 만들다 보면 단순히 가로로 나열하는 것 이상이 필요할 때가 있어요. 헤더, 사이드바, 본문, 푸터가 격자처럼 맞물려야 하거나, 카드들이 깔끔하게 여러 열로 나뉘어야 하거나, 특정 요소가 여러 칸을 차지해야 하는 경우가 그래요. CSS Grid는 이런 2차원 레이아웃을 가장 명확하고 직관적으로 만들 수 있는 CSS 시스템이에요.
Grid는 부모(Container)에 display: grid를 선언하면 활성화돼요.
그러면 자식 요소(Item)들이 자동으로 격자 형태로 배치되고,
grid-template-columns와 grid-template-rows로 각 칸의 크기를 자유롭게 지정할 수 있어요.
나아가 grid-template-areas를 사용하면 이름만으로 복잡한 레이아웃도 한눈에 그릴 수 있어요.
CSS Grid는 2017년 주요 브라우저에 정식 지원되기 시작했고, 지금은 전 세계 브라우저의 98% 이상에서 완벽하게 동작해요. float, table, 절대 위치 지정 없이도 복잡한 레이아웃을 단 몇 줄로 구현할 수 있는 시대가 된 거예요.
헤더, 사이드바, 본문, 푸터가 모두 격자로 맞물리는 구조. Grid의 가장 강력한 활용처예요.
상품 목록, 블로그 포스트 등을 여러 열로 나열. auto-fill로 반응형까지 한 번에 해결해요.
특정 카드가 2열을 차지하거나 2행을 차지하는 비대칭 레이아웃. grid-column: span 2로 쉽게 구현해요.
크기가 제각각인 위젯들을 격자 안에 깔끔하게 배치. Grid Area 이름 지정으로 직관적으로 관리해요.
Flexbox vs Grid, 무엇을 쓰나요? 단순한 가로 정렬이나 버튼 그룹이라면 Flexbox가 더 간단해요. 2차원(행+열)이 동시에 필요하거나, 요소가 특정 칸에 정확히 위치해야 한다면 Grid가 정답이에요. 실무에서는 전체 페이지 구조는 Grid로, 그 안의 소소한 정렬은 Flexbox로 함께 쓰는 경우가 많아요.
Container에 적용하는 속성들 — 이것만 알면 대부분의 그리드 레이아웃이 가능해요
열(column)의 개수와 크기를 정의해요. fr 단위로 비율 지정, repeat()로 반복 선언이 가능해요.
행(row)의 크기를 정의해요. 보통은 콘텐츠 높이에 맞게 자동이지만, 헤더·푸터 같은 고정 높이에 유용해요.
행과 열 사이 간격이에요. row-gap과 column-gap을 따로 지정할 수도 있어요.
아이템이 몇 번 줄부터 몇 번 줄까지 차지할지 지정해요. span N으로 N칸 차지도 가능해요.
이름으로 레이아웃 영역을 지정해요. 코드만 봐도 레이아웃 구조가 한눈에 파악돼요.
반응형 그리드의 핵심. auto-fill은 빈 칸을 유지, auto-fit은 남은 공간을 아이템이 채워요.
fr 단위가 뭔가요? fraction(분수)의 약자예요. 사용 가능한 공간을 비율로 나눠 갖는 단위예요.
repeat(3, 1fr)이면 전체 너비를 3등분해요. 1fr 2fr이면 1:2 비율로 나눠요.
픽셀(px)처럼 절대값이 아니라 남은 공간을 기준으로 계산하기 때문에 반응형에 아주 유용해요.
복붙하면 바로 쓸 수 있는 실전 코드
.card-grid { display: grid; grid-template-columns: repeat(3, 1fr); /* 3열, 균등 분배 */ gap: 20px; }
.layout { display: grid; grid-template-areas: "header header" "sidebar main" "footer footer"; grid-template-columns: 240px 1fr; grid-template-rows: 60px 1fr 44px; min-height: 100vh; } .header { grid-area: header; } .sidebar { grid-area: sidebar; } .main { grid-area: main; } .footer { grid-area: footer; }
.responsive-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); /* 각 칸 최소 250px, 최대 1fr (남은 공간 균등 분배) */ /* 화면이 좁아지면 자동으로 열 수가 줄어들어요 */ gap: 16px; }
아래 프롬프트를 AI에게 그대로 붙여넣으면 완성도 높은 CSS Grid 레이아웃을 바로 받을 수 있어요.
내 웹페이지에 CSS Grid로 3열 카드 레이아웃을 만들어줘. - 카드 최소 너비 280px, 최대 1fr - 카드 간격 20px - 모바일에서는 1열로 변경 (768px 이하) - 카드 hover 시 살짝 위로 올라오는 효과
속성을 바꾸면 박스들이 실시간으로 변해요. 박스를 클릭하면 span 2를 토글해요.
아래 박스를 클릭하면 grid-column: span 2 가 토글돼요
CSS Grid를 쓰다 보면 꼭 만나는 궁금증
fr은 fraction(분수)의 약자로, 그리드 컨테이너에서 남은 공간을 비율로 나누는 단위예요.grid-template-columns: 1fr 2fr이면 전체 너비에서 2:1로 나눠 첫 번째 열은 1/3, 두 번째 열은 2/3을 차지해요.repeat(3, 1fr)은 전체 너비를 균등하게 3등분해요. 고정 너비(px)와 함께 쓸 수도 있어요. 예: 240px 1fr — 왼쪽 사이드바는 240px 고정, 나머지는 메인 콘텐츠가 다 가져가요.
repeat() 안에서 반응형 그리드를 만들 때 써요.auto-fill이 예측하기 더 쉬워서 많이 써요. 아이템 수가 항상 열 수를 채운다면 둘의 차이는 없어요.
grid-template-areas에서 점(.)은 빈 셀을 의미해요. 해당 위치에 아무 아이템도 배치되지 않아요."sidebar . main"처럼 쓰면 가운데 칸은 비어있고 좌우에만 콘텐츠가 들어가요.자연스럽게 이어지는 주제들로 실력을 넓혀봐요