ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Flex (Flexible Box)

์š”์†Œ์˜ ํฌ๊ธฐ๊ฐ€ ๋ถˆ๋ถ„๋ช…ํ•˜๊ฑฐ๋‚˜ ๋™์ ์ธ ๊ฒฝ์šฐ์—๋„ ๊ฐ ์š”์†Œ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ๋ฐฉ์‹

์ˆ˜ํ‰/์ˆ˜์ง ์ •๋ ฌ์— ๊ด€๋ จ๋œ ์†์„ฑ

 

<div class="container">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
  <div class="item item3">3</div>
</div>

 

์œ„์™€ ๊ฐ™์€ div item๋“ค์ด ์žˆ์„ ๋•Œ ์ˆ˜ํ‰ ์ •๋ ฌ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. 

1. display : inline-block ์‚ฌ์šฉํ•˜๊ธฐ

2. display : block , float : left ์‚ฌ์šฉํ•˜๊ธฐ

ํ•˜์ง€๋งŒ ๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ์—์„œ๋Š” ๊ตฌํ˜„์ด ์–ด๋ ต๊ณ  ํ•œ๊ณ„์ ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

๋ ˆ์ด์•„์›ƒ์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก CSS3์— ์ถ”๊ฐ€๋œ Flex ๋ผ๋Š” ๋ ˆ์ด์•„์›ƒ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

 

๊ทธ๋ƒฅ item์„ ๊ฐ์‹ธ๋Š” container์— display : flex ๋ฅผ ์ ์šฉํ•ด์ฃผ๋ฉด ์•„์ฃผ ์‰ฝ๊ฒŒ ์ˆ˜ํ‰ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 


 

 

Flex 

  1. Container : Items์„ ๊ฐ์‹ธ๋Š” ๋ถ€๋ชจ ์š”์†Œ
  2. Items 

item ์ •๋ ฌ์„ ์œ„ํ•ด์„œ๋Š” container๊ฐ€ ํ•„์ˆ˜!

 


 

Flex Container ์˜ ์†์„ฑ๋“ค

  • display 
  • flex-flow
  • flex-direction
  • flex-wrap
  • justify-content
  • align-content
  • align-items

 

flex-flow (๋‹จ์ถ• ์†์„ฑ)

  • flex Items์˜ ์ฃผ ์ถ•์„ ์„ค์ •ํ•˜๊ณ  Items์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌถ์Œ (์ค„ ๋ฐ”๊ฟˆ)์„ ์„ค์ •ํ•œ๋‹ค.
  • flex-direction ๊ณผ flex-wrap ์„ ๋‹จ์ถ•ํ•œ ์†์„ฑ์ด๋‹ค.

 

flex-flow : [flex-direction] [flex-wrap];

 

flex-direction

Items์˜ ์ฃผ ์ถ•์„ ์„ค์ •ํ•œ๋‹ค.

flex-direction : row / row-reverse
flex-direction : column / column-reverse

  • row : Items๋ฅผ ์ˆ˜ํ‰์ถ•์œผ๋กœ ์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ ํ‘œ์‹œ (๊ธฐ๋ณธ ๊ฐ’)
  • row-reverse : ์ˆ˜ํ‰์ถ•์œผ๋กœ ์˜ค๋ฅธ์ชฝ -> ์™ผ์ชฝ ํ‘œ์‹œ
  • column : Items๋ฅผ ์ˆ˜์ง์ถ•์œผ๋กœ ์œ„->์•„๋ž˜ ํ‘œ์‹œ
  • column-reverse : ์ˆ˜์ง์ถ•์œผ๋กœ ์•„๋ž˜->์œ„ ํ‘œ์‹œ

 

  • ์ฃผ ์ถ• (main-axis) ๊ณผ ์ˆ˜ํ‰ ์ถ• (cross-axis)
    • row : Items๋ฅผ ์ˆ˜ํ‰ ์ถ•์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ ์ถ•์€ ์ˆ˜ํ‰ , ๊ต์ฐจ ์ถ•์€ ์ˆ˜์ง
    • column : Items๋ฅผ ์ˆ˜์ง ์ถ•์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ ์ถ•์€ ์ˆ˜์ง , ๊ต์ฐจ ์ถ•์€ ์ˆ˜ํ‰

์‹œ์ž‘ ์  , ๋์ 

 

flex-wrap

Items์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌถ์Œ์„ ์„ค์ •ํ•œ๋‹ค. (์ค„ ๋ฌถ์Œ์„ ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •)

 

