Grid Layout

1. κ°œμš”

ν˜„λŒ€ μ›Ή λ ˆμ΄μ•„μ›ƒμ„ λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” κ°€μž₯ 큰 ν”„λ‘œνΌν‹°κ°€ λ°”λ‘œ Grid이닀. λ‚˜μ˜ 경우 전체적인 틀을 Grid둜 작고 μž‘μ€ λΆ€λΆ„ 뢀뢄을 Flexλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€. 사싀 μ§€κΈˆμ€ μž‘μ€ 뢀뢄도 Flexλ³΄λ‹€λŠ” Gridλ₯Ό μ‚¬μš©ν•˜λŠ” νŽΈμ΄λ‹€.

이전에 올린 Flexbox Layout은 ν•œ λ°©ν–₯ λ ˆμ΄μ•„μ›ƒ μ‹œμŠ€ν…œμ΄λΌλ©΄ Grid Layout은 두 λ°©ν–₯ λ ˆμ΄μ•„μ›ƒ μ‹œμŠ€ν…œμ΄λ‹€. λ”°λΌμ„œ Flex보닀 더 볡작적인 λ ˆμ΄μ•„μ›ƒ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.


2. μš©μ–΄ 정리

grid layout
  • κ·Έλ¦¬λ“œ μ»¨ν…Œμ΄λ„ˆ(Grid Container): display: gridλ₯Ό μ μš©ν•˜λŠ”, Grid의 전체 μ˜μ—­μ΄λ‹€. Grid μ»¨ν…Œμ΄λ„ˆ μ•ˆμ˜ μš”μ†Œλ“€μ΄ Grid κ·œμΉ™μ˜ 영ν–₯을 λ°›μ•„ μ •λ ¬λœλ‹€.

  • κ·Έλ¦¬λ“œ μ•„μ΄ν…œ(Grid Item): Grid μ»¨ν…Œμ΄λ„ˆμ˜ μžμ‹ μš”μ†Œλ“€μ΄λ‹€. κ·Έλ¦¬λ“œ μ•„μ΄ν…œλ“€μ΄ Grid κ·œμΉ™μ— μ˜ν•΄ λ°°μΉ˜λœλ‹€.

  • κ·Έλ¦¬λ“œ νŠΈλž™(Grid Track): Grid의 ν–‰(Row) λ˜λŠ” μ—΄(Column)

  • κ·Έλ¦¬λ“œ μ…€(Grid Cell): Grid의 ν•œ 칸을 κ°€λ₯΄ν‚¨λ‹€. <div>같은 μ‹€μ œ html μš”μ†ŒλŠ” Grid μ•„μ΄ν…œμ΄κ³ , 이런 Grid μ•„μ΄ν…œ ν•˜λ‚˜κ°€ λ“€μ–΄κ°€λŠ” 'κ°€μƒμ˜ μΉΈ(ν‹€)'이 Grid 셀이닀.

  • κ·Έλ¦¬λ“œ 라인(Grid Line): Grid 셀을 κ΅¬λΆ„ν•˜λŠ” 선이닀.

  • κ·Έλ¦¬λ“œ 번호(Grid Number): Grid 라인의 각 λ²ˆν˜Έμ΄λ‹€.

  • κ·Έλ¦¬λ“œ κ°­(Grid Gap): Grid μ…€ μ‚¬μ΄μ˜ 간격이닀.

  • κ·Έλ¦¬λ“œ μ˜μ—­(Grid Area): Grid 라인으둜 λ‘˜λŸ¬μ‹ΈμΈ μ‚¬κ°ν˜• μ˜μ—­μœΌλ‘œ, κ·Έλ¦¬λ“œ μ…€μ˜ 집합이닀.


3. Usage

Grid κ·œμΉ™μ„ μ μš©ν•˜κ³ μž ν•˜λŠ” μš”μ†Œλ“€μ˜ λΆ€λͺ¨μ— display: grid;λ₯Ό μ μš©μ„ ν•˜λ©΄ λœλ‹€.

