CSS : Grid Layout

2025. 7. 31. 16:03ใ†Style/CSS

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. CSS Grid Layout

2. Grid Container ์„ค์ •ํ•˜๊ธฐ
    2-1. ํ•˜๋‚˜ํ•˜๋‚˜ ์ž…๋ ฅํ•ด์„œ ๋ฐฐ์น˜ํ•˜๊ธฐ

    2-2. ํ•จ์ˆ˜ ์‚ฌ์šฉํ•ด์„œ ์ž๋™ ๋ฐฐ์น˜ํ•˜๊ธฐ

3. Grid Item ์„ค์ •ํ•˜๊ธฐ

4. ์˜์—ญ(Area) ์ง€์ •๊ณผ ์ด๋ฆ„ ๋ถ™์ด๊ธฐ


1. CSS Grid Layout

CSS Grid Layout์€ 2์ฐจ์›(ํ–‰๊ณผ ์—ด) ๊ธฐ๋ฐ˜์˜ ๋ ˆ์ด์•„์›ƒ ์‹œ์Šคํ…œ์ด๋‹ค.

Flexbox๊ฐ€ 1์ฐจ์› ๋ ˆ์ด์•„์›ƒ์— ํŠนํ™”๋œ ๋ฐ˜๋ฉด, Grid๋Š” ํ–‰๊ณผ ์—ด์„ ๋™์‹œ์— ์ œ์–ดํ•œ๋‹ค.

 

Grid ์šฉ์–ด

์šฉ์–ด ์„ค๋ช…
Grid Container display: grid ๋˜๋Š” inlin-grid๊ฐ€ ์ ์šฉ๋œ ๋ถ€๋ชจ ์š”์†Œ
Grid Item Grid Container์˜ ์ž์‹ ์š”์†Œ
Grid Line ํ–‰๊ณผ ์—ด์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์„  (๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง)
Grid Track ๋‘ ๊ฐœ์˜ Grid Line ์‚ฌ์ด์˜ ๊ณต๊ฐ„ (= ํ–‰/์—ด ํ•œ ์นธ)
Grid Cell ํ•œ ํ–‰๊ณผ ์—ด์ด ๋งŒ๋‚˜๋Š” ์ตœ์†Œ ๋‹จ์œ„ ์˜์—ญ
Grid Area ์—ฌ๋Ÿฌ Grid Cell์ด ๋ชจ์—ฌ ๋งŒ๋“  ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ

 

 


2. Grid Container ์„ค์ •ํ•˜๊ธฐ

1. ํ•˜๋‚˜ํ•˜๋‚˜ ์ž…๋ ฅํ•ด์„œ ๋ฐฐ์น˜ํ•˜๊ธฐ

์šฐ์„  container๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ์ž‘ํ•˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์›ํ•˜๋Š” ํ–‰๊ณผ ์—ด์˜ cell ์‚ฌ์ด์ฆˆ๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•ด๋ณด์ž.

.container {
    display: grid;	/* ๋˜๋Š” inline-grid */
    /* ↓ 3๊ฐœ์˜ ์—ด(columns) ์ƒ์„ฑ: 1์—ด-200px, 2์—ด-1fr(๋‚จ์€ ๊ณต๊ฐ„์ค‘ 1๋‹จ์œ„), 3์—ด-2fr(2์˜ ๋‘๋ฐฐ) */
    grid-template-columns: 200px 1fr 2fr;
    /* ↓ 3๊ฐœ์˜ ํ–‰(row) ์ƒ์„ฑ: 1ํ–‰-์ปจํ…์ธ  ๋†’์ด์— ๋”ฐ๋ผ ์ž๋™, 2ํ–‰: 100px ๊ณ ์ •๋†’์ด, 3ํ–‰: 50px ๊ณ ์ •๋†’์ด*/
    grid-template-rows: auto 100px 50px;
    gap: 10px 20px;	/* ํ–‰(row)๊ณผ ์—ด(column) ์‚ฌ์ด ๊ฐ„๊ฒฉ*/
}

์˜ˆ์‹œ ์ฝ”๋“œ ๊ฒฐ๊ณผ ํ™”๋ฉด. ํ–‰๋ณด๋‹ค ๋„˜์น˜๋Š” ์•„์ดํ…œ์€ auto(default) ๋†’์ด๋กœ ๋ฐฐ์ •๋œ๋‹ค.

  • display: grid → Grid ๋ ˆ์ด์•„์›ƒ ํ™œ์„ฑํ™”
  • grid-template-columns ์—ด ํฌ๊ธฐ ์ง€์ • (px, %, fr ๋“ฑ์˜ ๋‹จ์œ„ ์‚ฌ์šฉ)
    • px, % : ๊ณ ์ • ํฌ๊ธฐ, ๋ถ€๋ชจ ๋Œ€๋น„ ๋น„์œจ
    • fr(fraction) : ๊ฐ€์šฉ ๊ณต๊ฐ„์˜ ๋น„์œจ
    • auto : ์ปจํ…์ธ  ํฌ๊ธฐ์— ๋งž์ถฐ ์ž๋™ ์กฐ์ ˆ
    • min-content, max-content, fit-content() ๋“ฑ์˜ ํ•จ์ˆ˜๋„ ์žˆ์Œ
  • grid-template-rows ํ–‰ ํฌ๊ธฐ ์ง€์ •
  • gap/row-gap/column-gap ํ–‰๊ณผ ์—ด ์‚ฌ์ด ๊ฐ„๊ฒฉ ์กฐ์ ˆ

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ˜๋ณต์„ ๋„์™€์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