flex-wrap : nowrap (container์˜ ๋„ˆ๋น„์— ๋งž์ถฐ ํ•œ ์ค„ ์•ˆ์—์„œ Items์˜ ํฌ๊ธฐ๋งŒ ๊ฐ€๋ณ€ ๋œ๋‹ค.)
flex-wrap : wrap (container์˜ ๋„ˆ๋น„์— ๋งž์ถฐ ์ค„๋ฐ”๊ฟˆ ๋œ๋‹ค.)
flex-wrap : wrap-reverse (์•„๋ž˜์—์„œ ์œ„๋กœ , ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ)

  • nowrap : ๋ชจ๋“  Items์„ ํ•œ์ค„๋กœ ํ‘œ์‹œ (๊ธฐ๋ณธ ๊ฐ’)
  • wrap : Items์„ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ฌถ์Œ
  • wrap-reverse : Items์„ wrap์˜ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ฌถ์Œ

 

ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€ํ•˜๋Š” ์ด์œ ?

.container {
  border: 4px solid;
  display: flex;
}

.container .item {
  width : 150px;
  height : 100px;
  background:tomato;
  border: 4px dashed red;
  border-radius : 10px;
}

 

์œ„์™€ ๊ฐ™์ด flex-wrap์ด ๊ธฐ๋ณธ๊ฐ’์ธ nowrap ์ธ ์ƒํƒœ์—์„œ container์˜ ํฌ๊ธฐ๋ฅผ ์ค„์˜€๋‹ค ๋Š˜๋ ธ๋‹คํ•˜๋ฉด Item๋“ค์˜ ๋„ˆ๋น„๋ฅผ 150px๋กœ ์„ค์ •ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋„ˆ๋น„๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

์ด์œ ๋Š” Item๋“ค์ด container์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋งž์ถฐ์ง€๋Š”๋ฐ ์ด๋Š” ๊ฐ๊ฐ์˜ item๋“ค์ด flex-basis๋ผ๋Š” ์†์„ฑ์—์„œ auto๋ฅผ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋กœ/์„ธ๋กœ ๊ฐ’์ด ๊ฐ€๋ณ€ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

justify-content

์ฃผ ์ถ•์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค.

 

justify-content : flex-start (์‹œ์ž‘์  ์ •๋ ฌ) , flex-end (๋์  ์ •๋ ฌ)
justify-content : center (๊ฐ€์šด๋ฐ ์ •๋ ฌ)
justify-content : space-between (์‹œ์ž‘/๋งˆ์ง€๋ง‰ ์ ์— ์ •๋ฆฌ ํ›„ ๋‚จ์€ Items ๊ท ๋“ฑํ•˜๊ฒŒ ์ •๋ ฌ) , space-around (๊ฐ Item์„ ๊ท ๋“ฑํ•œ ์—ฌ๋ฐฑ์œผ๋กœ ์ •๋ ฌ)

  • flex-start : Items์„ ์‹œ์ž‘์ ์œผ๋กœ ์ •๋ ฌ (์™ผ์ชฝ ์ •๋ ฌ)
  • flex-end : Items์„ ๋์ ์œผ๋กœ ์ •๋ ฌ (์˜ค๋ฅธ์ชฝ ์ •๋ ฌ)
  • center : Items์„ ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  • space-between : ์‹œ์ž‘ Item์€ ์‹œ์ž‘์ ์— ์ •๋ ฌํ•˜๊ณ  ๋งˆ์ง€๋ง‰ Item์€ ๋์ ์— ์ •๋ ฌํ•œ ๋’ค, ๋‚˜๋จธ์ง€ Items๋Š” ์‚ฌ์ด์—์„œ ๊ณ ๋ฅด๊ฒŒ ๋ถ„๋ฐฐ๋˜์–ด ์ •๋ ฌ
  • space-around : ๊ฐ Items์„ ๊ท ๋“ฑํ•œ ์—ฌ๋ฐฑ์„ ํฌํ•จํ•˜์—ฌ ์ •๋ ฌ

 

 

align-content

๊ต์ฐจ ์ถ•์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค.

* flex-wrap ์†์„ฑ์„ ํ†ตํ•ด items๊ฐ€ ์—ฌ๋Ÿฌ ์ค„์ด๊ณ  ์—ฌ๋ฐฑ์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

 

item์˜ height : auto๋กœ ํ•ด์•ผ ๋Š˜์–ด๋‚œ๋‹ค!
flex-start / flex-end
center / space-between / space-around

  • stretch : Container์˜ ๊ต์ฐจ ์ถ•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด Items ๋Š˜๋ฆผ
  • flex-start : Items์„ ์‹œ์ž‘์ ์œผ๋กœ ์ •๋ ฌ
  • flex-end : Items์„ ๋์ ์œผ๋กœ ์ •๋ ฌ
  • center : Items์„ ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  • space-between : ์‹œ์ž‘ Item์€ ์‹œ์ž‘์ ์— ์ •๋ ฌํ•˜๊ณ  ๋งˆ์ง€๋ง‰ Item์€ ๋์ ์— ์ •๋ ฌํ•œ ๋’ค, ๋‚˜๋จธ์ง€ Items๋Š” ์‚ฌ์ด์—์„œ ๊ณ ๋ฅด๊ฒŒ ๋ถ„๋ฐฐ๋˜์–ด ์ •๋ ฌ
  • space-around : ๊ฐ Items์„ ๊ท ๋“ฑํ•œ ์—ฌ๋ฐฑ์„ ํฌํ•จํ•˜์—ฌ ์ •๋ ฌ

 

 

 

align-items

๊ต์ฐจ ์ถ•์—์„œ Items์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค. Items๊ฐ€ ํ•œ ์ค„์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

 

stretch
flex-start / flex-end
center / baseline

  • stretch : container์˜ ๊ต์ฐจ ์ถ•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด Items์„ ๋Š˜๋ฆผ
  • flex-start : Items์„ ๊ฐ ์ค„์˜ ์‹œ์ž‘์ ์œผ๋กœ ์ •๋ ฌ
  • flex-end : Items์„ ๊ฐ ์ค„์˜ ๋ ์ ์œผ๋กœ ์—ฐ๊ฒฐ
  • center : Items์„ ๊ฐ€์šด๋ฐ ์ •๋ ฌ
  • baseline : Items์„ ๋ฌธ์ž ๊ธฐ์ค€์„ ์— ์ •๋ ฌ

 

 


Flex Container ์˜ ์†์„ฑ๋“ค

  • order
  • flex
  • flex-grow
  • flex-shrink
  • flex-basis
  • align-self

 

order

Flex Item์˜ ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ˆซ์ž๊ฐ€ ํด ์ˆ˜๋ก ์ˆœ์„œ๊ฐ€ ๋ฐ€๋ฆฌ๊ณ  ์Œ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

 

.item3 {
  order: 1;
}

.item5 {
  order: 7;
}

.item6 {
  order: -1;
}

 

 

flex (๋‹จ์ถ• ์†์„ฑ)

  • Item์˜ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋‹จ์ถ•์†์„ฑ์ด๋‹ค.
  • Item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„ ๋น„์œจ / ๊ฐ์†Œ ๋„ˆ๋น„ ๋น„์œจ / ๊ธฐ๋ณธ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    • flex ๋ผ๋Š” ๋‹จ์ถ• ์†์„ฑ์—์„œ flex-basis๋ฅผ ์ƒ๋žตํ•  ๊ฒฝ์šฐ, flex-basis์˜ ๊ธฐ๋ณธ ๊ฐ’์€ auto๊ฐ€ ์•„๋‹ˆ๋ผ 0์ด๋‹ค. 
flex : [flex-grow] [flex-shrink] [flex-basis]

 


flex-grow 

Item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„ ๋น„์œจ์„ ์„ค์ •ํ•œ๋‹ค. ์ˆซ์ž๊ฐ€ ํด ์ˆ˜๋ก ๋งŽ์€ ๋„ˆ๋น„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

item ์ž์ฒด์˜ ๋„ˆ๋น„ : 100px , 1๊ณผ 2์— ๊ฐ๊ฐ flex-grow : 1 , flex-grow : 2

item ์ž์ฒด์˜ ๋„ˆ๋น„๋ฅผ 100px๋กœ ์„ค์ •ํ•ด๋‘์–ด์„œ 1๊ณผ 2์˜ ๋„ˆ๋น„๊ฐ€ ์ •ํ™•ํžˆ 2๋ฐฐ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€๋Š” ์•Š๋Š”๋‹ค.

item์˜ width๋ฅผ ์ง€์šฐ๊ณ  3์—๋งŒ 100px ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด 1๊ณผ 2์˜ ๋„ˆ๋น„ ๋น„์œจ์ด 1:2๋กœ ์ •ํ™•ํ•ด์ง„๋‹ค.

item ์ž์ฒด์˜ ๋†’์ด ์ง€์šฐ๊ณ  i3์— width : 100

 

 

flex-grow ๊ฐ€ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์˜ˆ์ œ)

 

 

item2๋Š” width : 100px๋กœ ๊ณ ์ •๋˜์–ด์žˆ๊ณ  item1์€ flex-grow : 1 ๋กœ ์„ค์ •๋˜์–ด์žˆ๋‹ค.

1๋ฒˆ ๋ถ€๋ถ„์˜ ๊ฐ€๋กœ ๋„ˆ๋น„๋งŒ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋ณ€ํ•˜๊ณ  2๋ฒˆ์€ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ด€๋ จ๋œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค ๋•Œ flex-grow๊ฐ€ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋”œ ์ˆ˜ ์žˆ๋‹ค.

<div class="container">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
</div>
.container {
  border: 4px solid;
  display: flex;
}

.container .item {
  height : 100px;
  background:tomato;
  border: 4px dashed red;
  border-radius : 10px;
  font-size:30px;
  display:flex;
  justify-content:center;
  align-items:center;
}

.item1 {
  flex-grow:1;
}

.item2 {
  width:100px;
}

 

 

flex-shrink

Item์ด ๊ฐ์†Œํ•˜๋Š” ๋„ˆ๋น„์˜ ๋น„์œจ์„ ์„ค์ •ํ•œ๋‹ค. ์ˆซ์ž๊ฐ€ ํฌ๋ฉด ๋” ๋งŽ์€ ๋„ˆ๋น„๊ฐ€ ๊ฐ์†Œํ•œ๋‹ค.

Item์ด ๊ฐ€๋ณ€ ๋„ˆ๋น„๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜, ๊ฐ’์ด 0์ผ ๊ฒฝ์šฐ ํšจ๊ณผ๊ฐ€ ์—†๋‹ค.

 

flex-shrink๋Š” ์š”์†Œ์˜ ๋„ˆ๋น„์— ์˜ํ–ฅ์„ ๋ฐ›์•„์„œ ๊ณ„์‚ฐ์ด ๊นŒ๋‹ค๋กญ๋‹ค.

* ์š”์†Œ์˜ ๋„ˆ๋น„ : width, height, flex-basis ๋“ฑ ๋„ˆ๋น„๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ

 

์™ผ์ชฝ ์˜ˆ์ œ์—์„œ container์˜ ๋„ˆ๋น„๊ฐ€ ์ค„์–ด๋“ค์–ด์„œ Item์˜ ๋„ˆ๋น„์— ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ์‹œ์ž‘ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ์‹ค์ œ ์ค„์–ด๋“  ๊ฑฐ๋ฆฌ๊ฐ€ 90px์ผ ๋•Œ,

์š”์†Œ ๋„ˆ๋น„๊ฐ€ 200px๋กœ ๊ฐ™์€ Item์ด 2๊ฐœ์ด๊ณ  ์ง€์ •๋œ ๊ฐ์†Œ ๋„ˆ๋น„ (flex-shrink)๊ฐ€ ๊ฐ๊ฐ 2์™€ 1์ด๋ผ๋ฉด, ๊ฐ์†Œ ๋„ˆ๋น„๋Š” 2:1์ด๋‹ค.

 

์ฒซ๋ฒˆ์งธ Item์€ 90px * 2/3 = 60px ๋งŒํผ ๊ฐ์†Œํ•˜๊ณ , ๋‘๋ฒˆ์งธ Item์€ 90px * 1/3 = 30px ๋งŒํผ ๊ฐ์†Œํ•œ๋‹ค. 

 

 

flex-basis 

Item์˜ ๊ธฐ๋ณธ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ฐ’์ด auto์ผ ๊ฒฝ์šฐ width, height ๋“ฑ์˜ ์†์„ฑ์œผ๋กœ Item์˜ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

align-self

๊ต์ฐจ ์ถ•์—์„œ ๊ฐœ๋ณ„ Item์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค.

 

align-items ์˜ ๊ฒฝ์šฐ๋Š” container ๋‚ด์˜ ๋ชจ๋“  items์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•œ๋‹ค.

์ด๋•Œ, ๊ฐœ๋ณ„ item์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น item์—์„œ align-self ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

container์˜ align-items๋ฅผ flex-end๋กœ ์„ค์ •ํ•˜๊ณ  ๋ช‡๊ฐœ์˜ item์— ๋Œ€ํ•ด์„œ๋งŒ ๊ต์ฐจ์ถ•์—์„œ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ๋ฐ”๊พธ์–ด๋ณด์ž.

  • 2๋ฒˆ : align-self : center;
  • 4๋ฒˆ : align-self : flex-start;
  • 7๋ฒˆ : align-self : stretch; height : auto;
๋Œ“๊ธ€