display: inline-grid도 μžˆλ‹€. μ•„μ΄ν…œμ˜ λ°°μΉ˜μ™€ 관련이 μžˆλ‹€κ°€ λ³΄λ‹€λŠ”, μ»¨ν…Œμ΄λ„ˆκ°€ μ£Όλ³€ μš”μ†Œλ“€κ³Ό μ–΄λ–»κ²Œ μ–΄μš°λŸ¬μ§ˆμ§€ κ²°μ •ν•˜λŠ” 값이닀. inline-gridλŠ” inline-block처럼 λ™μž‘ν•œλ‹€.


4. κ·Έλ¦¬λ“œ ν˜•νƒœ μ •μ˜

4-1. grid-template-columns

grid-template-columns ν”„λ‘œνΌν‹°λŠ” grid columns의 배치λ₯Ό μ§€μ •ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.

μœ„μ˜ μ½”λ“œλŠ” grid-container둜 감싸져 μžˆλŠ” μžμ‹μš”μ†Œλ“€μ„ κ·Έλ¦¬λ“œλ‘œ λ°°μΉ˜ν•˜κ³  column을 3μ—΄λ‘œ λ§Œλ“€κ³  첫번째 column λΆ€ν„° 100px, 200px, 300px만큼의 크기둜 λ§Œλ“€κ² λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

또 λ‹€λ₯Έ μ‚¬μš©λ²•μ„ 보자.

μœ„μ˜ μ½”λ“œμ—μ„œ fr은 fraction으둜 숫자 λΉ„μœ¨λŒ€λ‘œ κ·Έλ¦¬λ“œ νŠΈλž™μ˜ 크기λ₯Ό λ‚˜λˆˆλ‹€. 즉 1fr 2fr 2fr은 1:2:2 λΉ„μœ€μΌ 3개의 column을 λ§Œλ“€κ² λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

μœ„μ˜ μ½”λ“œμ™€ 같이 pxκ³Ό frλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€. %λ‘œλ„ 크기λ₯Ό μ§€μ •ν•  수 μžˆλ‹€.

grid-template-columns

4-2. grid-template-rows

grid-template-columns은 μ—΄(column)의 배치라면 grid-template-rows은 ν–‰(row)의 λ°°μΉ˜μ΄λ‹€. κ·Έ μ™Έμ˜ λ‚΄μš©μ€ κ°™λ‹€.

grid-template-rows

4-3. repeat ν•¨μˆ˜

grid-template-columns, grid-template-rows의 ν”„λ‘œνΌν‹°κ°’μœΌλ‘œ μ‚¬μš©λ˜λŠ” repeatλŠ” λ°˜λ³΅λ˜λŠ” 값을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλŠ” ν•¨μˆ˜μ΄λ‹€.

μ‚¬μš©λ²• grid-template-columns: repeat(반볡횟수, λ°˜λ³΅κ°’)

μœ„μ˜ 두 μ½”λ“œλŠ” 같은 κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.


4-4. minmax ν•¨μˆ˜

μ΅œμ†Ÿκ°’κ³Ό μ΅œλŒ“κ°’μ„ μ§€μ •ν•  수 μžˆλŠ” ν•¨μˆ˜μ΄λ‹€.

minmax(100px, auto)의 μ˜λ―ΈλŠ” 'μ΅œμ†Œν•œ 100px, μ΅œλŒ€λŠ” μžλ™μœΌλ‘œ(auto) λŠ˜μ–΄λ‚˜κ²Œ ν•œλ‹€.'이닀. 아무리 λ‚΄μš©μ˜ 양이 적더라도 μ΅œμ†Œν•œμ˜ 높이 100px은 ν™•λ³΄λ˜κ³ , λ‚΄μš©μ΄ λ§Žμ•„ 100px이 λ„˜μ–΄κ°€λ©΄ μ•Œμ•„μ„œ λŠ˜μ–΄λ‚˜λ„λ‘ ν•œλ‹€.

minmax

4-5. auto-fill, auto-fit

auto-fillκ³Ό auto-fit은 column의 개수λ₯Ό 미리 μ •ν•˜μ§€ μ•Šκ³  μ„€μ •λœ λ„ˆλΉ„κ°€ ν—ˆμš©ν•˜λŠ” ν•œ μ΅œλŒ€ν•œ 셀을 μ±„μš΄λ‹€.

