1. Grid and Flex πŸ‘©β€πŸ’»

일반적으둜 Grid λ³΄λ‹€λŠ” Flex λ₯Ό 더 많이 μ‚¬μš©ν•œλ‹€. 사싀 Grid λŠ” μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ Block μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό μ»¨ν…Œμ΄λ„ˆλ‘œ μ‚¬μš©ν•΄ 물리적 측을 λ‚˜λˆ„κ³ , Flex 와 margin 을 적절히 μ‚¬μš©ν•΄μ£ΌκΈ°λ§Œ 해도 격자 λͺ¨μ–‘μ˜ λ ˆμ΄μ•„μ›ƒμ„ μ™„μ „νžˆ λŒ€μ²΄ν•  수 μžˆλ‹€.

κ·ΈλŸΌμ—λ„ Grid λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ? 기본적으둜 Flex λŠ” 1차원이고, Grid λŠ” 2차원이닀. Flex 에 wrap을 μ‚¬μš©ν•˜λ©΄ 2쀄, 3쀄, … 늘릴 수 μžˆμ§€λ§Œ μ •ν™•νžˆλŠ” 2차원 배열이 μ•„λ‹ˆκ³  1차원 배열을 λ‚΄λΆ€ μ•„μ΄ν…œμ˜ 크기λ₯Ό μš°μ„ ν•΄ μž˜λΌμ„œ λ‹€μŒ 쀄에 뢙여넣은 것이닀. 즉, μ‹œκ°μ μœΌλ‘œλŠ” 2차원일지라도 μ‹€μ œλ‘œλŠ” 1차원 배열이닀.

반면 Grid λŠ” νƒœμƒ μžμ²΄κ°€ 2차원 Matrix ꡬ쑰닀. μ• μ΄ˆμ— Grid λΌλŠ” 단어 μžμ²΄κ°€ β€˜κ²©μžλ¬΄λŠ¬β€™λ₯Ό μ˜λ―Έν•˜λ‹ˆβ€¦ λ”°λΌμ„œ λ‹¨μˆœνžˆ μœ λ™μ μΈ λ°˜μ‘ν˜• ꡬ쑰λ₯Ό μ›ν•œλ‹€λ©΄ Flex κ°€ μ ν•©ν•˜κ³ , 미리 μ™„λ²½ν•˜κ²Œ 정해진 2차원 λ ˆμ΄μ•„μ›ƒμ„ λ°°μΉ˜ν•˜λŠ”λ° νŠΉν™”λ˜μ—ˆλ‹€λŠ” 것이닀. 즉, 2차원 ꡬ쑰 λ°°μΉ˜μ— Grid κ°€ νŽΈν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•˜λŠ” 것이닀.

λ¬Όλ‘ , 이 λͺ¨λ“  ꡬ쑰듀은 Grid 도, Flex 도 없어도 κ°€λŠ₯ν•˜λ‹€. κ³Όκ±° float κ³Ό absolute, 가상 μ—˜λ¦¬λ¨ΌνŠΈ μ„ νƒμžλ‘œ 배치λ₯Ό κ΅¬ν˜„ν•˜κΈ° νž˜λ“œλ‹ˆ Table 을 ν…Œμ΄λΈ”λ„ μ•„λ‹Œλ° λ ˆμ΄μ•„μ›ƒμ„ 작기 μœ„ν•΄ μ‚¬μš©ν•˜κΈ°λ„ ν–ˆλ‹€λŠ”λ°, Flex 의 λ“±μž₯으둜 λ ˆμ΄μ•„μ›ƒ μž‘κΈ°κ°€ μ‰¬μ›Œμ‘Œμ§€λ§Œ μ—¬μ „νžˆ 넓은 μ˜μ—­μ˜ λ ˆμ΄μ•„μ›ƒμ„ μ™„λ²½νžˆ μ œμ–΄ν•˜κΈ°λŠ” νž˜λ“  뢀뢄이 μžˆλ‹€ λ³΄λ‹ˆ μƒκ²¨λ‚œ 것이닀.


Flex

  1. μ»¨ν…Œμ΄λ„ˆμ˜ μžμ‹ μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό λ°°μΉ˜ν•  λ°©ν–₯(row, column, row-reverse, column-reverse)을 μ •ν•œλ‹€.
  2. μ»¨ν…Œμ΄λ„ˆ μ•ˆμ— 크기λ₯Ό μš°μ„ ν•΄ μ•„μ΄ν…œμ„ 우겨 넣을지(nowrap), μ•„μ΄ν…œ 크기λ₯Ό μš°μ„ ν•΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό 자λ₯Όμ§€(wrap)λ₯Ό μ •ν•œλ‹€.
  3. μ»¨ν…Œμ΄λ„ˆ λ‚΄ μ•„μ΄ν…œμ˜ λ ˆμ΄μ•„μ›ƒ(justify-content, align-items, align-content)을 μ •ν•œλ‹€.
  4. μ•„μ΄ν…œμ˜ κ°œλ³„ μœ„μΉ˜(align-self)λ₯Ό μ •ν•œλ‹€.

Grid

  1. λ°°μΉ˜ν•˜κΈ° μ „ λ ˆμ΄μ•„μ›ƒμ— μ‚¬μš©ν•  κ²©μžλ°°μ—΄μ˜ 개수(grid-template-rows, grid-template-columns)λ₯Ό μ„€μ •ν•œλ‹€.
  2. (Aν–‰ Bμ—΄) ~ (Cν–‰ Dμ—΄)의 λ°©μ‹μœΌλ‘œ μ•„μ΄ν…œμ„ λ°°μΉ˜ν•œλ‹€. μ΄λ•Œ grid, grid-area 등을 μ‚¬μš©ν•΄ 행렬을 μ§€μ •ν•˜κ±°λ‚˜ 넀이밍을 λΆ™μ—¬ μ‚¬μš©ν•œλ‹€.