2. ํ•จ์ˆ˜ ์‚ฌ์šฉํ•ด์„œ ์ž๋™ ๋ฐฐ์น˜ํ•˜๊ธฐ

.container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-auto-rows: 100px;
    grid-auto-flow: row dense;
}

 

  • repeat(count, value) : ๋‹จ์ˆœ ๋ฐ˜๋ณต ์ง€์ •. ๋‹จ์ˆœ ๋ฐ˜๋ณต ๊ตฌ์กฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. (ex.repeat(3, 1fr) = 1fr 1fr 1fr)
  • minmax([min๊ฐ’], [max๊ฐ’]) : ํ–‰๊ณผ ์—ด์˜ ์ตœ์†Œํฌ๊ธฐ, ์ตœ๋Œ€ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    grid-template-columns: repeat(3, minmax(200px, 1fr)); → 200๋ณด๋‹ค ์ค„์ง€ ์•Š๊ณ , ๋Š˜์–ด๋‚˜๋ฉด ํ•ญ์ƒ 1:1:1 ๋น„์œจ๋กœ ๋Š˜์–ด๋‚จ
  • grid-auto-rows, grid-auto-columns : ๋ช…์‹œ๋˜์ง€ ์•Š์€ ํ–‰/์—ด ํฌ๊ธฐ ์ง€์ •
  • grid-auto-flow : ์ž๋™ ๋ฐฐ์น˜ ๋ฐฉํ–ฅ ์ง€์ •(row, column, dense)

 

 


3. Grid Item ์„ค์ •ํ•˜๊ธฐ

1. Grid Item ๋ฐฐ์น˜ ์†์„ฑ

Grid Item์€ ์•„๋ž˜ ์†์„ฑ๋“ค๋กœ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์†์„ฑ ์„ค๋ช…
grid-column-start ์‹œ์ž‘ ์—ด - ๋ฒˆํ˜ธ ๋˜๋Š” ์ด๋ฆ„ ์ง€์ •
grid-column-end ๋ ์—ด - ๋ฒˆํ˜ธ ๋˜๋Š” ์ด๋ฆ„ ์ง€์ •
grid-row-start ์‹œ์ž‘ ํ–‰ - ๋ฒˆํ˜ธ ๋˜๋Š” ์ด๋ฆ„ ์ง€์ •
grid-row-end ๋ ํ–‰ - ๋ฒˆํ˜ธ ๋˜๋Š” ์ด๋ฆ„ ์ง€์ •
grid-column start / end ์ถ•์•ฝํ˜•
grid-row start / end ์ถ•์•ฝํ˜•
grid-area row-start / column-start / row-end / column-end ์ถ•์•ฝํ˜•

๋ณด๋ฉด ์ „๋ถ€ ํ–‰๊ณผ ์—ด์˜ ์‹œ์ž‘๊ณผ ๋์˜ ๋ฒˆํ˜ธ/์ด๋ฆ„์„ ๋ถ™์ด๋Š” ์†์„ฑ๋“ค์ด๋‹ค.

 

.item {
    grid-column: 1 / 3;	/* 1์—ด๋ถ€ํ„ฐ 3์—ด ์ „๊นŒ์ง€(2์—ด๊นŒ์ง€) */
    grid-row: 2 / 4; /* 2ํ–‰๋ถ€ํ„ฐ 4ํ–‰ ์ „๊นŒ์ง€(3ํ–‰๊นŒ์ง€) */
}

์ด ์•„์ดํ…œ์€ grid์—์„œ 1์—ด๋ถ€ํ„ฐ 3์—ด, 2ํ–‰๋ถ€ํ„ฐ 4ํ–‰๊นŒ์ง€๋ฅผ ์ฐจ์ง€ํ•˜๋Š”(=๋ณ‘ํ•ฉํ•˜๋Š”) ์•„์ดํ…œ์ด๋‹ค.


4. ์˜์—ญ(Area) ์ง€์ •๊ณผ ์ด๋ฆ„ ๋ถ™์ด๊ธฐ

Grid ์˜์—ญ์— ์ด๋ฆ„์„ ๋ถ™์ด๊ณ , ์•„์ดํ…œ์„ ์ด๋ฆ„์œผ๋กœ ๋ฐฐ์น˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

.container {
    display: grid;
    grid-template-columns: 1fr 2fr 1fr;
    grid-template-rows: 100px 200px
    grid-template-areas:
    	"header header header"
        "sidebar main main";
    }
    
    .header { grid-area: header; }
    
    .sidebar { grid-area: sidebar; }
    
    .main { grid-area: main; }
  • ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์•„์ดํ…œ์ด grid-template-areas์—์„œ ์ธ์ ‘ํ•œ ์œ„์น˜(๊ฐ€๋กœ/์„ธ๋กœ)์— ๋ฐ˜๋ณต๋˜๋ฉด ๋ณ‘ํ•ฉ๋„ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
  • grid-template-areas์˜ ์—ด ์ˆ˜๋Š” ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค.

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•