Notice
Recent Posts
Recent Comments
Link
Β«   2026/05   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

η„‘μ œ

Grid Layout κ³Ό μš”μ†Œ λ³Έλ¬Έ

<style>

Grid Layout κ³Ό μš”μ†Œ

yo-u-loo 2026. 3. 24. 12:44

 

πŸŸ’β€Š Grid Layout (κ·Έλ¦¬λ“œ λ ˆμ΄μ•„μ›ƒ)

ν–‰(row)κ³Ό μ—΄(column)을 λ™μ‹œμ— λ‹€λ£° 수 μžˆλŠ” 2차원 λ ˆμ΄μ•„μ›ƒ 방식.

 

πŸ”Ή display: grid (μ •λ ¬μ˜ μ‹œμž‘)

μš”μ†Œλ₯Ό grid Container(ν”Œλ ‰μŠ€ μ»¨ν…Œμ΄λ„ˆ)둜 λ§Œλ“œλŠ” κ°€μž₯ 기본적인 μ„ μ–Έ.

.container {
  display: grid;
}

 

πŸ‘‰ fr (fraction) λΉ„μœ¨ λ‹¨μœ„ πŸ”₯핡심πŸ”₯

μ‚¬μš© κ°€λŠ₯ν•œ 곡간을 λΉ„μœ¨λ‘œ λ‚˜λˆ„λŠ” μœ μ—°ν•œ λ‹¨μœ„.

.container {
  /* 100px을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 곡간을 1:2둜 λ‚˜λˆ” */
  grid-template-columns: 100px 1fr 2fr;
  grid-template-rows: 1fr 2fr;
  /* 1:2 λΉ„μœ¨ (전체λ₯Ό 3λ“±λΆ„) */
}
  • fr 은 고정값이 μ•„λ‹Œ λΉ„μœ¨ 기반 λ‹¨μœ„.

 

1️⃣ Grid Container 속성 (λΆ€λͺ¨ μš”μ†Œ)

κ·Έλ¦¬λ“œ μ „μ²΄μ˜ ꡬ쑰(ν–‰κ³Ό μ—΄)λ₯Ό μ •μ˜ν•˜κ³ , λ ˆμ΄μ•„μ›ƒμ˜ κΈ°λ³Έ 틀을 μ„€μ •.

πŸ”Ή grid-template-columns

μ—΄(column) 크기와 개수λ₯Ό μ •μ˜ν•˜λŠ” 속성.

.container {
  grid-template-columns: 200px 200px 200px;
}
  • px, %, fr λ“± λ‹€μ–‘ν•œ λ‹¨μœ„ μ‚¬μš© κ°€λŠ₯.

 

πŸ”Ή grid-template-rows

ν–‰(row) 크기와 개수λ₯Ό μ •μ˜ν•˜λŠ” 속성.

.container {
  grid-template-rows: 200px 200px 200px;
}
  • auto μ‚¬μš© μ‹œ μ½˜ν…μΈ  크기에 따라 높이 μžλ™ κ²°μ •.
  • px, %, fr λ“± λ‹€μ–‘ν•œ λ‹¨μœ„ μ‚¬μš© κ°€λŠ₯.

 

πŸ”Ή gap

Gridμ—μ„œ ν–‰(row)κ³Ό μ—΄(column) μ‚¬μ΄μ˜ 간격을 μ„€μ •.

.container {
  gap: 20px;
}

βœ”οΈ λ˜λŠ” 각각의 간격도 μ„€μ • κ°€λŠ₯.

.container {
  row-gap: 10px;
  column-gap: 20px;
}

 

πŸ”Ή repeat() ν•¨μˆ˜

ν–‰κ³Ό μ—΄μ˜ λ°˜λ³΅λ˜λŠ” 값을 κ°„λ‹¨ν•˜κ²Œ μž‘μ„±.

.container {
  /* 총 3개의 열을 λ™μΌν•œ λΉ„μœ¨ 1fr 둜 생성 */
  grid-template-columns: repeat(3, 1fr);
}

 

πŸ”Ή minmax()