Flex λŠ” 이미 Flex, CSS Flex Layout, CSS display: flex λ₯Ό 톡해 많이 λ‹€λ£¨μ—ˆλ‹ˆ μ°Έκ³ ν•˜λ„λ‘ ν•˜μž.


2. Grid πŸ‘©β€πŸ’»

1. Properties

1. Container Properties

  • grid-template-rows: 생성할 ν–‰μ˜ 개수λ₯Ό μ •μ˜.
  • grid-template-columns: 생성할 μ—΄μ˜ 개수λ₯Ό μ •μ˜.
  • grid-template-areas: ν…μŠ€νŠΈλ‘œ 넀이밍화 μ‹œμΌœ 행열을 μ •μ˜.
  • grid-auto-rows: 주둜 grid-template-columns와 ν•¨κ»˜ μ‚¬μš©ν•΄ μ—΄μ˜ 크기λ₯Ό μžλ™μœΌλ‘œ μ§€μ •ν•˜λ„λ‘ 쑰건을 μ •μ˜.
  • grid-auto-columns: 주둜 grid-template-rows와 ν•¨κ»˜ μ‚¬μš©ν•΄ ν–‰μ˜ 크기λ₯Ό μžλ™μœΌλ‘œ μ§€μ •ν•˜λ„λ‘ 쑰건을 μ •μ˜.
  • grid-auto-flow: Grid λ ˆμ΄μ•„μ›ƒμ„ μ‚¬μš©ν•˜μ§€λ§Œ, 배치λ₯Ό 빈 곡간을 μ΅œμ†Œν™” ν•˜λ„λ‘ μžλ™μœΌλ‘œ λ°°μΉ˜λ˜λ„λ‘ ν•˜λŠ” λ°©λ²•μœΌλ‘œ row, column, dense, row dense, column dense λ“±μ˜ 값을 μ‚¬μš©ν•œλ‹€.
  • row-gap: ν–‰ 간격을 μ •μ˜.
  • column-gap: μ—΄ 간격을 μ •μ˜.


단좕 속성

  • grid-template: grid-template-rows와 grid-template-columns의 단좕 속성.
  • grid: grid-templateκ³Ό grid-auto-rows, grid-auto-columns, grid-auto-flow의 단좕 속성.
  • gap: row-gapκ³Ό column-gap의 단좕 속성.

2. Item Properties

  • grid-row-start/grid-row-end: μ•„μ΄ν…œμ˜ ν–‰μ˜ μ‹œμž‘/끝을 μ •μ˜.
  • grid-column-start/grid-column-end: μ•„μ΄ν…œμ˜ μ—΄μ˜ μ‹œμž‘/끝을 μ •μ˜.

단좕 속성

  • grid-row: grid-row-start와 grid-row-end의 단좕 속성.
  • grid-column: grid-column-start와 grid-column-end의 단좕 속성.
  • grid-area: grid-template-areasμ—μ„œ μ •μ˜ν•œ 넀이밍을 μ§€μ •ν•˜κ±°λ‚˜,
    grid-row-start / grid-column-start / grid-row-end / grid-column-end의 순으둜 μ •μ˜ κ°€λŠ₯ν•œ 단좕 속성.

3. Alignments

μ»¨ν…Œμ΄λ„ˆμ™€ μ•„μ΄ν…œμ˜ λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜ν•˜λŠ” 속성은 flex 와 λ™μΌν•˜λ‹€.

  • justify-content: μ»¨ν…Œμ΄λ„ˆμ˜ main-axis λ°©ν–₯의 content λ‹¨μœ„μ˜ λ ˆμ΄μ•„μ›ƒμ¦ μ •μ˜.
  • align-content: μ»¨ν…Œμ΄λ„ˆμ˜ cross-axis λ°©ν–₯의 content λ‹¨μœ„μ˜ λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜.
  • justify-items: μ»¨ν…Œμ΄λ„ˆ λ‚΄ μ•„μ΄ν…œλ“€μ˜ main-axis λ°©ν–₯의 λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜.
  • align-items: μ»¨ν…Œμ΄λ„ˆ λ‚΄ μ•„μ΄ν…œλ“€μ˜ cross-axis λ°©ν–₯의 λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜.
  • justify-self: κ°œλ³„ μ•„μ΄ν…œμ˜ main-axis λ°©ν–₯의 λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜.
  • align-self: κ°œλ³„ μ•„μ΄ν…œλ“€μ˜ cross-axis λ°©ν–₯의 λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜.

단좕 속성

  • place-content: align-content와 justify-content의 단좕 속성.
  • place-items: align-items와 justify-items의 단좕 속성.
  • place-self: align-self와 justify-self의 단좕 속성.

2. Creation Rules of Grid Templates

1. grid-template-*

κ°€μž₯ 기본적인 grid-template-*을 μ‚¬μš©ν•˜λŠ” ν…œν”Œλ¦Ώ 생성뢀터 μ‹œμž‘ν•΄λ³΄μž.

<div class="container">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: 200px 100px 300px 100px;
}

.item {
  height: 100px;
  background-color: orange;
  border: 1px solid red;
  font: 700 30px 'san-serif';
  text-align: center;
  align-content: center;
}

grid-template-columns-1