auto-fillκ³Ό auto-fit의 μ°¨μ΄λŠ” λ‚¨λŠ” 곡간을 μ±„μš°μ§€ μ•ŠλŠλƒ μ±„μš°λƒμ΄λ‹€. auto-fill은 남은 곡간을 μ±„μš°μ§€ μ•Šκ³  auto-fit은 남은 곡간을 μ±„μš΄λ‹€.

auto-fill, auto-fit

λ‚΄κ°€ μƒκ°ν•œ κ²°κ³Όκ°€ λ‹€λ₯΄λ‹€. μœ„λŠ” fill이기 λ•Œλ¬Έμ— μ˜ˆμƒλœ κ²°κ³Όμ΄μ§€λ§Œ μ•„λž˜λŠ” fit으둜 정해도 2번째 열이 λͺ¨λ“  λ„ˆλΉ„λ₯Ό μ°¨μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€. μ™€κΉŒ?


5. κ°„κ²©λ§Œλ“€κΈ°

κ·Έλ¦¬λ“œ μ…€ μ‚¬μ΄μ˜ 간격을 섀정을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” row-gap, column-gap ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•œλ‹€. 각각 row(μ—΄), column(ν–‰)의 간격을 μ§€μ •ν•˜λ©° gap ν”„λ‘œνΌν‹°λŠ” row-gapκ³Ό column-gapλ₯Ό μ§€μ •ν•  수 μžˆλŠ” shorthand이닀.

μ‚¬μš©λ²• gap: row-gap, column-gap row-gapκ³Ό column-gap이 κ°™μœΌλ©΄ ν•˜λ‚˜λ§Œ 적어도 μ—΄κ³Ό 행에 λͺ¨λ‘ 적용이 λœλ‹€.

gap

6. κ·Έλ¦¬λ“œ ν˜•νƒœλ₯Ό μžλ™μœΌλ‘œ μ •μ˜

grid-template-columnsλ˜λŠ” grid-template-rows의 ν†΅μ œλ₯Ό λ²—μ–΄λ‚œ μœ„μΉ˜μ— μžˆλŠ” νŠΈλž™μ˜ 크기λ₯Ό μ§€μ •ν•˜λŠ” 속성이닀.

μ•„λž˜μ˜ μ½”λ“œλ₯Ό 보자.

ν•΄λ‹Ή cssλŠ” 3번째 μ—΄κΉŒμ§€λ§Œ νŠΈλ ‰μ˜ 크기λ₯Ό μ§€μ •ν•˜κ³  μžˆλ‹€. ν•˜μ§€λ§Œ λ§Œμ•½ 4번째 μ΄μƒμ˜ 열이 생길 경우 μ§€μ •ν•΄μ£Όμ§€ μ•Šμ•„ λ‹€λ₯Έ 크기의 νŠΈλ ‰μ΄ 생길 수 μžˆλ‹€. μ΄λ•Œ 4번째 μ΄μƒμ˜ 열이 λ°”λ‘œ ν†΅μ œλ₯Ό λ²—μ–΄λ‚œ μœ„μΉ˜μ— μžˆλŠ” νŠΈλ ‰μ΄λ‹€. 즉, μš°λ¦¬κ°€ μƒμ„±ν•˜κ³ μž ν•˜λŠ” columnκ³Ό row의 개수λ₯Ό λͺ¨λ₯Ό λ•Œ grid-template-columnsλ˜λŠ” grid-template-rows ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€. μ΄λ•Œ λͺ¨λ“  columnκ³Ό rowλŠ” ν†΅μ œλ₯Ό λ²—μ–΄λ‚œ μœ„μΉ˜μ— μžˆλŠ” νŠΈλ ‰μ΄λΌκ³  ν•  수 μžˆλ‹€.

grid-auto-rows

7. grid-column, grid-row

grid-column, grid-row ν”„λ‘œνΌν‹°λŠ” Grid μ•„μ΄ν…œμ— μ μš©ν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ, 각 μ…€μ˜ μ˜μ—­μ„ μ§€μ •ν•œλ‹€. Gridμ—λŠ” μ•„λž˜μ™€ 같은 λ²ˆν˜Έκ°€ 맀겨져 μžˆλ‹€.

