Grid ์ •๋ฆฌ

J.yeonยท2023๋…„ 11์›” 21์ผ
0
post-thumbnail

Grid๋ž€?

๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” 2์ฐจ์› ๋ ˆ์ด์•„์›ƒ ๋ชจ๋ธ.
๊ทธ๋ฆฌ๋“œ ๋ ˆ์ด์•„์›ƒ์€ ์›น ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ, ์š”์†Œ๋“ค์„ ํ–‰๊ณผ ์—ด์˜ ๊ทธ๋ฆฌ๋“œ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.



Grid ์‚ฌ์šฉ๋ฒ• ๋ฐ ๊ตฌ์กฐ

๊ทธ๋ฆฌ๋“œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋  ์š”์†Œ(๋ถ€๋ชจ)์— display: grid; ์†์„ฑ ์ถ”๊ฐ€

๊ตฌ์„ฑ : Grid-container(๋ถ€๋ชจ์š”์†Œ) & Grid items(์ž์‹์š”์†Œ)


Grid Line (๋ผ์ธ) : ๊ทธ๋ฆฌ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ถ„ํ•  ์„ 
Grid Cell (์…€) : ๊ทธ๋ฆฌ๋“œ ๊ตฌ์„ฑ ๋‹จ์œ„
Grid Track (ํŠธ๋ž™) : ๋‘ ๊ทธ๋ฆฌ๋“œ ๋ผ์ธ ์‚ฌ์ด์˜ ๊ณต๊ฐ„. ์—ด ๋˜๋Š” ํ–‰
Grid Area (์˜์—ญ) : ๋„ค ๊ฐœ์˜ ๊ทธ๋ฆฌ๋“œ ๋ผ์ธ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๊ณต๊ฐ„ (๊ทธ๋ฆฌ๋“œ ์…€๋กœ ๊ตฌ์„ฑ๋จ)



Grid Container ๋ถ€๋ชจ ์†์„ฑ

์†์„ฑ ์˜๋ฏธ
display container ์ •์˜
grid-template-rows ํ–‰ ํฌ๊ธฐ๋ฅผ ์ •์˜
grid-template-columns ์—ด ํฌ๊ธฐ๋ฅผ ์ •์˜
grid-template-areas ์˜์—ญ ์ด๋ฆ„์„ ์ฐธ์กฐํ•ด ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
grid-template grid-template-xxx์˜ ๋‹จ์ถ•
row-gap(grid-row-gap) ํ–‰๊ณผ ํ–‰ ์‚ฌ์ด ๊ฐ„๊ฒฉ ์ •์˜
column-gap(grid-column-gap) ์—ด๊ณผ ์—ด ์‚ฌ์ด ๊ฐ„๊ฒฉ ์ •์˜
gap(grid-gap) xxx-gap์˜ ๋‹จ์ถ•
grid-auto-rows ์•”์‹œ์ ์ธ ํ–‰ ํฌ๊ธฐ ์ •์˜
grid-auto-columns ์•”์‹œ์ ์ธ ์—ด ํฌ๊ธฐ ์ •์˜
grid-auto-flow ์ž๋™ ๋ฐฐ์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹์„ ์ •์˜
grid grid-template-xxx๊ณผ grid-auto-xxx์˜ ๋‹จ์ถ•
align-content contents๋ฅผ ์ˆ˜์ง(์—ด์ถ•) ์ •๋ ฌ
justify-content contents๋ฅผ ์ˆ˜ํ‰(ํ–‰์ถ•) ์ •๋ ฌ
place-content align-content์™€ justify-content์˜ ๋‹จ์ถ•
align-items items๋“ค์„ ์ˆ˜์ง(์—ด์ถ•) ์ •๋ ฌ
justify-items items๋“ค์„ ์ˆ˜ํ‰(ํ–‰์ถ•) ์ •๋ ฌ
place-items align-items์™€ justify-items์˜ ๋‹จ์ถ•


ex) ์‚ฌ์šฉ ์˜ˆ์‹œ

.container {
  display: grid;
  grid-template-rows: 100px 100px;
  grid-template-columns: 1fr 2fr;
  grid-gap: 10px;
}

<div class="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