200px, 100px, 300px, 100px 4개의 셀을 λ§Œλ“€μ—ˆκ³ , μ°¨λ‘€λŒ€λ‘œ 1, 2, 3을 μ±„μš°κ³  ν•œ 칸이 λΉ„μ—ˆλ‹€. 그리고 λ§ˆμ§€λ§‰ 셀은 μ»¨ν…Œμ΄λ„ˆλ₯Ό λ‹€ μ±„μš°μ§€ λͺ»ν•œ 채 곡간을 λ‚¨κ²¨λ‘μ—ˆλ‹€.

.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: 20% 20% 10% 20%;
}

grid-template-columns-2

λ§ˆμ°¬κ°€μ§€λ‘œ 20%, 20%, 40%, 20% 4개의 셀을 λ§Œλ“€μ—ˆκ³ , μ°¨λ‘€λŒ€λ‘œ 1, 2, 3을 μ±„μš°κ³  ν•œ 칸이 λΉ„μ—ˆλ‹€.

μœ„μ™€ 같이 기본적으둜 Grid λŠ” μž…λ ₯ν•˜λŠ” λŒ€λ‘œ 셀을 μƒμ„±ν•œλ‹€.


그런데 pxμ΄λ‚˜ %λŠ” 크기λ₯Ό μ™„μ „νžˆ κ³ μ •ν•œλ‹€. μ•„μ΄ν…œμ˜ λ‚΄λΆ€ content κ°€ width: 100%와 같은 λ‹¨μœ„λ₯Ό μ‚¬μš©ν•˜λ©΄ 크기가 μ œν•œλ˜μ§€λ§Œ, κ³ μ •λœ 크기λ₯Ό κ°–λŠ” μžμ‹μ΄ 있고 κ·Έ 크기가 μ•„μ΄ν…œ 셀보닀 크닀면 μ•„λž˜μ™€ 같이 λ„˜μΉ˜κ²Œ λœλ‹€.

<div class="container">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">
    <div class="item-large-child">3</div>
  </div>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: 20% 20% 10% 20%;
}

.item-large-child {
  width: 250px;
  height: 50px;
  background-color: blueviolet;
  align-content: center;
}

grid-template-columns-3

Grid 둜 셀은 μƒμ„±ν•˜λ˜, Flex λ₯Ό μ‚¬μš©ν•  λ•Œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‚΄λΆ€ content 에 μ˜ν•΄ 크기가 μœ μ—°ν•˜κ²Œ λŠ˜μ–΄λ‚˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μš°λ¦¬λŠ” frμ΄λΌλŠ” λ‹¨μœ„λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: 1fr 2fr 1fr 2fr;
}

fr의 μ»¨ν…Œμ΄λ„ˆμ˜ 전체 곡간을 μ΅œμ†Ÿκ°’ λΉ„μœ¨λ‘œ μž˜λΌλ‚Έλ‹€. λ”°λΌμ„œ 기본적으둜 1:2:1:2둜 %λ₯Ό μ‚¬μš©ν•  λ•Œμ™€ λ™μΌν•˜μ§€λ§Œ, ν•„μš”ν•  경우 곡간을 더 μ‚¬μš©ν•˜λ„λ‘ λŠ˜μ–΄λ‚œλ‹€.

grid-template-columns-4

2. fit-content

fit-contentν•¨μˆ˜λŠ” min(maximum size, max(minimum size, argument))와 κ°™λ‹€. 예제λ₯Ό μ‚¬μš©ν•΄ μ’€ 더 μ‰½κ²Œ μ„€λͺ…ν•΄λ³΄μž.

<div class="container">
  <div class="item item-1">Lorem, ipsum dolor.</div>
  <div class="item item-2">
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Corrupti
    laborum fugiat nemo libero animi aspernatur ut provident excepturi ex
    unde.
  </div>
  <div class="item item-3">Lorem ipsum dolor sit.</div>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: fit-content(200px) fit-content(300px) 1fr;
}

.item {
  height: 100px;
  background-color: orange;
  border: 1px solid red;
}

fit-content(200px) fit-content(300px) 1fr이 μ˜λ―Έν•˜λŠ” 것은 λ‹€μŒκ³Ό κ°™λ‹€.

  • 첫 번째 ν–‰: μ΅œμ†Ÿκ°’μ€ content 의 크기에 λ§žμΆ”λ˜, λŠ˜μ–΄λ‚  수 μžˆλŠ” μ΅œλŒ“κ°’μ€ 200px 이닀.
  • 두 번째 ν–‰: μ΅œμ†Ÿκ°’μ€ content 의 크기에 λ§žμΆ”λ˜, λŠ˜μ–΄λ‚  수 μžˆλŠ” μ΅œλŒ“κ°’μ€ 300px 이닀.
  • μ„Έ 번째 ν–‰: 남은 곡간을 λΉ„μœ¨λ‘œμ¨ μ¦κ°€ν•œλ‹€. 이 경우 남은 곡간 전체λ₯Ό μ‚¬μš©ν•œλ‹€.

fit-content

κ·Έ κ²°κ³Ό 첫 번째 행은 content 크기 만큼 λ„ˆλΉ„λ₯Ό κ°€μ‘Œκ³ , 두 번째 행은 μ΅œλŒ€λ‘œ λŠ˜μ–΄λ‚˜ 300px 만큼 λ„ˆλΉ„λ₯Ό κ°€μ‘Œκ³ , λ‚˜λ¨Έμ§€ 곡간을 μ„Έ 번째 행이 κ°€μ‘Œλ‹€.

3. repeat