μ΅œμ†Œκ°’(min)κ³Ό μ΅œλŒ€κ°’(max)을 μ„€μ •.

.container {
  /* 총 3개의 열이 μƒμ„±λ˜κ³ , 각 μ—΄μ˜ μ΅œμ†Œ λ„ˆλΉ„λŠ” 100px이고 곡간이 μΆ©λΆ„ν•˜λ©΄ μ΅œλŒ€ 1frκΉŒμ§€ ν™•μž₯ */
  grid-template-columns: repeat(3, minmax(100px, 1fr));
}

 

πŸ”Ή auto-fill / auto-fit 

λ°˜μ‘ν˜• λ ˆμ΄μ•„μ›ƒ μ—μ„œ μ»¨ν…Œμ΄λ„ˆ 크기에 따라 μ—΄(column)의 개수λ₯Ό μžλ™μœΌλ‘œ μ‘°μ •.

.container {
  /* 각 μ—΄μ˜ μ΅œμ†Œ λ„ˆλΉ„λŠ” 200px, 곡간이 λ‚¨μœΌλ©΄ 1fr κΉŒμ§€ ν™•μž₯,
  ν™”λ©΄ 크기에 따라 μ—΄ κ°œμˆ˜κ°€ μžλ™μœΌλ‘œ λŠ˜μ–΄λ‚˜κ±°λ‚˜ 쀄어듦 */
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
  • auto-fill: 곡간이 남아도 빈 칸을 μœ μ§€.
  • auto-fit: 빈 칸을 μ œκ±°ν•˜κ³  μš”μ†Œλ₯Ό 꽉 채움. (λ°˜μ‘ν˜•μ—μ„œ 자주 μ‚¬μš©)
  • 핡심 νŒ¨ν„΄: minmax() 와 ν•¨κ»˜ μ‚¬μš©.

 

πŸ”Ή  grid-template-areas

각 μ˜μ—­μ— 직관적인 이름을 λΆ™μ—¬ 배치 κ°€λŠ₯ν•œ 속성.

<style>
.container {
  display: grid;
  grid-template-columns: 200px 1fr 1fr;
  grid-template-rows: 100px 300px 100px;
  grid-template-areas:
    "header header header"
    "sidebar main ."
    "footer footer footer";
  gap: 10px;
}

.header { grid-area: header; background: lightblue; }
.sidebar { grid-area: sidebar; background: lightgreen; }
.main { grid-area: main; background: lightcoral; }
.footer { grid-area: footer; background: lightgray; }
</style>

<div class="container">
  <div class="header">헀더</div>
  <div class="sidebar">μ‚¬μ΄λ“œλ°”</div>
  <div class="main">λ³Έλ¬Έ</div>
  <div class="footer">ν‘Έν„°</div>
</div>
  • λΆ€λͺ¨ μš”μ†Œ μ„€μ •: grid-template-areasλ₯Ό μ‚¬μš©ν•΄ 마치 λ°”λ‘‘νŒμ„ 그리듯 ν°λ”°μ˜΄ν‘œ μ•ˆμ— μ˜μ—­ 이름을 배치.
  • μžμ‹ μš”μ†Œ λ§€ν•‘: grid-area: μ˜μ—­μ΄λ¦„; 을 μ„ μ–Έν•˜λ©΄ λΆ€λͺ¨κ°€ μ •μ˜ν•œ μ˜μ—­μ— 듀어감.
    • μ˜μ—­ 이름과 grid-area 값이 μ •ν™•νžˆ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
    • μ˜μ—­ 이름은 쀑볡 κ°€λŠ₯.
  • 빈칸 처리: .(λ§ˆμΉ¨ν‘œ)λ₯Ό μ‚¬μš©ν•˜λ©΄ κ·Έ 칸은 빈 κ³΅κ°„μœΌλ‘œ 남겨둔닀.

 


 

2️⃣ Grid Item 속성 (μžμ‹ μš”μ†Œ)

각 μš”μ†Œκ°€ κ·Έλ¦¬λ“œ μ•ˆμ—μ„œ μ–΄λŠ 칸을 μ°¨μ§€ν• μ§€ κ²°μ •.

 

πŸ‘‰ Grid Lines (κ·Έλ¦¬λ“œ 라인)

κ·Έλ¦¬λ“œ 라인은 κ·Έλ¦¬λ“œ μ—΄κ³Ό 행을 κ΅¬λΆ„ν•˜λŠ” λˆˆμ— 보이지 μ•ŠλŠ” μ„ .

  • 번호 체계: 라인 λ²ˆν˜ΈλŠ” 항상 1λΆ€ν„° μ‹œμž‘. 3μ—΄μ§œλ¦¬ κ·Έλ¦¬λ“œλΌλ©΄ μ„Έλ‘œ 라인은 1λ²ˆλΆ€ν„° 4λ²ˆκΉŒμ§€ 쑴재.
  • 음수 번호: λμ—μ„œλΆ€ν„° 거꾸둜 μ…€ μˆ˜λ„ 있으며, λ§ˆμ§€λ§‰ 선은 항상 -1.
  • ν™œμš©: grid-columnκ³Ό grid-row 속성을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • μ•„μ΄ν…œμ΄ λͺ‡ 번 μ„ λΆ€ν„° λͺ‡ 번 μ„ κΉŒμ§€ μ°¨μ§€ν• μ§€ κ²°μ •.

 

πŸ”Ή grid-column

μ—΄(column)μ—μ„œ μ‹œμž‘κ³Ό 끝 μœ„μΉ˜ μ§€μ •.

.item {
  /* 1번 라인뢀터 3번 λΌμΈκΉŒμ§€ */
  grid-column: 1 / 3;
}

 

πŸ”Ή grid-row

ν–‰(row)μ—μ„œ μ‹œμž‘κ³Ό 끝 μœ„μΉ˜ μ§€μ •.

.item {
  grid-row: 1 / 3;
}

πŸ‘‡ μΆ•μ•½ν˜• πŸ‘‡

.item {
  grid-column: span 2; /* 2μΉΈ μ°¨μ§€ */
}
  • span: λͺ‡ 칸을 μ°¨μ§€ν• μ§€ μ§€μ •.

 

πŸ”Ή grid-area μΆ•μ•½ν˜•

ν•œ λ²ˆμ— ν–‰/μ—΄ λͺ¨λ‘ μ§€μ •.

.item {
  grid-area: 1 / 1 / 3 / 3;
}
  • 문법: grid-area: row-start / col-start / row-end / col-end;

 

 

πŸ“β€Š POINT πŸ“β€Š

βœ”οΈ fr μ€ κ°€μš© 곡간을 λΉ„μœ¨λ‘œ λ‚˜λˆ„λŠ” λ‹¨μœ„, μœ μ—°ν•œ λ ˆμ΄μ•„μ›ƒμ— ν•„μˆ˜. βœ”οΈ

βœ”οΈ repeat(auto-fit, minmax(200px, 1fr)) λ₯Ό μ‚¬μš©ν•˜λ©΄ λ―Έλ””μ–΄ 쿼리 없이도 μ™„λ²½ν•œ λ°˜μ‘ν˜• κ·Έλ¦¬λ“œ κ°€λŠ₯. βœ”οΈ

βœ”οΈ κ·Έλ¦¬λ“œ 라인 λ²ˆν˜ΈλŠ” 1λΆ€ν„° μ‹œμž‘ν•˜λ©°, -1을 μ“°λ©΄ λ§ˆμ§€λ§‰ 라인을 μ˜λ―Έν•©λ‹ˆλ‹€. βœ”οΈ

βœ”οΈ κ·Έλ¦¬λ“œ 라인은 λ―Έμ„Έν•˜κ³  μ •κ΅ν•œ λ°°μΉ˜κ°€ ν•„μš”ν•  λ•Œ, ν…œν”Œλ¦Ώ μ˜μ—­μ€ 전체적인 λ ˆμ΄μ•„μ›ƒμ˜ ꡬ쑰λ₯Ό ν•œλˆˆμ— νŒŒμ•…ν•˜κ³  싢을 λ•Œ μœ μš©ν•˜λ‹€. βœ”οΈ

 

 

πŸ“‹ κ·Έλ¦¬λ“œ μ£Όμš” 속성 μš”μ•½ν‘œ πŸ“‹

μΉ΄ν…Œκ³ λ¦¬ 속성 μ„€λͺ… 팁
μ»¨ν…Œμ΄λ„ˆ grid-template-columns μ—΄μ˜ κ°œμˆ˜μ™€ λ„ˆλΉ„ μ •μ˜ repeat(3, 1fr)처럼 반볡 νŒ¨ν„΄ ν™œμš© κ°€λŠ₯
μ»¨ν…Œμ΄λ„ˆ grid-template-rows ν–‰μ˜ κ°œμˆ˜μ™€ 높이 μ •μ˜ 높이λ₯Ό μžλ™(auto)둜 두면 μ½˜ν…μΈ μ— 맞좰 쑰절 κ°€λŠ₯
μ»¨ν…Œμ΄λ„ˆ grid-template-areas μ˜μ—­ 이름을 λ°”λ‘‘νŒμ‹μœΌλ‘œ 배치 μ΄λ¦„λ§Œ λ°”κΏ”μ„œ λ°˜μ‘ν˜• λ ˆμ΄μ•„μ›ƒ μ‰½κ²Œ 재배치 κ°€λŠ₯
μ»¨ν…Œμ΄λ„ˆ gap κ·Έλ¦¬λ“œ μ…€ μ‚¬μ΄μ˜ 간격 row-gap, column-gap λ”°λ‘œ μ§€μ • κ°€λŠ₯
μ•„μ΄ν…œ grid-column μ—΄ μ‹œμž‘/끝 μœ„μΉ˜ μ§€μ • 1 / -1은 전체 μ—΄ μ°¨μ§€, span 2둜 연속 μΉΈ μ°¨μ§€
μ•„μ΄ν…œ grid-row ν–‰ μ‹œμž‘/끝 μœ„μΉ˜ μ§€μ • span 3으둜 ν˜„μž¬ μœ„μΉ˜μ—μ„œ 3μΉΈ μ°¨μ§€
μ•„μ΄ν…œ grid-area μ•„μ΄ν…œμ˜ μ˜μ—­ 이름 λ˜λŠ” λ²”μœ„ grid-template-areas의 이름과 μΌμΉ˜μ‹œμΌœμ•Ό 함

 


 

βš™οΈ μ‹€μ „ 예제 μ½”λ“œ: μ‹ λ¬Έ μŠ€νƒ€μΌ λ ˆμ΄μ•„μ›ƒ  βš™οΈ

<style>
  .grid-wrapper {
    display: grid;
    /* 3μ—΄λ‘œ λ‚˜λˆ„κ³ , κ°€μš΄λ° 열은 λ„ˆλΉ„μ˜ 2λ°° */
    grid-template-columns: 1fr 2fr 1fr;
    /* ν–‰μ˜ 크기λ₯Ό μžλ™μœΌλ‘œ 쑰절 */
    grid-template-rows: auto 200px auto;
    gap: 15px;
    padding: 10px;
  }

  .item {
    background-color: #3498db;
    color: white;
    padding: 20px;
    text-align: center;
    border-radius: 8px;
  }

  /* ν—€λ”λŠ” 첫 번째 쀄 전체(3μ—΄)λ₯Ό μ°¨μ§€ */
  .header {
    grid-column: 1 / 4;
    background-color: #2c3e50;
  }

  /* 메인 μ½˜ν…μΈ λŠ” 2열을 μ°¨μ§€ */
  .main {
    grid-column: span 2;
  }

  /* 푸터도 전체λ₯Ό μ°¨μ§€ */
  .footer {
    grid-column: 1 / 4;
    background-color: #7f8c8d;
  }
</style>

<div class="grid-wrapper">
  <div class="item header">Header</div>
  <div class="item main">Main Content</div>
  <div class="item sidebar">Sidebar</div>
  <div class="item footer">Footer</div>
</div>