๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY/CSS

[CSS] Flexible Box

๋ฐ˜์‘ํ˜•

'flex๋ฅผ ํ•ด๋ณด์ž!' ๋ผ๊ณ  ์ƒ๊ฐ๋งŒํ–ˆ์—ˆ๋Š”๋ฐ ๋“œ๋””์–ด ์˜ฌ๋ฆฐ๋‹ค๐Ÿ˜“
์ด๋ก ์„ ์ข€ ๋ฐฐ์›Œ๋ณด๋‹ˆ ํ—ท๊ฐˆ๋ฆฌ๋Š”๊ฒŒ ๋งŽ๋‹ค.. ์ด๋ก  ํ›„์— ์‘์šฉ์„ ๊ผญ ํ•ด๋ณด๊ณ  ์ดํ•ด๋ฅผ ํ•˜์žโœŠ

 

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜

Can I use flexible Box ?

 

Flexible Box๋ฅผ ์“ฐ๋Š” ์ด์œ 

๋Œ€๋ถ€๋ถ„ ์‚ฌ์ดํŠธ๋Š” ๋ ˆ์ด์•„์›ƒ์ด ์ˆ˜์ง ๊ตฌ์„ฑ์ด๋ฉฐ '์œ„-์•„๋ž˜'๋กœ ์Šคํฌ๋กค ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ๋“ค์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธ”๋ก(block) ๊ฐœ๋…์œผ๋กœ ํ‘œ์‹œ(display)๋˜๋ฉฐ
์ด๋Š” ๋ทฐ(view)์— ์ˆ˜์ง(์œ„์—์„œ ์•„๋ž˜)์œผ๋กœ ์Œ“์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ง ๊ตฌ์„ฑ์€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ˆ˜ํ‰๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ์†์„ฑ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ <table>์ด๋‚˜ float , inline-block ์„ ํ†ตํ•ด ๋งŒ๋“ ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•๋“ค์€ ๋‹ค์–‘ํ•œ ๋ฌธ์ก”(clear, white space ๋“ฑ, ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค๋งŒ)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์ˆ˜ํ‰ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ์˜ ์ฐจ์„ ์ฑ…์ผ ๋ฟ์ด๋‹ค.

์ด๋ฅผ Flex(Flexible Box)๋กœ ๋ ˆ์ด์•„์›ƒ์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.

 

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด float๊ณผ flex๋ฅผ ์•Œ์•„๋ณด์ž.

<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="clear-element"></div>
.box { float: left; }
.clear-element { clear: both; /* or left */ }
/* ์ด ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋‚˜ ๊ถŒ์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ฐ€์ƒํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. */

์œ„ ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํ•˜๋‚˜box๋ฅผ ์ œ์™ธํ•œ clear-element๋ผ๋Š” ์ด๋ฆ„(class)์˜ ๋‹ค์Œ(next) ์š”์†Œ๋„ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์‚ฌ์šฉ์—” ๋ถˆํŽธํ•˜๋ฉฐ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค. (์ด๋ฆ„์„ ํ•˜๋‚˜ ๋” ๋ช…์‹œํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—.)

์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

<div class="clearfix">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>
</div>
/* IE ํ•ต์ด๋‚˜ ๊ธฐํƒ€ ๋ฐฉ์‹์„ ์ œ์™ธํ•˜๊ณ  ๊ฐ€์žฅ ์›๋ฆฌ์— ์ถฉ์‹คํ•œ ๋ฐฉ๋ฒ• */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}
.box { float: left; }

 

flex์˜ ์ž‘์„ฑ๋ฐฉ๋ฒ•.

<div class="box-container">
  <div class="box"></div>
  <div class="box"></div>
  <div class="box"></div>  
</div>
.box-container { display: flex; }

flex๋Š” ์ˆ˜ํ‰์ด ๋  ์š”์†Œ๋“ค์˜ container(box-container)์— display: flex; ๋ฅผ ์ ์šฉํ•œ๋‹ค.