2~3개 정도면 상관 μ—†μ§€λ§Œ ν–‰κ³Ό 열이 λ§Žμ„ 경우 같은 값이 λ°˜λ³΅λœλ‹€λ©΄ 일일히 μ λŠ” λŒ€μ‹  repaet ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

<div class="container">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
  <div class="item item-6">6</div>
  <div class="item item-7">7</div>
  <div class="item item-8">8</div>
  <div class="item item-9">9</div>
  <div class="item item-10">10</div>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: repeat(2, 1fr) 3fr repeat(2, 2fr);
  grid-auto-rows: minmax(auto, 1fr);
}

μœ„ μŠ€νƒ€μΌμ€ 1:1:3:2:2의 μ΅œμ†Ÿκ°’ λΉ„μœ¨λ‘œ 셀을 μƒμ„±ν•œλ‹€. 그리고 ν–‰μ˜ κ°œμˆ˜κ°€ μ •ν•΄μ‘Œμ„ λ•Œ, 셀을 μ΄ˆκ³Όν•˜λŠ” μ•„μ΄ν…œμ€ Grid κ°€ 행을 μΆ”κ°€ν•΄ λ°°μΉ˜μ‹œν‚¨λ‹€. μ΄λ•Œ ν–‰μ˜ λ†’μ΄λŠ” 기본적으둜 같은 ν–‰μ˜ μ•„μ΄ν…œ 쀑 높이가 κ°€μž₯ 큰 μ•„μ΄ν…œμ„ ν¬ν•¨ν•˜λŠ” 크기둜 μ§€μ •λœλ‹€.

grid-template-columns와 grid-template-rowsλ₯Ό λͺ¨λ‘ μ •μ˜ν•΄ 셀을 μ „λΆ€ λͺ…μ‹œμ μœΌλ‘œ 미리 μƒμ„±ν•˜μ§€ μ•Šκ³ , ν•„μš”μ‹œ 행이 μΆ”κ°€λ˜μ§€λ§Œ 높이값을 μ§€μ •ν•˜κ³  싢을 κ²½μš°λŠ” grid-auto-rows에 쑰건을 μ§€μ •ν•˜λ©΄ λœλ‹€.

repeat

  • grid-auto-rows: 150px: λͺ¨λ“  ν–‰μ˜ λ†’μ΄λŠ” 150px 둜 κ³ μ •λœλ‹€. μ•„μ΄ν…œμ˜ 높이가 쑰건값보닀 크면 κ²ΉμΉ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜λ―€λ‘œ μ£Όμ˜ν•΄μ•Όν•œλ‹€.
  • grid-auto-rows: minmax(150px, 200px): μ΅œμ†Œ 150px 의 높이λ₯Ό κ°€μ§€λ˜, 좔가적인 높이가 ν•„μš”ν•  경우 λͺ¨λ“  행이 200px κΉŒμ§€ λŠ˜μ–΄λ‚œλ‹€.
  • grid-auto-rows: minmax(auto, 1fr): 기본값을 μ‚¬μš©ν•˜λ˜, 좔가적인 높이가 ν•„μš”ν•  경우 λͺ¨λ“  행이 같은 λΉ„μœ¨λ‘œ ν•„μš”ν•œ 만큼 λŠ˜μ–΄λ‚œλ‹€.
  • grid-auto-rows: minmax(100px, auto): μ΅œμ†Œ 150px 의 높이λ₯Ό κ°€μ§€λ˜, 좔가적인 높이가 ν•„μš”ν•  경우 ν•„μš”ν•œ ν–‰λ§Œ λŠ˜μ–΄λ‚œλ‹€.

μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Όν•  것이 min λ˜λŠ” max 에 autoκ°€ μ•„λ‹Œ 값을 μ‚¬μš©ν•  λ•ŒλŠ” νŠΉμ • ν–‰μ˜ λ†’μ΄λ§Œ μ»€μ§€κ±°λ‚˜ μž‘μ•„μ§€λŠ” 게 μ•„λ‹ˆλΌ λͺ¨λ“  행에 μ μš©λœλ‹€λŠ” 점이닀.

4. auto-fill, auto-fit

1 ) Difference between auto-fill and auto-fit

repeat ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ, 생성할 κ°œμˆ˜μ— auto-fillκ³Ό auto-fit을 μ‚¬μš©ν•˜λ©΄ μƒμ„±λ˜λŠ” μ…€ 자체λ₯Ό μœ μ—°ν•˜κ²Œ 관리할 수 μžˆλ‹€. auto-fill λ˜λŠ” auto-fit을 μ‚¬μš©ν•  λ•ŒλŠ” 주둜 minmax ν•¨μˆ˜μ™€ ν•¨κ»˜ μ‚¬μš©ν•œλ‹€. λ„ˆλΉ„λ₯Ό pxκ³Ό 같이 κ³ μ •κ°’μœΌλ‘œ 쀄 경우 auto-fillκ³Ό auto-fit이 μž‘λ™ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

auto-fillκ³Ό auto-fit의 μœ μΌν•œ 차이점은 ①단일 행에 ⑑열을 μΆ”κ°€λ‘œ 생성할 수 μžˆλŠ” μ—¬μœ  곡간이 λ°œμƒν•  λ•ŒλΏμ΄λ‹€. 단일 행이 μ•„λ‹Œ 2ν–‰ 이상일 κ²½μš°λŠ” 이미 1ν–‰μ—μ„œ 생성 κ°€λŠ₯ν•œ μ—΄μ˜ 곡간을 λͺ¨λ‘ μ‚¬μš©ν•˜μ˜€κΈ° λ•Œλ¬Έμ— 좔가적인 λ³€ν™”κ°€ 생기지 μ•ŠλŠ”λ‹€.