<!-- ๋‘ ๊ฐœ์˜ ํ–‰๊ณผ ๋‘ ๊ฐœ์˜ ์—ด์ด ์žˆ๋Š” ๊ทธ๋ฆฌ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , 
๊ฐ ํ–‰์˜ ๋†’์ด๋Š” 100px, ์ฒซ ๋ฒˆ์งธ ์—ด์€ 1fr(1:1 ๋น„์œจ), 
๋‘ ๋ฒˆ์งธ ์—ด์€ 2fr(2:1 ๋น„์œจ), ์•„์ดํ…œ ๊ฐ„์˜ ๊ฐ„๊ฒฉ์€ 10px ์„ค์ • -->

๋Œ€์ฒด์ ์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” ์†์„ฑ๋“ค--

*display: grid: ๊ทธ๋ฆฌ๋“œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ
*grid-template-rows: ๊ทธ๋ฆฌ๋“œ์˜ ํ–‰ ํฌ๊ธฐ๋ฅผ ์ •์˜
*grid-template-columns: ๊ทธ๋ฆฌ๋“œ์˜ ์—ด ํฌ๊ธฐ๋ฅผ ์ •์˜
*grid-gap: ๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ •์˜

๐Ÿ“Œ fr(fraction, ๊ณต๊ฐ„ ๋น„์œจ) ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ“Œ repeat() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

repeat() ํ•จ์ˆ˜

  • ๋‘๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์›ํ•˜๋Š”์ˆ˜๋งŒํผ(์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜) ๋ฐ˜๋ณต
grid-template-columns: repeat(9, 100px);
/* grid-template-columns: 100px 100px 100px 100px 100px 100px 100px 100px 100px; */

grid-template-columns: repeat(2, 100px 200px 50px);
/* grid-template-columns: 100px 200px 50px 100px 200px 50px; */

grid-template-columns: repeat(4, 1fr 2fr 3fr);
/* grid-template-columns: 1fr 2fr 3fr 1fr 2fr 3fr 1fr 2fr 3fr 1fr 2fr 3fr; */

minmax ํ•จ์ˆ˜

  • ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์„ ์ง€์ •
grid-template-rows: repeat(3, minmax(100px, auto));

๋‚ด์šฉ์˜ ์–‘๊ณผ ์ƒ๊ด€์—†์ด ์ตœ์†Œํ•œ 100px,ย ์ตœ๋Œ€๋Š” ์ž๋™์œผ๋กœ(auto) ๋Š˜์–ด๋‚˜๊ฒŒ ์„ค์ •

<!-- min ๊ณผ max ๋”ฐ๋กœ๋”ฐ๋กœ ์ง€์ • ๊ฐ€๋Šฅโ†“ -->

grid-template-columns: min-content 1fr;
grid-template-columns: max-content 1fr;


grid-template-areas

์ง€์ •๋œ ์˜์—ญ์— ์˜์—ญ ์ด๋ฆ„์„ ์ฐธ์กฐํ•ด ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ

.container {
  display: grid;
  
  /* ๊ทธ๋ฆฌ๋“œ ๊ฐฏ์ˆ˜,ํฌ๊ธฐ ์กฐ์ • */
  grid-template-rows: repeat(2, 100px);
  grid-template-columns: repeat(3, 1fr);
  
  /* ๊ทธ๋ฆฌ๋“œ ํ…œํ”Œ๋ฆฟ */
  grid-template-areas:
    "a a a"
    "b b c";
    
    /* ๋นˆ์˜์—ญ : none ๋˜๋Š” .(๋งˆ์นจํ‘œ) */
}

/* grid-area ์ด๋ฆ„์„ ์ง€์ • */
header { grid-area: a; }
main   { grid-area: b; }
aside  { grid-area: c; }

*grid-template์œผ๋กœ ๋‹จ์ถ•ํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

grid-template:
   "a a a" 100px
   "b b c" 100px
   / 1fr 1fr 1fr;


Grid Item ์ž์‹ ์†์„ฑ