(์„ธ๋ถ€ ์†์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ‰ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

 

CSS3 Flexible Box

flex๋Š” ๋‘ ๊ฐœ์˜ ๊ฐœ๋…์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  1. container :: items๋ฅผ ๊ฐ์‹ธ๋Š” ๋ถ€๋ชจ์š”์†Œ๋กœ ๊ฐ item์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” container๊ฐ€ ํ•„์ˆ˜!
  2. items :: container์˜ ์ž์‹์š”์†Œ

 

  • container์™€ items์— ์ ์šฉํ•˜๋Š” ์†์„ฑ์ด ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋‹ค.

    • container :: display, flex-flow, justify-content ๋“ฑ์˜ ์†์„ฑ.
    • items :: order, flex, align-self ๋“ฑ์˜ ์†์„ฑ์ด ์žˆ๋‹ค.

1. Flex Container

์†์„ฑ ์˜๋ฏธ
display flex container ์ •์˜
flex-flow flex-direction ์™€ flex-wrap์˜ ๋‹จ์ถ• ์†์„ฑ
flex-direction flex items์˜ ์ฃผ ์ถ•(main-axis) ์„ค์ •
flex-wrap flex items์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌถ์Œ(์ค„ ๋ฐ”๊ฟˆ) ์„ค์ •
justify-content ์ฃผ ์ถ•(max-axis) ์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ• ์„ค์ •
align-content ๊ต์ฐจ ์ถ•(cross-axis)์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ• ์„ค์ •(2์ค„ ์ด์ƒ)
align-items ๊ต์ฐจ ์ถ•(cross-axis)์—์„œ items์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •(1์ค„)

 

1-1. display

display: flex | inline-flex

  • items๊ฐ€ ์•„๋‹Œ container๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
  • display ์†์„ฑ์œผ๋กœ flex container๋ฅผ ์ •์˜ํ•œ๋‹ค.
๊ฐ’ ์˜๋ฏธ ์„ค๋ช…
flex block ํŠน์„ฑ์˜ flex container๋ฅผ ์ •์˜ block ์š”์†Œ์™€ ๊ฐ™์€ ์ˆ˜์ง์Œ“์ž„
๐Ÿ”ฝ
๐Ÿ”ฝ
inline-flex inline ํŠน์„ฑ์˜ flex container๋ฅผ ์ •์˜ inline(inline-block)์š”์†Œ์™€ ๊ฐ™์€ ์ˆ˜ํ‰ ์Œ“์ž„
โ–ถ๏ธโ–ถ๏ธ
  • display: flex

    • block ์š”์†Œ์™€ ๊ฐ™์€ ์„ฑํ–ฅ(์ˆ˜์ง ์Œ“์ž„)์„ ๊ฐ€์ง„๋‹ค.
  • display: inline-flex

    • inline(ilnine-block) ์š”์†Œ์™€ ๊ฐ™์€ ์„ฑํ–ฅ(์ˆ˜ํ‰ ์Œ“์ž„)์„ ๊ฐ€์ง„๋‹ค.

๐Ÿ”ฅ์ฃผ์˜

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ˆ˜์ง๊ณผ ์ˆ˜ํ‰ ์Œ“์ž„์€ items์ด ์•„๋‹ˆ๋ผ container์ด๋‹ค.

๋‘ ๊ฐ’์˜ ์ฐจ์ด๋Š” ๋‚ด๋ถ€์˜ items์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค!!


 

1-2. flex-flow

flex-flow: ์ฃผ์ถ• ์—ฌ๋Ÿฌ์ค„๋ฌถ์Œ;

์ด ์†์„ฑ์€ ๋‹จ์ถ• ์†์„ฑ์œผ๋กœ flex items์˜ ์ฃผ์ถ•(main-axis)์„ ์„ค์ •ํ•˜๊ณ  items์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌถ์Œ(์ค„ ๋ฐ”๊ฟˆ)๋„ ์„ค์ •ํ•œ๋‹ค.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
flex-direction items์˜ ์ฃผ์ถ•(main-axis)์„ ์„ค์ • row
flex-wrap items์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌถ์Œ(์ค„ ๋ฐ”๊ฟˆ) ์„ค์ • nowrap

 

 

1-2-1. flex-direction

flex-direction: ์ฃผ์ถ•;

items์˜ ์ฃผ ์ถ•(main-axis)์„ ์„ค์ •.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
row items๋ฅผ ์ˆ˜ํ‰์ถ•(์™ผ→์˜ค)์œผ๋กœ ํ‘œ์‹œ row
row-reverse items๋ฅผ row ๋ฐ˜๋Œ€ ์ถ•์œผ๋กœ ํ‘œ์‹œ  
column items๋ฅผ ์ˆ˜์ง์ถ•(์œ„→์•„๋ž˜)๋กœ ํ‘œ์‹œ  
column-reverse itmes๋ฅผ column์˜ ๋ฐ˜๋Œ€์ถ•์œผ๋กœ ํ‘œ์‹œ  
flex-direction: row;
flex-direction: row-reverse;
flex-direction: column;
flex-direction: column-reverse;

 

 

1-2-2. ์ฃผ ์ถ•(main-axis)๊ณผ ๊ต์ฐจ ์ถ•(cross-axis)

  • ๊ฐ’ row :: items๋ฅผ ์ˆ˜ํ‰์ถ•์œผ๋กœ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ์ฃผ ์ถ•์ด ์ˆ˜ํ‰ / ๊ต์ฐจ ์ถ•์€ ์ˆ˜์ง. (๋„ˆ๋น„)
  • ๊ฐ’ column :: itmes๋ฅผ ์ˆ˜์ง์ถ•์œผ๋กœ ํ‘œ์‹œํ•˜๋ฏ€๋กœ ์ฃผ ์ถ•์ด ์ˆ˜์ง / ๊ต์ฐจ ์ถ•์€ ์ˆ˜ํ‰. (๋†’์ด)

์ฆ‰, ๋ฐฉํ–ฅ(์ˆ˜ํ‰, ์ˆ˜์ง)์— ๋”ฐ๋ผ ์ฃผ ์ถ•๊ณผ ๊ต์ฐจ ์ถ•์ด ๋‹ฌ๋ผ์ง„๋‹ค.

์ฃผ ์ถ•(main-axis)๊ณผ ๊ต์ฐจ ์ถ•(cross-axis)

1-2-3. ์‹œ์ž‘์ (flex-start)๊ณผ ๋์ (flex-end)

์ฃผ ์ถ•์ด๋‚˜ ๊ต์ฐจ ์ถ•์˜ ์‹œ์ž‘ํ•˜๋Š” ์ง€์ ๊ณผ ๋๋‚˜๋Š” ์ง€์ ์„ ์ง€์นญ.

์—ญ์‹œ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๋‹ฌ๋ผ์ง„๋‹ค.

[์ฃผ ์ถ•] row์ผ ๋•Œ ์‹œ์ž‘์ ๊ณผ ๋์  / column์ผ ๋•Œ ์‹œ์ž‘์ ๊ณผ ๋์ 
[๊ต์ฐจ ์ถ•] row์ผ ๋•Œ ์‹œ์ž‘์ ๊ณผ ๋์  / column์ผ ๋•Œ ์‹œ์ž‘์ ๊ณผ ๋์ 

 

1-2-4. flex-wrap

flex-wrap: ์—ฌ๋Ÿฌ์ค„๋ฌถ์Œ;

items์˜ ์—ฌ๋Ÿฌ ์ค„ ๋ฌถ์Œ(์ค„ ๋ฐ”๊ฟˆ)์„ ์„ค์ •.

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
nowrap ๋ชจ๋“  items๋ฅผ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ฌถ์ง€ ์•Š์Œ(ํ•œ ์ค„ ํ‘œ์‹œ).
์ค„๋ฐ”๊ฟˆ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
nowrap
wrap items๋ฅผ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ฌถ์Œ.
์ค„๋ฐ”๊ฟˆ์„ ํ•œ๋‹ค.
 
wrap-reverse items๋ฅผ wrap์˜ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ฌถ์Œ.
์ค„๋ฐ”๊ฟˆ์„ ํ•œ๋‹ค.
 
flex-wrap: nowrap;
flex-wrap: wrap;
flex-wrap: wrap-reverse;

 

 

1-3. justify-content / ์ฃผ์ถ• ์ •๋ ฌ

justify-content: ์ •๋ ฌ๋ฐฉ๋ฒ•;

์ฃผ ์ถ•(main-axis)์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
flex-start items๋ฅผ ์‹œ์ž‘์ (flex-start)์œผ๋กœ ์ •๋ ฌ flex-start
flex-end itmes๋ฅผ ๋์ (flex-end)์œผ๋กœ ์ •๋ ฌ  
center items๋ฅผ ๊ฐ€์šด๋ฐ ์ •๋ ฌ  
space-between ์‹œ์ž‘ itme์€ ์‹œ์ž‘์ ์—, ๋งˆ์ง€๋ง‰ item์€ ๋์ ์— ์ •๋ ฌ๋˜๊ณ ,
๋‚˜๋จธ์ง€ items๋Š” ์‚ฌ์ด์— ๊ณ ๋ฅด๊ฒŒ ์ •๋ ฌ๋จ
 
space-around items๋ฅผ ๊ท ๋“ฑํ•œ ์—ฌ๋ฐฑ์„ ํฌํ•จํ•˜์—ฌ ์ •๋ ฌ  
space-evenly items์‚ฌ์ด์™€ ์–‘ ๋์— ๊ท ์ผํ•œ ๊ฐ„๊ฒฉ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
(IE, ์—ฃ์ง€ ์ง€์›์•ˆ๋จ)
 

space-evenly ์ฐธ๊ณ ํ•˜๊ธฐ

justify-content

 

1-4. align-content / ์—ฌ๋Ÿฌ ํ–‰ ์ •๋ ฌ

align-content: ์ •๋ ฌ๋ฐฉ๋ฒ•;

๊ต์ฐจ ์ถ•(cross-axis)์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ ฌ ๋ฐฉ๋ฒ• ์„ค์ •.

 

  • ์ฃผ์˜ํ•  ์ ์€ flex-wrap ์†์„ฑ์„ ํ†ตํ•ด items๊ฐ€ ์—ฌ๋Ÿฌ ์ค„(2์ค„ ์ด์ƒ)์ด๊ณ ,

์—ฌ๋ฐฑ์ด ์žˆ์„ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • items๊ฐ€ ํ•œ ์ค„ ์ผ ๊ฒฝ์šฐ align-items ์†์„ฑ์„ ์‚ฌ์šฉ.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
strech container์˜ ๊ต์ฐจ ์ถ•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด items์„ ๋Š˜๋ฆผ strech
flex-start items๋ฅผ ์‹œ์ž‘์ (flex-start)์œผ๋กœ ์ •๋ ฌ  
flex-end items ๋์ (flex-end)์œผ๋กœ ์ •๋ ฌ  
center items๋ฅผ ๊ฐ€์šด๋ฐ ์ •๋ ฌ  
space-between ์‹œ์ž‘ items์€ ์‹œ์ž‘์ ์—, ๋งˆ์ง€๋ง‰ item์€ ๋์ ์— ์ •๋ ฌ๋˜๊ณ ,
๋‚˜๋จธ์ง€ items๋Š” ์‚ฌ์ด์— ๊ณ ๋ฅด๊ฒŒ ์ •๋ ฌ๋จ
 
space-around items๋ฅผ ๊ท ๋“ฑํ•œ ์—ฌ๋ฐฑ์„ ํฌํ•จํ•˜์—ฌ ์ •๋ ฌ  
space-evenly items์‚ฌ์ด์™€ ์–‘ ๋์— ๊ท ์ผํ•œ ๊ฐ„๊ฒฉ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.
(IE, ์—ฃ์ง€ ์ง€์›์•ˆ๋จ)
 

space-evenly ์ฐธ๊ณ ํ•˜๊ธฐ

 

์—ฌ๊ธฐ์„œ ๊ฐ’ strech ๋Š” ๊ต์ฐจ์ถ•์— ํ•ด๋‹นํ•˜๋Š” ๋„ˆ๋น„(์†์„ฑ width || height)๊ฐ€
๊ฐ’์ด auto(๊ธฐ๋ณธ๊ฐ’)์ผ ๊ฒฝ์šฐ ๊ต์ฐจ ์ถ•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ๋Š˜์–ด๋‚œ๋‹ค.

auto ํ•˜๋Š” ์ด์œ ? ๋ถ€๋ชจ์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. 100%๋Š” ์ž์‹์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„์„œ container์˜ ์˜์—ญ ๋ฐ–์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.


align-content

 

 

1-5. align-items / ๊ต์ฐจ์ถ• ๋ฐฉํ–ฅ ์ •๋ ฌ

align-items: ์ •๋ ฌ๋ฐฉ๋ฒ•;

๊ต์ฐจ์ถ•(cross-axis)์ค‘์‹ฌ์œผ๋กœ items๋ฅผ ์ •๋ ฌ.

items๊ฐ€ ํ•œ ์ค„์ผ ๊ฒฝ์šฐ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 

์ฃผ์˜ํ•  ์ ์€ flow-wrap ์†์„ฑ์„ ํ†ตํ•ด items๊ฐ€ ์—ฌ๋Ÿฌ ์ค„(2์ค„ ์ด์ƒ, wrap)์ผ ๊ฒฝ์šฐ align-content ์†์„ฑ์ด ์šฐ์„ ์ด๋‹ค.

๋”ฐ๋ผ์„œ align-items๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด align-content ์†์„ฑ์„ ๊ธฐ๋ณธ๊ฐ’(strech)๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
stretch container์˜ ๊ต์ฐจ ์ถ•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด items๋ฅผ ๋Š˜๋ฆผ strech
flex-start items๋ฅผ ๊ฐ ์ค„์˜ ์‹œ์ž‘์ (flex-start)์œผ๋กœ ์ •๋ ฌ  
flex-end items๋ฅผ ๊ฐ ์ค„์˜ ๋์ (flex-end)์œผ๋กœ ์ •๋ ฌ  
center items๋ฅผ ๊ฐ€์šด๋ฐ ์ •๋ ฌ  
baseline items๋ฅผ ๋ฌธ์ž ๊ธฐ์ค€์„ ์— ์ •๋ ฌ  
align-item

A Complete Guide to Flexbox

 

 

 

2. Flex Items

flex item์„ ์œ„ํ•œ ์†์„ฑ์ด๋‹ค.

 

์†์„ฑ ์˜๋ฏธ
order flex item์˜ ์ˆœ์„œ๋ฅผ ์„ค์ •
flex flex-grow, flex-shrink, flex-basis์˜ ๋‹จ์ถ• ์†์„ฑ
flex-grow flex item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ •
flex-shrink flex item์˜ ๊ฐ์†Œ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ •
flex-basis flex item์˜ ๊ธฐ๋ณธ ๋„ˆ๋น„ ์„ค์ •
align-self ๊ต์ฐจ์ถ•์—์„œ item์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •

 

2-1. order

order: ์ˆœ์„œ;

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

HTML ๊ตฌ์กฐ์™€ ์ƒ๊ด€์—†์ด ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ์œ ์šฉ!

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
์ˆซ์ž item์˜ ์ˆœ์„œ๋ฅผ ์„ค์ • 0
order

 

2-2. flex

flex: ์ฆ๊ฐ€๋„ˆ๋น„ ๊ฐ์†Œ๋„ˆ๋น„ ๊ธฐ๋ณธ๋„ˆ๋น„;

item์˜ ๋„ˆ๋น„(์ฆ๊ฐ€, ๊ฐ์†Œ, ๊ธฐ๋ณธ) ์„ค์ •ํ•˜๋Š” ๋‹จ์ถ• ์†์„ฑ.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
flex-grow item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ • 0
flex-shrink item์˜ ๊ฐ์†Œ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ • 1
flex-basis item์˜ ๊ธฐ๋ณธ ๋„ˆ๋น„ ์„ค์ • auto

 

.item {
  flex: 1 1 20px; /* ์ฆ๊ฐ€๋„ˆ๋น„ ๊ฐ์†Œ๋„ˆ๋น„ ๊ธฐ๋ณธ๋„ˆ๋น„ */
  flex: 1 1; /* ์ฆ๊ฐ€๋„ˆ๋น„ ๊ฐ์†Œ๋„ˆ๋น„ */
  flex: 1 20px; /* ์ฆ๊ฐ€๋„ˆ๋น„ ๊ธฐ๋ณธ๋„ˆ๋น„ (๋‹จ์œ„์‚ฌ์šฉ์‹œ flex-basis๊ฐ€ ์ ์šฉ.) */
}

 

[์ฃผ์˜์‚ฌํ•ญ]

  • flex-grow๋ฅผ ์ œ์™ธํ•œ ๊ฐœ๋ณ„ ์†์„ฑ์€ ์ƒ๋žต ๊ฐ€๋Šฅ.

    • ๋งŒ์•ฝ flex: 1๋กœ ์ž‘์„ฑํ•˜๋ฉด flow-grow: 1;๊ณผ ๊ฐ™๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ๋‚˜๋จธ์ง€ ์†์„ฑ์€ ์ƒ๋žตํ–ˆ์œผ๋‹ˆ ๊ธฐ๋ณธ๊ฐ’ ์ ์šฉ๋˜์–ด flex-shrink: 1;, flex-basis: auto;์ผ ๊ฒƒ์ด๋‹ค?

    • ์•„๋‹ˆ๋‹ค!!

    • flex-basis์˜ ๊ธฐ๋ณธ๊ฐ’์€ auto์ด์ง€๋งŒ ๋‹จ์ถ• ์†์„ฑ์ธ flex์—์„œ ๊ทธ ๊ฐ’์„ ์ƒ๋žตํ•  ๊ฒฝ์šฐ 0์ด๋‹ค.

      ๋‹ค์‹œ ์ •๋ฆฌ !

      flex: 1; ํ˜น์€ flex: 1 1;์€ flex: 1 1 auto; ๊ฐ€ ์•„๋‹ˆ๋ผ,

      flex: 1 1 0;์ด๋‹ค.

    • ์ด ๋ถ€๋ถ„์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š์œผ๋ฉด ์—‰๋šฑํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ดˆ๋ž˜ํ•œ๋‹ค.

 

 

2-2-1. flex-grow

flex-grow: ์ฆ๊ฐ€๋„ˆ๋น„;

  • item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ •.
  • item์š”์†Œ๊ฐ€ container ์š”์†Œ ๋‚ด๋ถ€์—์„œ ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์˜ ์ •๋„๋ฅผ ์„ ์–ธ. ๋งŒ์•ฝ ํ˜•์ œ ์š”์†Œ๋กœ ๋ Œ๋”๋ง ๋œ ๋ชจ๋“  items์š”์†Œ๋“ค์ด ๋™์ผํ•œ flex-grow๊ฐ’์„ ๊ฐ€์ง€๋ฉด container ๋‚ด๋ถ€์—์„œ ๋™์ผํ•œ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›๋Š”๋‹ค. ํ•˜์ง€๋งŒ flex-grow ๊ฐ’์œผ๋กœ ๋‹ค๋ฅธ ์†Œ์ˆ˜๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ณต๊ฐ„๊ฐ’์„ ๋‚˜๋ˆ„์–ด ํ• ๋‹น๋ฐ›๋Š”๋‹ค.
  • flex-basis์˜ ๊ฐ’๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ.
  • flex-grow์—๋Š” ์ผ๋‹จ 0๋ณด๋‹ค ํฐ ๊ฐ’์ด ์„ธํŒ…๋˜๋ฉด ํ•ด๋‹น item์ด flexible box๋กœ ๋ณ€ํ•˜๊ณ  ์›๋ž˜์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ปค์ง€๋ฉฐ ๋นˆ ๊ณต๊ฐ„์„ ๋ฉ”์šฐ๊ฒŒ ๋œ๋‹ค.

๋ณดํ†ต flex-grow๋ฅผ ์‚ฌ์šฉํ•  ๋•, flex-shrink, flex-basis ์†์„ฑ์„ ใ…Ž๋งˆ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ชจ๋“  ๊ฐ’์ด ์„ค์ •๋˜์—ˆ์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด flex(์ถ•์–‘ํ˜•)๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
์ˆซ์ž item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ • 0

 

๋ชจ๋“  items์˜ ์ด ์ฆ๊ฐ€ ๋„ˆ๋น„(flow-grow)์—์„œ ๊ฐ item์˜ ์ฆ๊ฐ€ ๋„ˆ๋น„์˜ ๋น„์œจ๋งŒํผ ๋„ˆ๋น„๋ฅผ ๊ฐ€์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด item์ด 3๊ฐœ์ด๊ณ  ์ฆ๊ฐ€ ๋„ˆ๋น„๊ฐ€ ๊ฐ๊ฐ 1, 2, 1์ด๋ผ๋ฉด,
์ฒซ ๋ฒˆ์งธ item์˜ ์ด ๋„ˆ๋น„๋Š” 25%(1/4),
๋‘ ๋ฒˆ์งธ item์˜ ์ด ๋„ˆ๋น„๋Š” 50%(2/4),
์„ธ ๋ฒˆ์งธ item์˜ ์ด ๋„ˆ๋น„๋Š” 25%(1/4)๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.


์˜ˆ์ œ1 : felx-grow
์˜ˆ์ œ2 : flex-grow

 

๊ฐ ์•„์ดํ…œ์˜ ์ปจํ…์ธ ๊ฐ€ 'a', 'bbbbbbb', 'cc'๋กœ ์›๋ž˜์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— "์—ฌ๋ฐฑ์˜ ๋น„"๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

 

 

2-2-2. flex-shrink

flex-shrink: ๊ฐ์†Œ ๋„ˆ๋น„;

  • item์ด ๊ฐ์†Œํ•˜๋Š” ๋„ˆ๋น„์˜ ๋น„์œจ์„ ์„ค์ •.
  • ์ˆซ์ž๊ฐ€ ํฌ๋ฉด ๋” ๋งŽ์€ ๋„ˆ๋น„๊ฐ€ ๊ฐ์†Œ.
  • item ์š”์†Œ์˜ ํฌ๊ธฐ๊ฐ€ container ์š”์†Œ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํด ๋•Œ flex-shrink ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,

    ์„ค์ •๋œ ์ˆซ์ž๊ฐ’์— ๋”ฐ๋ผ container ์š”์†Œ ๋‚ด๋ถ€์—์„œ item ์š”์†Œ์˜ ํฌ๊ธฐ๊ฐ€ ์ถ•์†Œ๋œ๋‹ค.

๊ธฐ๋ณธ๊ฐ’์ด 0๋ณด๋‹ค ํฐ ๊ฐ’์ด ์„ธํŒ…๋˜๋ฉด ํ•ด๋‹น ์•„์ดํ…Œ์ด flexible Box๋กœ ๋ณ€ํ•˜๊ณ  flex-basis๋ณด๋‹ค ์ž‘์•„์ง„๋‹ค.

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
์ˆซ์ž item์˜ ๊ฐ์†Œ ๋„ˆ๋น„ ๋น„์œจ ์„ค์ • 1

 

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

์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋Š” ์š”์†Œ์˜ ๋„ˆ๋น„๋Š” width,height, flex-basis ๋“ฑ์œผ๋กœ ๋„ˆ๋น„๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

container์˜ ๋„ˆ๋น„๊ฐ€ ์ค„์–ด items์˜ ๋„ˆ๋น„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒฝ์šฐ, ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์‹œ์ž‘ํ•œ ์ง€์ ๋ถ€ํ„ฐ ์ค„์–ด๋“  ๊ฑฐ๋ฆฌ ๋งŒํผ ๊ฐ์†Œ ๋„ˆ๋น„ ๋น„์œจ์— ๋งž๊ฒŒ item์˜ ๋„ˆ๋น„๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด container์˜ ๋„ˆ๋น„๊ฐ€ ์ค„์–ด item์˜ ๋„ˆ๋น„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์‹œ์ž‘ํ•œ ์ง€์ ๋ถ€ํ„ฐ ์‹ค์ œ ์ค„์–ด๋“  ๊ฑฐ๋ฆฌ๊ฐ€ 90px์ผ ๋•Œ, ์š”์†Œ ๋„ˆ๋น„๊ฐ€ ๊ฐ™์€ item์ด 2๊ฐœ์ด๊ณ (200px) ์ง€์ •๋œ ๊ฐ์†Œ ๋„ˆ๋น„๊ฐ€ ๊ฐ๊ฐ 2์™€ 1์ด๋ผ๋ฉด, ์ฒซ ๋ฒˆ์งธ item์€ 90px์˜ 2/3์ธ 60px๋งŒํผ ๋„ˆ๋น„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ item์€ 90px์˜ 1/3์ธ 30px๋งŒํผ ๋„ˆ๋น„๊ฐ€ ๊ฐ์†Œํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ item์˜ ๋„ˆ๋น„๋Š” 200px - 60px = 140px, ๋‘ ๋ฒˆ์งธ item์˜ ๋„ˆ๋น„๋Š” 200px - 30px = 170px ์ด ๋˜์—ˆ๋‹ค.

 

๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ container์˜ ๋„ˆ๋น„๊ฐ€ ์ค„์–ด item์˜ ๋„ˆ๋น„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์‹œ์ž‘ํ•œ ์ง€์ ๋ถ€ํ„ฐ ์‹ค์ œ ์ค„์–ด๋“  ๊ฑฐ๋ฆฌ๊ฐ€ 90px์ผ ๋•Œ, ์š”์†Œ ๋„ˆ๋น„๊ฐ€ ๋‹ค๋ฅธ item์ด 2๊ฐœ์ด๊ณ  ์š”์†Œ ๋„ˆ๋น„๋Š” ๊ฐ๊ฐ 200px๊ณผ 100px์ด๊ณ , ์ง€์ •๋œ ๊ฐ์†Œ ๋„ˆ๋น„๊ฐ€ ๊ฐ๊ฐ 2์™€ 1์ด๋ผ๋ฉด, 200px * 2 = 400๊ณผ 100px * 1 = 100 . ์ฆ‰ ๊ฐ์†Œ ๋„ˆ๋น„๋Š” 4:1 ๋น„์œจ์ด๋ฉฐ, ์ฒซ ๋ฒˆ์งธ item์€ 90px์˜ 4/5์ธ 72px ๋งŒํผ ๋„ˆ๋น„๊ฐ€ ๊ฐ์†Œํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ item์€ 90px์˜ 1/5์ธ 18px ๋งŒํผ ๋„ˆ๋น„๊ฐ€ ๊ฐ์†Œํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ item์˜ ๋„ˆ๋น„๋Š” 200px - 72px = 128px, ๋‘ ๋ฒˆ์งธ item์˜ ๋„ˆ๋น„๋Š” 100px - 18px = 82px ์ด ๋˜์—ˆ๋‹ค.

 

์˜ˆ์ œ : flex-shrink

 

[ํ•˜๋‚˜๋” ์˜ˆ์ œ]

item ๊ณ ์ • ํฌ๊ธฐ๋Š” width๋กœ ์„ค์ •. container์— ๋”ฐ๋ผ 2๋ฒˆ ์งธ item์ด ๋ณ€ํ™”ํ•œ๋‹ค.

.container {
  display: flex;
  /* (1) width: 100%; */
  /* (2) width: 250px; */
}
.item:nth-child(1) {
  flex-shrink: 0;
  width: 100px;
}
.item:nth-child(2) {
  flex-grow: 1;
}

๊ฒฐ๊ณผ.

(1) container๊ฐ€ width: 100%; ์ผ ๋•Œ,

container ๋„ˆ๋น„ ๊ธฐ์ค€์œผ๋กœ item1์€ ๊ณ ์ • 100px์ด๋‹ค.

item2๋Š” width: 100% ์˜ํ–ฅ์œผ๋กœ item1์˜ ๋„ˆ๋น„๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋„ˆ๋น„๋ฅผ ์ฑ„์šด๋‹ค.

(2) container๊ฐ€ width: 250px; ์ผ ๋•Œ,

container ๋„ˆ๋น„ ๊ธฐ์ค€๊ณผ flex-shrink: 0; ๋กœ ์ธํ•ด item1์€ ๊ณ ์ • 100px์ด๋‹ค.

item2๋Š” 250px - 100px = 150px์ด ๋œ๋‹ค.

flex-shrink: 0; ๋•๋ถ„์— container๊ฐ€ ์•„๋ฌด๋ฆฌ ์ž‘์•„์ ธ๋„ ์ฒซ ๋ฒˆ์งธ item์˜ ๋„ˆ๋น„๋Š” 100px๋กœ ๊ณ ์ •๋œ๋‹ค.

 

 

2-2-3. flex-basis

flex-basis: ๊ธฐ๋ณธ๋„ˆ๋น„;

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

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
auto ๊ฐ€๋ณ€ item๊ณผ ๊ฐ™์€ ๋„ˆ๋น„ auto
๋‹จ์œ„ px, em, cm ๋“ฑ ๋‹จ์œ„๋กœ ์ง€์ •  
flex-basis

 

 

2-3. align-self

align-self: ์ •๋ ฌ๋ฐฉ๋ฒ•;

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

 

align-item๋Š” container ๋‚ด ๋ชจ๋“  items์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์„ค์ •.

ํ•„์š”์— ์˜ํ•ด ์ผ๋ถ€ item๋งŒ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ align-self๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

align-items ์†์„ฑ๋ณด๋‹ค ์šฐ์„ ์†์„ฑ์ด๋‹ค.

 

๊ฐ’ ์˜๋ฏธ ๊ธฐ๋ณธ๊ฐ’
auto container์˜ align-items ์†์„ฑ์„ ์ƒ์†๋ฐ›์Œ auto
strech container์˜ ๊ต์ฐจ์ถ•์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด item์„ ๋Š˜๋ฆผ  
flex-start item์„ ๊ฐ ์ค„์˜ ์‹œ์ž‘์ (flex-start)์œผ๋กœ ์ •๋ ฌ  
flex-end item์„ ๊ฐ ์ค„์˜ ๋์ (flex-end)์œผ๋กœ ์ •๋ ฌ  
center item์„ ๊ฐ€์šด๋ฐ ์ •๋ ฌ  
baseline item์„ ๋ฌธ์ž ๊ธฐ์ค€์„ ์— ์ •๋ ฌ  
align-item

 

 

2-4. order

order: ๋‚˜์—ด์ˆœ์„œ;

  • ์ˆซ์ž๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋จผ์ € ๋ฐฐ์น˜.
  • "์‹œ๊ฐ์ "์ˆœ์„œ ์ผ ๋ฟ, HTML ์ž์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ์ ‘๊ทผ์„ฑ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

.item:nth-child(1) { order: 3; } /* A */
.item:nth-child(2) { order: 1; } /* B */
.item:nth-child(3) { order: 2; } /* C */

/* ๊ฒฐ๊ณผ B C A ์ˆœ์œผ๋กœ ์ •๋ ฌ. */

 

 

2-5. z-index

z-index๋กœ Z์ถ• ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ˆซ์ž๊ฐ€ ํด์ˆ˜๋ก ์œ„๋กœ ์˜ฌ๋ผ์˜จ๋‹ค. (position์—์„œ์˜ z-index๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ.)

 

.item:nth-child(2) {
  z-index: 1;
  transform: scale(2);
}
/* z-index๋ฅผ ์„ค์ •์•ˆํ•˜๋ฉด 0์ด๋ฏ€๋กœ, 1๋งŒ ์„ค์ •ํ•ด๋„ ๋‚˜๋จธ์ง€ ์•„์ดํ…œ๋ณด๋‹ค ์œ„๋กœ ์˜ฌ๋ผ์˜จ๋‹ค. */

 

 

 

Reference

CSS Flex(Flexible Box)์™„๋ฒฝ๊ฐ€์ด๋“œ

1๋ถ„์ฝ”๋”ฉ :: ์ด๋ฒˆ์—์•ผ๋ง๋กœ CSS Flex๋ฅผ ์ตํ˜€๋ณด์ž

A Complete Guide to Flexbox

w3schools CSS Flexbox

๋ฐ˜์‘ํ˜•