<div class="container">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: repeat(auto-fill, minmax(150px, 220px));
}
  • 1000 / 220 = 4.54...이닀. 즉, μ΅œλŒ€ 4개의 열을 λ§Œλ“€ 수 μžˆλ‹€.
  • 1000 / 150 = 6.66...이닀. 즉, μ΅œλŒ€ 6개의 열을 λ§Œλ“€ 수 μžˆλ‹€.

기본적으둜 Grid 의 μ•„μ΄ν…œμ€ μ΅œλŒ€ν•œ λŠ˜μ–΄λ‚˜λ €ν•˜κΈ° λ•Œλ¬Έμ— max의 값을 μš°μ„  μ‚¬μš©ν•΄ 열을 μƒμ„±ν•œλ‹€. λ”°λΌμ„œ, 220px μ—΄ 4개λ₯Ό λ§Œλ“€κ³  λ‚¨λŠ” 곡간은 μ—¬λ°±μœΌλ‘œ λ‘”λ‹€.

auto-fill-1


λ‹€λ₯Έ 쑰건은 κ·ΈλŒ€λ‘œ 두고 auto-fill만 auto-fit으둜 λ°”κΏ”λ³΄μž. λ§ˆμ°¬κ°€μ§€λ‘œ Grid 의 μ•„μ΄ν…œμ€ μ΅œλŒ€ν•œ λŠ˜μ–΄λ‚˜κΈ° μœ„ν•΄ max값을 μ‚¬μš©ν•΄ 220px 열을 λ§Œλ“ λ‹€. ν•˜μ§€λ§Œ 열을 더 λ§Œλ“€ 수 μžˆλŠ” μ—¬μœ  곡간이 μžˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ—˜λ¦¬λ¨ΌνŠΈ κ°œμˆ˜μ— 맞좰 λ”± 3개만 μƒμ„±ν•œλ‹€.

.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: repeat(auto-fit, minmax(150px, 220px));
}

auto-fit-1

λŒ€λΆ€λΆ„μ˜ λΈ”λ‘œκ·Έμ—μ„œ auto-fill은 단일 ν–‰μΌλ•Œ 여백을 내버렀두고, auto-fit을 크기λ₯Ό 늘렀 남은 곡간을 μ±„μš΄λ‹€κ³  μ„€λͺ…ν•œλ‹€. ν•˜μ§€λ§Œ μœ„ κ²°κ³Όλ₯Ό 보면 μ „ν˜€ λ‹€λ₯΄λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. μœ„ 두 κ²°κ³Όλ₯Ό 톡해 μš°λ¦¬λŠ” λ‹€μŒκ³Ό 같은 결둠을 내릴 수 μžˆλ‹€.

auto-fillκ³Ό auto-fit이 μ‚¬μš©λ˜λŠ” μœ„μΉ˜λ₯Ό μƒκ°ν•΄λ³΄μž. grid-template-columns의 repeatν•¨μˆ˜μ—μ„œ column 을 λͺ‡ 개 생성할지λ₯Ό μ§€μ •ν•˜λŠ” μžλ¦¬μ— μ‚¬μš©ν•œλ‹€. λ”°λΌμ„œ 이 말은 μƒμ„±λ˜λŠ” ν–‰μ˜ 크기λ₯Ό λŠ˜λ¦¬κ±°λ‚˜ μ€„μ΄λŠ”κ±Έ κ²°μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 개수λ₯Ό κ²°μ •ν•˜λŠ” μ‘°κ±΄κ°’μ˜ μžλ¦¬λΌλŠ” 것이닀. ν–‰μ˜ 크기λ₯Ό λŠ˜λ¦¬κ±°λ‚˜ μ€„μ΄λŠ”κ±Έ κ²°μ •ν•˜λŠ” 것은 repeatν•¨μˆ˜μ˜ 두 번째 parameter 인 minmax(150px, 220px)이닀.

  • auto-fill: μ—˜λ¦¬λ¨ΌνŠΈ κ°œμˆ˜μ™€ 상관 없이 Grid μ»¨ν…Œμ΄λ„ˆλ₯Ό μ±„μšΈ 수 μžˆλŠ” 만큼 grid-template-columnsλ₯Ό 계속 μ±„μ›Œfill λ„£λŠ”λ‹€.
  • auto-fit: μ—˜λ¦¬λ¨ΌνŠΈ κ°œμˆ˜μ— λ”± 맞게fit grid-template-columnsλ₯Ό μƒμ„±ν•œλ‹€.


λ§Œμ•½ minmax(150px, 220px)λ₯Ό minmax(150px, 400px)둜 바꿔보면 μ–΄λ–¨κΉŒ?

  • 1000 / 400 = 2.5λ‹€. 즉, μ΅œλŒ€ 2개의 열을 λ§Œλ“€ 수 μžˆλ‹€.

이 경우 이미 첫 번째 ν–‰μ—μ„œ μ—΄μ˜ ꡬ쑰가 κ²°μ •λ˜κ³  두 번째 행이 μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— auto-fillκ³Ό auto-fit은 2개의 ν–‰κ³Ό 400px μ—΄ 2개λ₯Ό λ§Œλ“€μ–΄ 2x2 MatrixλΌλŠ” λ™μΌν•œ κ²°κ³Όλ₯Ό 보여쀀닀.

auto-fill-2


2 ) Columns Size with Responsive Units fr, auto