์†์„ฑ ์˜๋ฏธ
grid-row-start Item ํ–‰ ์‹œ์ž‘ ์œ„์น˜ ์ง€์ •
grid-row-end Item ํ–‰ ๋ ์œ„์น˜ ์ง€์ •
grid-row grid-row-xxx์˜ ๋‹จ์ถ•
grid-column-start Item ์—ด ์‹œ์ž‘ ์œ„์น˜ ์ง€์ •
grid-column-end Item ์—ด ๋ ์œ„์น˜ ์ง€์ •
grid-column grid-column-xxx์˜ ๋‹จ์ถ•
grid-area ์˜์—ญ์ด๋ฆ„ ์„ค์ • ๋˜๋Š” grid-row์™€ grid-column์˜ ๋‹จ์ถ•
align-self ๋‹จ์ผ item ์ˆ˜์ง(์—ด์ถ•) ์ •๋ ฌ
justify-self ๋‹จ์ผ item ์ˆ˜ํ‰(ํ–‰์ถ•) ์ •๋ ฌ
place-self align-self์™€ justify-self์˜ ๋‹จ์ถ•
order item ๋ฐฐ์น˜ ์ˆœ์„œ ์ง€์ •
z-index item ์Œ“์ด๋Š” ์ˆœ์„œ ์ง€์ •


๊ทธ๋ฆฌ๋“œ ์…€ ์˜์—ญ ์ง€์ •ํ•˜๊ธฐ

  • grid-row-start, grid-row-end / grid-column-start, grid-column-end

item ๋ฐฐ์น˜๋ฅผ ์œ„ํ•ด ๊ทธ๋ฆฌ๋“œ ์„ ์˜ ์‹œ์ž‘ ์œ„์น˜์™€ ๋ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

โ€˜์ˆซ์žโ€™๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, โ€˜์„  ์ด๋ฆ„โ€™์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜, span ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ


1. *์ˆซ์ž ์ง€์ •

/* ๊ทธ๋ฆฌ๋“œ ๋ชจ์–‘ ์ง€์ • */
.container {
  display: grid;
  grid-template-rows: repeat(2, 1fr);
  grid-template-columns: repeat(3, 1fr);
}

/* ๊ทธ๋ฆฌ๋“œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ๊ทธ๋ฆฌ๋“œ ์•„์ดํ…œ๋“ค์„ ์ง€์ • */
.item:first-child {
  grid-row-start: 1;
  grid-row-end: 3;
  
  grid-column-start: 2;
  grid-column-end: 4;
}


2. ์„  ์ด๋ฆ„ ์ง€์ •

.container {
  display: grid;
  grid-template-rows: [row-1st] 1fr [row-2nd] 1fr [row-3rd]; /* ์„  ์ด๋ฆ„์„ ์ง€์ • */
  grid-template-columns: [col-1st] 1fr [col-2nd] 1fr [col-3rd] 1fr [col-4th];
}

.item:first-child {
  grid-row-start: row-2nd; /* ์„ ์ด๋ฆ„์œผ๋กœ ์•„์ดํ…œ ํฌ๊ธฐ๋ฅผ ์ง€์ • */
  grid-row-end: row-3rd;
  
  grid-column-start: col-2nd;
  grid-column-end: col-4th;
}


3. span ์‚ฌ์šฉ

  • spanํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ์˜์—ญ๋งŒํผ ๋ผ์ธ์„ ํ™•์žฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ์‰ฝ๊ฒŒ ๋ฐฐ์น˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    (๊ธฐ๋ณธ๊ฐ’: span 1)
.item:first-child{

  /* Row 2๋ฒˆ์—์„œ 3๋ฒˆ๊นŒ์ง€ */
  grid-row-start: 2;
  grid-row-end: span 1;


  /* Column 2๋ฒˆ์—์„œ 4๋ฒˆ๊นŒ์ง€ */
  grid-column-start: 2;
  grid-column-end: span 2;
}

profile
๊ฐœ๋ธ”๋ฆฌ์…” ๊ฟˆ๊พธ๋Š” ํผ๋ธ”์˜ ๊ฐœ๋ฐœ๊ณต๋ถ€๐Ÿšถโ€โ™€๏ธ ์ฒœ์ฒœํžˆ ๊ฑธ์–ด๊ฐ€๋Š” ์ค‘

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด