Grid Layout
Grid? Flex? What should I choose?
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
- 컨ν μ΄λμ μμ μ리먼νΈλ₯Ό λ°°μΉν λ°©ν₯(row, column, row-reverse, column-reverse)μ μ νλ€.
- 컨ν μ΄λ μμ ν¬κΈ°λ₯Ό μ°μ ν΄ μμ΄ν μ μ°κ²¨ λ£μμ§(nowrap), μμ΄ν ν¬κΈ°λ₯Ό μ°μ ν΄ μ»¨ν μ΄λλ₯Ό μλ₯Όμ§(wrap)λ₯Ό μ νλ€.
- 컨ν μ΄λ λ΄ μμ΄ν μ λ μ΄μμ(justify-content, align-items, align-content)μ μ νλ€.
- μμ΄ν μ κ°λ³ μμΉ(align-self)λ₯Ό μ νλ€.
Grid
- λ°°μΉνκΈ° μ λ μ΄μμμ μ¬μ©ν 격μλ°°μ΄μ κ°μ(grid-template-rows, grid-template-columns)λ₯Ό μ€μ νλ€.
- (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;
}
200px, 100px, 300px, 100px 4κ°μ μ μ λ§λ€μκ³ , μ°¨λ‘λλ‘ 1, 2, 3μ μ±μ°κ³ ν μΉΈμ΄ λΉμλ€. κ·Έλ¦¬κ³ λ§μ§λ§ μ μ 컨ν μ΄λλ₯Ό λ€ μ±μ°μ§ λͺ»ν μ± κ³΅κ°μ λ¨κ²¨λμλ€.
.container {
display: grid;
width: 1000px;
background-color: aquamarine;
grid-template-columns: 20% 20% 10% 20%;
}
λ§μ°¬κ°μ§λ‘ 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 λ‘ μ
μ μμ±νλ, Flex λ₯Ό μ¬μ©ν λμ λ§μ°¬κ°μ§λ‘ λ΄λΆ content μ μν΄ ν¬κΈ°κ° μ μ°νκ² λμ΄λλλ‘ νκΈ° μν΄ μ°λ¦¬λ fr
μ΄λΌλ
λ¨μλ₯Ό μ¬μ©ν μ μλ€.
.container {
display: grid;
width: 1000px;
background-color: aquamarine;
grid-template-columns: 1fr 2fr 1fr 2fr;
}
fr
μ 컨ν
μ΄λμ μ 체 곡κ°μ μ΅μκ° λΉμ¨
λ‘ μλΌλΈλ€. λ°λΌμ κΈ°λ³Έμ μΌλ‘ 1:2:1:2
λ‘ %
λ₯Ό μ¬μ©ν λμ λμΌνμ§λ§, νμν κ²½μ°
곡κ°μ λ μ¬μ©νλλ‘ λμ΄λλ€.
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 μ΄λ€.
- μΈ λ²μ§Έ ν: λ¨μ 곡κ°μ λΉμ¨λ‘μ¨ μ¦κ°νλ€. μ΄ κ²½μ° λ¨μ κ³΅κ° μ 체λ₯Ό μ¬μ©νλ€.
κ·Έ κ²°κ³Ό 첫 λ²μ§Έ νμ 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
μ 쑰건μ μ§μ νλ©΄ λλ€.
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
λ§ auto-fit
μΌλ‘ λ°κΏλ³΄μ. λ§μ°¬κ°μ§λ‘ Grid μ μμ΄ν
μ μ΅λν λμ΄λκΈ° μν΄ max
κ°μ
μ¬μ©ν΄ 220px μ΄μ λ§λ λ€. νμ§λ§ μ΄μ λ λ§λ€ μ μλ μ¬μ 곡κ°μ΄ μμμλ λΆκ΅¬νκ³ μλ¦¬λ¨ΌνΈ κ°μμ λ§μΆ° λ± 3κ°λ§ μμ±νλ€.
.container {
display: grid;
width: 1000px;
background-color: aquamarine;
grid-template-columns: repeat(auto-fit, minmax(150px, 220px));
}
λλΆλΆμ λΈλ‘κ·Έμμ 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
λΌλ λμΌν κ²°κ³Όλ₯Ό 보μ¬μ€λ€.
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
λ§ 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κ°λ₯Ό λ§λ λ€.
μμμ μ€λͺ ν λͺ¨λ κ²μ λ€μ ν λ² μ 리ν΄λ³΄μ.
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-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;
}
table
μ리먼νΈλ₯Ό μ¬μ©νλ―span
μ μ§μ ν μλ μλ€.
.item-2 {
grid-row: 3 / 5;
grid-column: 2 / 4;
}
.item-2 {
grid-row: 3 / span 2;
grid-column: 2 / span 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;
}
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;
}
κ·Έλ¦¬κ³ λ€μ΄λ°μ μ£Όλ‘ λ€μκ³Ό κ°μ΄ λμ μμμ μ 체 λ μ΄μμμ ꡬμ±ν λ μ ν©νλ€.
<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;
}
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>
Reference
- βGrid.β MDN Web Docs. Jul. 18, 2023, accessed Mar. 25, 2024, MDN - Grid.
- βFlex.β MDN Web Docs. Jul. 18, 2023, accessed Mar. 25, 2024, MDN - Flex.