그런데 μœ„ κ²°κ³Όμ—μ„œ ꡬ쑰적인 차이점은 μ‘΄μž¬ν•˜μ§€λ§Œ, μ‹œκ°μ μΈ 차이점은 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. μ€‘μš”ν•œ 것은 개발자 λˆˆμ—λ§Œ λ³΄μ΄λŠ” ꡬ쑰적인 차이가 μ•„λ‹ˆλΌ μ‚¬μš©μžμ—κ²Œ λ³΄μ΄λŠ” μ‹œκ°μ μΈ 차이이닀. 이 μ‹œκ°μ μΈ 차이λ₯Ό λ§Œλ“€μ–΄λ‚΄κΈ° μœ„ν•΄ repeatν•¨μˆ˜μ˜ 두 번째 νŒŒλΌλ―Έν„°μΈ grid-template-columns의 크기λ₯Ό κ³ μ •λœ λ²”μœ„κ°’μ΄ μ•„λ‹Œ frμ΄λ‚˜ auto와 같은 μœ μ—°ν•œ λ‹¨μœ„λ₯Ό μ‚¬μš©ν•  것이닀.

.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}

μš°μ„  minmax(150px, 1fr) 이 뢀뢄을 ν•΄μ„ν•΄λ³΄μž. μœ„μ—μ„œ 기본적으둜 Grid 의 μ•„μ΄ν…œμ€ μ΅œλŒ€ν•œ λŠ˜μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— max의 값을 μš°μ„  μ‚¬μš©ν•΄ 열을 μƒμ„±ν•œλ‹€κ³  ν–ˆλ‹€. ν•˜μ§€λ§Œ frμ΄λ‚˜ auto와 같은 값은 auto-fill λ§ŒνΌμ΄λ‚˜ μœ μ—°ν•œ 값이닀. 즉, auto-fill이 행을 생성할 개수λ₯Ό μ•Œ 수 없듯이, frμ΄λ‚˜ auto와 같은 λ‹¨μœ„ μ—­μ‹œ μ–΄λ–€ λΉ„μœ¨λ‘œ 생성할지에 λŒ€ν•œ 기쀀이 μ—†λ‹€λŠ” 것이닀.

λ”°λΌμ„œ max값을 μš°μ„  μ‚¬μš©ν•΄ 열을 생성할 μˆ˜κ°€ μ—†λ‹€λŠ” 것이닀.

μ—¬κΈ°μ„œ μœ μΌν•˜κ²Œ 기쀀값을 μž‘μ„ 수 μž‡λŠ” 것이 λ°”λ‘œ min값인 150px λ‹€. 그러면 이 값을 μ‚¬μš©ν•΄ λͺ‡ 개의 열을 생성할지 auto-fill 값을 λ¨Όμ € κ²°μ •ν•΄μ•Όν•œλ‹€. 1000 / 150 = 6.66... μ΄λ―€λ‘œ μ΅œλŒ€ 6개의 열을 μƒμ„±ν•˜κ³  100px 의 μ—¬μœ  곡간이 λ‚¨λŠ”λ‹€.

이제 auto-fill 은 6 으둜 κ²°μ •λ˜μ—ˆλ‹€. λ”°λΌμ„œ μœ„ μŠ€νƒ€μΌμ„ λ‹€μŒκ³Ό 같아진닀.

.container {
  grid-template-columns:
    minmax(150px, 1fr) minmax(150px, 1fr) minmax(150px, 1fr)
    minmax(150px, 1fr) minmax(150px, 1fr) minmax(150px, 1fr);
}

그러면 이제 Grid 의 μ•„μ΄ν…œμ€ μ΅œλŒ€ν•œ λŠ˜μ–΄λ‚œλ‹€κ³  ν–ˆλ‹€. λͺ¨λ“  열이 150pxμ—μ„œ μ‹œμž‘ν•΄ μ—¬μœ  곡간 만큼 1fr의 λΉ„μœ¨λ‘œ λŠ˜μ–΄λ‚˜λŠ” 것이닀. 즉, 남은 여백을 λͺ¨λ‘ μ‚¬μš©ν•΄ 166.67px μ—΄ 6개λ₯Ό λ§Œλ“ λ‹€.

auto-fill-3


μ΄λ²ˆμ—λ„ λ‹€λ₯Έ 쑰건은 κ·ΈλŒ€λ‘œ 두고 auto-fill만 auto-fit으둜 λ°”κΏ”λ³΄μž.

.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

auto-fit은 μ—˜λ¦¬λ¨ΌνŠΈ κ°œμˆ˜μ— λ”± 맞게 columns λ₯Ό μƒμ„±ν•œλ‹€κ³  ν–ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ auto-fit 은 이미 3 으둜 κ²°μ •λ˜μ—ˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€. λ”°λΌμ„œ μœ„ μŠ€νƒ€μΌμ€ λ‹€μŒκ³Ό 같아진닀.

.container {
  grid-template-columns: minmax(150px, 1fr) minmax(150px, 1fr) minmax(150px, 1fr);
}

λ§ˆμ°¬κ°€μ§€λ‘œ λͺ¨λ“  열이 150pxμ—μ„œ μ‹œμž‘ν•΄ μ—¬μœ  곡간 만큼 1fr의 λΉ„μœ¨λ‘œ λŠ˜μ–΄λ‚˜λ―€λ‘œ 남은 여백을 λͺ¨λ‘ μ‚¬μš©ν•΄ 333.34px μ—΄ 3개λ₯Ό λ§Œλ“ λ‹€.

auto-fit-2