grid number

μ΄λŸ¬ν•œ Grid 번호λ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜μ—­μ„ μ§€μ •ν•œλ‹€.

μ‚¬μš©λ²• grid-column: <μ‹œμž‘λ²ˆν˜Έ> / <끝번호> μ‚¬μš©λ²• grid-row: <μ‹œμž‘λ²ˆν˜Έ> / <끝번호>

λ˜λŠ” λͺ‡ 개의 셀을 μ°¨μ§€ν•˜κ²Œ ν•  것이지λ₯Ό μ§€μ •ν•  μˆ˜λ„ μžˆλ‹€.

μ‚¬μš©λ²• grid-column: <μ‹œμž‘λ²ˆν˜Έ> / span<μžμΉ˜ν•  μ˜μ—­ μ…€ 수> μ‚¬μš©λ²• grid-row: <μ‹œμž‘λ²ˆν˜Έ> / span<μžμΉ˜ν•  μ˜μ—­ μ…€ 수>

grid-column, grid-row

8. μ„Έλ‘œ λ°©ν–₯ μ •λ ¬

8-1. align-items

align-itemsλŠ” μ»¨ν…Œμ΄λ„ˆμ— μ μš©ν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ μ•„μ΄ν…œλ“€μ„ μ„Έλ‘œ(columnμΆ•) λ°©ν–₯으둜 μ •λ ¬ν•œλ‹€.

align-items
align-items

8-2. align-content

align-contentλŠ” μ»¨ν…Œμ΄λ„ˆμ— μ μš©ν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ Gird μ•„μ΄ν…œλ“€μ˜ 높이λ₯Ό λͺ¨λ‘ ν•©ν•œ 값이 Grid μ»¨ν…Œμ΄λ„ˆμ˜ 높이보닀 μž‘μ„ λ•Œ Grid μ•„μ΄ν…œλ“€μ„ ν†΅μ§Έλ‘œ μ •λ ¬ν•œλ‹€.

align-content
align-content

8-3. align-self

align-selfλŠ” Grid μ•„μ΄ν…œμ— μ μš©ν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ ν•΄λ‹Ή μ•„μ΄ν…œμ„ μ„Έλ‘œ(columnμΆ•) λ°©ν–₯으둜 μ •λ ¬ν•œλ‹€.

align-self

9. κ°€λ‘œ λ°©ν–₯ μ •λ ¬

9-1. justify-items

justify-items ν”„λ‘œνΌν‹°λŠ” Gird μ»¨ν…Œμ΄λ„ˆμ— μ μš©ν•˜λ©° μ•„μ΄ν…œλ“€μ„ κ°€λ‘œ(rowμΆ•) λ°©ν–₯으둜 μ •λ ¬ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

justify-items

9-2. justify-content

justify-content ν”„λ‘œνΌν‹°λŠ” Grid μ»¨ν…Œμ΄λ„ˆμ— μ μš©ν•˜λ©° Grid μ•„μ΄ν…œλ“€μ˜ λ„ˆλΉ„λ₯Ό λͺ¨λ‘ ν•©ν•œ 값이 Grid μ»¨ν…Œμ΄λ„ˆμ˜ λ„ˆλΉ„λ³΄λ‹€ μž‘μ„ λ•Œ Grid μ•„μ΄ν…œλ“€μ„ ν†΅μ§Έλ‘œ μ •λ ¬ν•œλ‹€.

justify-content
justify-content

9-3. justify-self

justify-selfλŠ” Grid μ•„μ΄ν…œμ— μ μš©ν•˜λŠ” ν”„λ‘œνΌν‹°λ‘œ ν•΄λ‹Ή μ•„μ΄ν…œμ„ κ°€λ‘œ(rowμΆ•) λ°©ν–₯으둜 μ •λ ¬ν•œλ‹€.

justify-self

10. μ •λ ¬ shorthand

10-1. place-content

align-content와 justify-contentλ₯Ό 같이 μ“Έ 수 μžˆλŠ” shorthand이닀.