μœ„μ—μ„œ μ„€λͺ…ν•œ λͺ¨λ“  것을 λ‹€μ‹œ ν•œ 번 μ •λ¦¬ν•΄λ³΄μž.

Rule 1) grid-template-columns 에 μ‚¬μš©λ˜λŠ” repeat ν•¨μˆ˜μ˜ 첫 번째 νŒŒλΌλ―Έν„° columns 의 개수

  • auto-fill: μ—˜λ¦¬λ¨ΌνŠΈ κ°œμˆ˜μ™€ 상관 없이 Grid μ»¨ν…Œμ΄λ„ˆλ₯Ό μ±„μšΈ 수 μžˆλŠ” 만큼 grid-template-columnsλ₯Ό 계속 μ±„μ›Œ(fill) λ„£λŠ”λ‹€.
  • auto-fit: μ—˜λ¦¬λ¨ΌνŠΈ κ°œμˆ˜μ— λ”± 맞게(fit) grid-template-columnsλ₯Ό μƒμ„±ν•œλ‹€.


Rule 2) grid-template-columns 에 μ‚¬μš©λ˜λŠ” repeat ν•¨μˆ˜μ˜ 두 번째 νŒŒλΌλ―Έν„° columns 의 크기

columns 의 크기가 μœ μ˜λ―Έν•œ 차이λ₯Ό 가지기 μœ„ν•΄μ„œλŠ” max값에 fr, auto와 같은 μœ μ—°ν•œ λ‹¨μœ„λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  λ•Œ 뿐이닀.

  • auto-fill: 생성할 columns 의 개수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ min값을 μ‚¬μš©ν•΄ μ»¨ν…Œμ΄λ„ˆμ— 생성할 grid-template-columns의 개수λ₯Ό κ΅¬ν•œ λ‹€μŒ maxκ°’μœΌλ‘œ 남은 여백을 λͺ¨λ‘ μ‚¬μš©ν•΄ 크기λ₯Ό ν‚€μš΄λ‹€.
  • auto-fit: 생성할 columns 의 κ°œμˆ˜κ°€ μ—˜λ¦¬λ¨ΌνŠΈμ˜ κ°œμˆ˜μ— μ˜ν•΄ 이미 정해진닀. 이후 λ™μΌν•˜κ²Œ maxκ°’μœΌλ‘œ 남은 여백을 λͺ¨λ‘ μ‚¬μš©ν•΄ 크기λ₯Ό ν‚€μš΄λ‹€.

3. Creation Rules of Grid Templates Areas

μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ Creation Rules of Grid Templates은 μ„œλ‘œ λ‹€λ₯Έ μ‚¬μ΄μ¦ˆλ₯Ό κ°–λŠ” μ•„μ΄ν…œμ„ μ—¬λŸ¬ ν–‰κ³Ό 열에 λ°°μΉ˜ν•  λ•Œ μ •ν™•ν•œ 격자 ꡬ쑰가 ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄ Flex λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ Responsive ν•œ λ””μžμΈμ„ λ§Œλ“€κΈ°λ„ 더 쉽닀.

Grid 의 κ°€μž₯ 큰 νŠΉμ§•μ€ order 속성을 ν•˜μš©ν•˜μ§€ μ•Šκ³ λ„ μ›ν•˜λŠ” λ ˆμ΄μ•„μ›ƒ μœ„μΉ˜μ— λ°°μΉ˜μ‹œν‚¬ 수 μžˆλ‹€λŠ” 것이닀. μ•„μ΄ν…œμ— grid-row, grid-column, grid-area 속성을 μ‚¬μš©ν•΄ μ—˜λ¦¬λ¨ΌνŠΈμ˜ μˆœμ„œμ™€ 상관 없이 자유둭게 λ°°μΉ˜κ°€ κ°€λŠ₯ν•˜λ‹€. grid-template의 μ˜μ—­μ„ μ§€μ •ν•˜κ³  μ¦‰μ‹œ λ°°μΉ˜μ‹œν‚€λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

1. Designate the Start to End of Items

<div class="container">
  <div class="item item-1">1</div>
  <div class="item item-2">2</div>
  <div class="item item-3">3</div>
  <div class="item item-4">4</div>
  <div class="item item-5">5</div>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template: repeat(4, minmax(100px, 1fr)) / repeat(4, 1fr);
}

.item {
  background-color: orange;
  border: 1px solid red;
  font: 700 30px 'san-serif';
  text-align: center;
  align-content: center;
}

μ»¨ν…Œμ΄λ„ˆμ˜ ν…œν”Œλ¦Ώμ΄ μ΅œμ†Œ 높이λ₯Ό 100px 둜 지정할 것이기 λ•Œλ¬Έμ— μ•„μ΄ν…œμ˜ λ†’μ΄λŠ” 기본값인 auto둜 λ˜λŒλ €μ€€λ‹€.

grid-column-row-1

아무것도 ν•˜μ§€ μ•Šμ€ μƒνƒœμ˜ 배치 λͺ¨μŠ΅μ΄λ‹€. 이제 grid-row, grid-column을 μ‚¬μš©ν•΄ 자유둭게 λ°°μΉ˜ν•΄λ³Ό 것이닀. λ°°μΉ˜ν•  λ•Œ ν¬μ§€μ…˜ 지정은 μœ„ μ‚¬μ§„μ—μ„œ λ³Ό 수 μžˆλ“―μ΄ Cell이 기쀀이 μ•„λ‹ˆκ³  각 Line이 기쀀이 되며, μ–‘μˆ˜μ™€ 음수λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλ‹€.

  • 각 μ•„μ΄ν…œμ„ κ°μ‹ΈλŠ” μ‚¬κ°ν˜• λ„€ λ³€μ˜ ν–‰κ³Ό 열을 μ§€μ •ν•˜λŠ” 것이기 λ•Œλ¬Έμ— μˆœμ„œλŠ” 상관이 μ—†λ‹€.
.item-1 {
  grid-row: 1 / 2;
  grid-column: 2 / 3;
}
.item-1 {
  grid-row: 2 / 1;
  grid-column: 3 / 2;
}

grid-area-1

  • tableμ—˜λ¦¬λ¨ΌνŠΈλ₯Ό μ‚¬μš©ν•˜λ“― span을 지정할 μˆ˜λ„ μžˆλ‹€.
.item-2 {
  grid-row: 3 / 5;
  grid-column: 2 / 4;
}
.item-2 {
  grid-row: 3 / span 2;
  grid-column: 2 / span 2;
}

grid-area-2


전체 μŠ€νƒ€μΌ μ˜μ—­μ„ μ™„μ„±μ‹œμΌœλ³΄μž.

.item-1 {
  grid-row: 1 / 2;
  grid-column: 2 / 3;
}
.item-2 {
  grid-row: 3 / 5;
  grid-column: 2 / 4;
}
.item-3 {
  grid-row: -1 / -2;
  grid-column: -1 / -2;
}
.item-4 {
  grid-row: 1 / -1;
  grid-column: 1 / 2;
}
.item-5 {
  grid-row: 2 / 3;
  grid-column: 3 / 5;
}

그리고 이 grid-row, grid-columnλŠ” grid-areaλΌλŠ” 단좕 μ†μ„±μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

grid-row-start / grid-column-start / grid-row-end / grid-column-end 의 단좕 μ†μ„±μœΌλ‘œ μ‚¬μš©

.item-1 {
  grid-area: 1 / 2 / 2 / 3;
}
.item-2 {
  grid-area: 3 / 2 / 5 / 4;
}
.item-3 {
  grid-area: -1 / -1 / -2 / -2;
}
.item-4 {
  grid-area: 1 / 1 / -1 / 2;
}
.item-5 {
  grid-area: 2 / 3 / 3 / 5;
}

grid-area-3

2. Named-Position

grid-areaλŠ” 두 가지 λ°©λ²•μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. 첫 번째 방법은 μœ„μ—μ„œμ™€ 같이 grid-row, grid-column의 단좕 μ†μ„±μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것이고, 두 번째 방법은 μ»¨ν…Œμ΄λ„ˆμ— grid-template-columns, grid-template-rowsλ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  grid-template-areasλ₯Ό μ‚¬μš©ν•΄ 넀이밍 ν…œν”Œλ¦Ώμ„ μƒμ„±ν•˜κ³ , 이 넀이밍을 μ§€μ •ν•˜λŠ” 것이닀.

.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-areas:
    "four one . ."
    "four . five five"
    "four two two ."
    "four two two three";
  grid-auto-rows: minmax(100px, 1fr);
}

.item {
  background-color: orange;
  border: 1px solid red;
  font: 700 30px 'san-serif';
  text-align: center;
  align-content: center;
}

.item-1 {
  grid-area: one;
}
.item-2 {
  grid-area: two;
}
.item-3 {
  grid-area: three;
}
.item-4 {
  grid-area: four;
}
.item-5 {
  grid-area: five;
}

grid-area-3


그리고 넀이밍은 주둜 λ‹€μŒκ³Ό 같이 넓은 μ˜μ—­μ˜ 전체 λ ˆμ΄μ•„μ›ƒμ„ ꡬ성할 λ•Œ μ ν•©ν•˜λ‹€.

<div class="container">
  <header class="item">Header</header>
  <nav class="item">Navigation</nav>
  <aside class="item">Aside</aside>
  <main class="item">
    <section>
      <div class="item item-1">1</div>
    </section>
  </main>
  <footer class="item">Footer</footer>
</div>
.container {
  display: grid;
  width: 1000px;
  background-color: aquamarine;
  grid-template-columns: 200px 1fr;
  grid-template-areas:
    "header header"
    "aside main"
    "footer footer";
}

.item {
  background-color: orange;
  border: 1px solid red;
  font: 700 30px 'san-serif';
  text-align: center;
  align-content: center;
}

header {
  grid-area: header;
}
nav {
  grid-area: nav;
}
aside {
  grid-area: aside;
}
main {
  grid-area: main;
}
footer {
  grid-area: footer;
}

grid-area-4


main의 ꡬ쑰가 λ°”λ€Œκ±°λ‚˜ content κ°€ λŠ˜μ–΄λ‚˜λ„ 항상 같은 λ ˆμ΄μ•„μ›ƒμ„ μœ μ§€ν•  수 μžˆλ‹€.

<div class="container">
  <header class="item">Header</header>
  <nav class="item">Navigation</nav>
  <aside class="item">Aside</aside>
  <main class="item">
    <section>
      <div class="item item-1">1</div>
      <div class="item item-2">2</div>
      <div class="item item-3">3</div>
    </section>
    <section>
      <div class="item item-4">4</div>
      <div class="item item-5">5</div>
    </section>
  </main>
  <footer class="item">Footer</footer>
</div>

grid-area-5




Reference

  1. β€œGrid.” MDN Web Docs. Jul. 18, 2023, accessed Mar. 25, 2024, MDN - Grid.
  2. β€œFlex.” MDN Web Docs. Jul. 18, 2023, accessed Mar. 25, 2024, MDN - Flex.