μ‚¬μš©λ²• place-content: <align-content> <justify-content>

ν•˜λ‚˜μ˜ κ°’λ§Œ μ“°λ©΄ 두 ν”„λ‘œνΌν‹° λͺ¨λ‘μ— μ μš©λœλ‹€.


10-2. place-slef

align-slef와 justify-slefλ₯Ό 같이 μ“Έ 수 μžˆλŠ” shorthand이닀.

μ‚¬μš©λ²• place-slef: <align-slef> <justify-slef>

ν•˜λ‚˜μ˜ κ°’λ§Œ μ“°λ©΄ 두 ν”„λ‘œνΌν‹° λͺ¨λ‘μ— μ μš©λœλ‹€.


11. order

각 Grid μ•„μ΄ν…œλ“€μ˜ μ‹œκ°μ  λ‚˜μ—΄ μˆœμ„œλ₯Ό κ²°μ •ν•˜λŠ” 속성이닀.

μˆ«μžκ°’μ΄ λ“€μ–΄κ°€λ©΄, μž‘μ€ 숫자일 수둝 λ¨Όμ € λ°°μΉ˜λœλ‹€. "μ‹œκ°μ " μˆœμ„œμΌ 뿐 HTML 자체의 ꡬ쑰λ₯Ό λ°”κΎΈμ§„ μ•Šλ‹€.


12. z-index

ZμΆ• 정렬을 ν•  수 μžˆλŠ” ν”„λ‘œνΌν‹°μ΄λ‹€. μˆ«μžκ°€ 클 수둝 μœ„λ‘œ μ˜¬λΌκ°„λ‹€.

z-index

13. Conclusion

λ‚΄κ°€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ›Ή ν”„λ ˆμž„μ›Œν¬/라이브러리 쀑 Reactλ₯Ό μ‚¬λž‘ν•˜λŠ” 것과 같이 CSSμ—μ„œλŠ” Gridλ₯Ό κ°€μž₯ 많이 μ‚¬λž‘ν•œλ‹€. κ·Έ 만큼 μ‚¬μš©ν•˜λŠ” 비쀑이 많고 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•˜κ³  μžˆλ‹€λŠ” λœ»μ΄λ‹€. ν™•μ‹€νžˆ Gridλ₯Ό 처음 곡뢀할 땐 ν•˜λ‚˜ν•˜λ‚˜ μ΄ν•΄ν•˜λ €κ³  λ§Žμ€ μ‹œκ°„μ„ λ³΄λƒˆλŠ”λ° μ§€κΈˆμ€ Flex와 ν•¨κ»˜ μ„œλ‘œ λΉ„κ΅ν•˜λ©° κ³΅λΆ€ν•˜λ‹ˆ μ‰½κ²Œ 이해가 λ˜μ—ˆλ‹€. λ‹€λ§Œ 주둜 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°κ°€ μžˆλŠ”λ° λ°”λ‘œ justify-content와 align-content이닀. 이 두 속성은 Flexμ—μ„œλŠ” 많이 μ‚¬μš©ν–ˆμ§€λ§Œ Gridμ—μ„œλŠ” ν•œ λ²ˆλ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ˜ ν”„λ‘œνΌν‹°μΈκ±° κ°™λ‹€. κ·Έλž˜λ„ μ–΄λ–€ νŠΉμ§•μ„ κ°€μ§€κ³  μžˆλŠ”μ§€ 짚고 λ„˜μ–΄κ°€μž. 그리고 μ°μ°ν•œκ²Œ.. auto-fill, auto-fit이 λ‚΄ μƒκ°λŒ€λ‘œ, μ˜ˆμƒν•œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ•„μ„œ μ‘°κΈˆμ€ μ”μ“Έν•˜λ‹€... 해결책을 찾아봐야겠닀.😭


μ°Έκ³ 

The CSS Grid Enchiridion μ΄λ²ˆμ—μ•Όλ§λ‘œ CSS Gridλ₯Ό μ΅ν˜€λ³΄μž Understanding CSS Grid: Grid Lines


πŸ‘†

πŸ“… 2022-07-25

Last updated