Flexbox Layout

1. ๊ฐœ์š”

Flexbox Layout์€ ๋ชจ๋˜ ์›น์„ ์œ„ํ•˜์—ฌ ์ œ์•ˆ๋œ ๊ธฐ์กด layout๋ณด๋‹ค ๋” ์„ธ๋ จ๋œ ๋ฐฉ์‹์˜ ๋‹ˆ์ฆˆ์— ๋ถ€ํ•ฉํ•˜๊ธฐ ์œ„ํ•œ CSS3์˜ ์ƒˆ๋กœ์šด layout๋ฐฉ์‹์ด๋‹ค. ํ”Œ๋ž™์Šค ๋ฐ•์Šค ๋ ˆ์ด์•„์›ƒ์€ ๋น„๊ต์  ์ตœ๊ทผ์— ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ด๋ฏ€๋กœ ๊ธฐ์กด์˜ CSS ์†์„ฑ ์™ธ์— ์ƒˆ๋กœ ๊ณต๋ถ€ํ•ด์•ผ ํ•  ์†์„ฑ์ด ์žˆ๋‹ค.


2. ์šฉ์–ด ์ •๋ฆฌ

Flex Layout Box Model
  • ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ(๋ถ€๋ชจ ๋ฐ•์Šค): ํ”Œ๋ ‰์Šค ๋ฐ•์Šค ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•  ๋Œ€์ƒ์„ ๋ฌถ๋Š” ์š”์†Œ์ด๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” ๋…ธ๋ผ์ƒ‰ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง„ ํฐ ๋ฐ•์Šค๊ฐ€ ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ์— ํ•ด๋‹น๋œ๋‹ค.

  • ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ(์ž์‹ ๋ฐ•์Šค, flex-item): ํ”Œ๋ ‰์Šค ๋ฐ•์Šค ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•  ๋Œ€์ƒ์ด๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์—์„œ๋Š” ํ•˜์–€์ƒ‰ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง„ ์ž‘์€ ๋ฐ•์Šค๊ฐ€ ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์— ํ•ด๋‹น๋œ๋‹ค.

  • ์ฃผ์ถ•(main axis): ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉํ–ฅ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์ด๋ฉฐ ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค. ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์˜ ๋ฐฐ์น˜๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์œ„์น˜๋ฅผ '์ฃผ์ถ• ์‹œ์ž‘์ ', ๋๋‚˜๋Š” ์œ„์น˜๋ฅผ '์ฃผ์ถ• ๋์ '์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ๊ต์ฐจ์ถ•(cross axis): ์ฃผ์ถ•๊ณผ ๊ต์ฐจํ•˜๋Š” ๋ฐฉํ–ฅ์„ ๋งํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค. ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์˜ ๋ฐฐ์น˜๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์œ„์น˜๋ฅผ '๊ต์ฐจ์ถ• ์‹œ์ž‘์ ', ๋๋‚˜๋Š” ์œ„์น˜๋ฅผ '๊ต์ฐจ์ถ• ๋์ '์ด๋ผ๊ณ  ํ•œ๋‹ค.


3. Usage

ํ”Œ๋ ‰์Šค ๋ฐ•์Šค ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์›น ์ฝ˜ํ…์ธ ๋ฅผ ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฌถ์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ฐฐ์น˜ํ•  ์›น ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๋ถ€๋ชจ ์š”์†Œ์˜ display ์†์„ฑ์— flex๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

.flex-container {
  display: flex;
}

๋ถ€๋ชจ ์š”์†Œ๊ฐ€ inline ์š”์†Œ์ธ ๊ฒฝ์šฐ inline-flex์„ ์ง€์ •ํ•œ๋‹ค.

.flex-container {
  display: inline-flex;
}

Flexbox Layout๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” flex ๋˜๋Š” inline-flex๋Š” ๋ถ€๋ชจ ์š”์†Œ์— ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์•ผํ•˜๋ฉฐ ์ž์‹ ์š”์†Œ๋Š” ์ž๋™์ ์œผ๋กœ flex item์ด ๋œ๋‹ค.


4. Flexbox container ์†์„ฑ

4.1 flex-direction

ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์„ ๋ฐฐ์น˜ํ•˜๋Š” ์ฃผ์ถ•(main axis) ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•œ๋‹ค.

์•„๋ž˜๋Š” flex-direction์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’๊ณผ ์„ค๋ช…์ด๋‹ค.

์ข…๋ฅ˜
์„ค๋ช…

row

์ฃผ์ถ•์„ ๊ฐ€๋กœ๋กœ ์ง€์ •ํ•˜๊ณ  ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.(๊ธฐ๋ณธ๊ฐ’)

row-reverse

์ฃผ์ถ•์„ ๊ฐ€๋กœ๋กœ ์ง€์ •ํ•˜๊ณ  ๋ฐ˜๋Œ€๋กœ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

column

์ฃผ์ถ•์„ ์„ธ๋กœ๋กœ ์ง€์ •ํ•˜๊ณ  ์œ„์ชฝ์—์„œ ์•„๋ž˜์ชฝ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

column-reverse

์ฃผ์ถ•์„ ์„ธ๋กœ๋กœ ์ง€์ •ํ•˜๊ณ  ์•„๋ž˜์ชฝ์—์„œ ์œ„์ชฝ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      div {
        font-size: 20px;
        font-weight: 700;
      }
      .box {
        background-color: yellow;
        width: 60px;
        height: 60px;
        text-align: center;
        line-height: 60px;
        margin: 10px;
      }
      .row {
        display: flex;
        flex-direction: row;
      }
      .row-reverse {
        display: flex;
        flex-direction: row-reverse;
      }
      .column {
        display: flex;
        flex-direction: column;
      }
      .column-reverse {
        display: flex;
        flex-direction: column-reverse;
      }
    </style>
  </head>
  <body>
    <div>
      row
      <div class="row">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
      </div>
    </div>
    <div>
      row-reverse
      <div class="row-reverse">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
      </div>
    </div>
    <div>
      column
      <div class="column">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
      </div>
    </div>
    <div>
      column-reverse
      <div class="column-reverse">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
      </div>
    </div>
  </body>
</html>
flex-direction

4-2 flex-wrap

flex-wrap ํ”„๋กœํผํ‹ฐ๋Š” ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ ๋„ˆ๋น„๋ณด๋‹ค ๋งŽ์€ ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์ด ์žˆ์„ ๊ฒฝ์šฐ ์ค„์„ ๋ฐ”๊ฟ€์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•œ๋‹ค.

์•„๋ž˜๋Š” flex-wrap์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ’๊ณผ ์„ค๋ช…์ด๋‹ค.

์ข…๋ฅ˜
์„ค๋ช…

nowrap

ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์„ ํ•œ ์ค„์— ํ‘œ์‹œํ•œ๋‹ค.(๊ธฐ๋ณธ๊ฐ’)

warp

ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ์ค„์— ํ‘œ์‹œํ•œ๋‹ค.

wrap-reverse

ํ”Œ๋ ˆ์Šค ํ•ญ๋ชฉ์„ ์—ฌ๋Ÿฌ ์ค„์— ํ‘œ์‹œํ•˜๋˜, ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๋ฐ”๋€๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      div {
        font-size: 20px;
        font-weight: 700;
      }
      .box {
        background-color: yellow;
        width: 200px;
        height: 60px;
        text-align: center;
        line-height: 60px;
        margin: 10px;
      }
      .nowrap {
        display: flex;
        flex-wrap: nowrap;
      }
      .wrap {
        display: flex;
        flex-wrap: wrap;
      }
      .wrap-reverse {
        display: flex;
        flex-wrap: wrap-reverse;
      }
    </style>
  </head>
  <body>
    <div>
      nowrap
      <div class="nowrap">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
        <div class="box">7</div>
      </div>
    </div>
    <div>
      wrap
      <div class="wrap">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
        <div class="box">7</div>
      </div>
    </div>
    <div>
      wrap-reverse
      <div class="wrap-reverse">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
        <div class="box">7</div>
      </div>
    </div>
  </body>
</html>
flex-wrap

4-3. flex-flow

flex-flow ํ”„๋กœํผํ‹ฐ๋Š” flex-direction ํ”„๋กœํผํ‹ฐ์™€ flex-wrap ํ”„๋กœํผํ‹ฐ๋ฅผ ๋™์‹œ์— ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ shorthand์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ row nowarp์ด๋‹ค.

์‚ฌ์šฉ๋ฒ• flex-flow: <flex-direction> || <flex-wrap>;


4-4 justify-content

justify-content ํ”„๋กœํผํ‹ฐ๋Š” ์ฃผ์ถ•(main axis)์„ ๊ธฐ์ค€์œผ๋กœ flex item์„ ์ˆ˜ํ‰ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•œ๋‹ค.

flex-direction: column;์œผ๋กœ ์ธํ•ด ์ฃผ์ถ•์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์กฐ์‹ฌํ•˜์ž.

์•„๋ž˜๋Š” justify-content์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’๊ณผ ์„ค๋ช…์ด๋‹ค.

์ข…๋ฅ˜
์„ค๋ช…

flex-start

์ฃผ์ถ•์˜ ์‹œ์ž‘์ ์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

flex-end

์ฃผ์ถ•์˜ ๋์ ์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

center

์ฃผ์ถ•์˜ ์ค‘์•™์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

space-between

์ฒซ ๋ฒˆ์žฌ ํ•ญ๋ชฉ๊ณผ ๋ ํ•ญ๋ชฉ์„ ์ฃผ์ถ•์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์— ๋ฐฐ์น˜ํ•œ ํ›„ ๋‚˜๋จธ์ง€ ํ•ญ๋ชฉ์€ ๊ทธ ์‚ฌ์ด์— ๊ฐ™์€ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

space-around

๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ฃผ์ถ•์— ๊ฐ™์€ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      div {
        font-size: 20px;
        font-weight: 700;
      }
      .parents {
        margin-bottom: 10px;
      }
      .flex-container {
        background-color: green;
      }
      .box {
        background-color: yellow;
        width: 200px;
        height: 60px;
        text-align: center;
        line-height: 60px;
        margin: 10px;
      }
      .flex-start {
        display: flex;
        justify-content: flex-start;
      }
      .flex-end {
        display: flex;
        justify-content: flex-end;
      }
      .center {
        display: flex;
        justify-content: center;
      }
      .space-between {
        display: flex;
        justify-content: space-between;
      }
      .space-around {
        display: flex;
        justify-content: space-around;
      }
    </style>
  </head>
  <body>
    <div class="parents">
      flex-start
      <div class="flex-start flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      flex-end
      <div class="flex-end flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      center
      <div class="center flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      space-between
      <div class="space-between flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      space-around
      <div class="space-around flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
  </body>
</html>

justify-content


4-5 align-items

align-items ํ”„๋กœํผํ‹ฐ๋Š” ์ˆ˜์ง ๋ฐฉํ–ฅ(cross axis)์„ ๊ธฐ์ค€์œผ๋กœ flex item์„ ์ •๋ ฌํ•œ๋‹ค. align-items ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋“  flex-item์— ์ ์šฉ๋œ๋‹ค.

์•„๋ž˜๋Š” align-items์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’๊ณผ ์„ค๋ช…์ด๋‹ค.

์ข…๋ฅ˜
์„ค๋ช…

flex-start

๊ต์ฐจ์ถ•์˜ ์‹œ์ž‘์ ์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

flex-end

๊ต์ฐจ์ถ•์˜ ๋์ ์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

center

๊ต์ฐจ์ถ•์˜ ์ค‘์•„์— ๋ฐฐ์น˜ํ•œ๋‹ค.

baseline

๊ต์ฐจ์ถ•์˜ ๋ฌธ์ž ๊ธฐ์ค€์„ ์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

stretch

ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์„ ๋Š˜๋ ค ๊ต์ฐจ์ถ•์— ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋ฐฐ์น˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      div {
        font-size: 20px;
        font-weight: 700;
      }
      .parents {
        margin-bottom: 10px;
        background-color: green;
        color: white;
      }
      .flex-container {
        min-height: 120px;
        border-top: 2px solid black;
        padding: 0;
        margin: 0;
        color: green;
      }
      .box {
        background-color: yellow;
        width: 200px;
        text-align: center;
        line-height: 60px;
        margin: 0px 10px;
      }
      .flex-start {
        display: flex;
        align-items: flex-start;
      }
      .flex-end {
        display: flex;
        align-items: flex-end;
      }
      .center {
        display: flex;
        align-items: center;
      }
      .baseline {
        display: flex;
        align-items: baseline;
      }
      .stretch {
        display: flex;
        align-items: stretch;
      }
    </style>
  </head>
  <body>
    <div class="parents">
      flex-start
      <div class="flex-start flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      flex-end
      <div class="flex-end flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      center
      <div class="center flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      baseline
      <div class="baseline flex-container">
        <div class="box" style="padding-top: 10px">1</div>
        <div class="box" style="height: 80px">2</div>
        <div class="box" style="font-size: 32px">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      stretch
      <div class="stretch flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
  </body>
</html>
align-items

4-6. align-content

flex container์˜ cross axis๋ฅผ ๊ธฐ์ค€์œผ๋กœ flex item์„ ์ˆ˜์ง ์ •๋ ฌํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ justify-content ํ”„๋กœํผํ‹ฐ๋Š” flex container์˜ main aixs๋ฅผ ๊ธฐ์ค€์œผ๋กœ flex item์„ ์ˆ˜ํ‰ ์ •๋ ฌํ•œ๋‹ค.

์ฆ‰, ์ฃผ์ถ•์—์„œ ์ค„ ๋ฐ”๊ฟˆ์ด ์ƒ๊ฒจ์„œ flex item์„ ์—ฌ๋Ÿฌ ์ค„๋กœ ํ‘œ์‹œํ•  ๋•Œ align-content ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ต์ฐจ์ถ•์—์„œ flex item์˜ ๊ฐ„๊ฒฉ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜๋Š” align-content์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’๊ณผ ์„ค๋ช…์ด๋‹ค.

์ข…๋ฅ˜
์„ค๋ช…

flex-start

๊ต์ฐจ์ถ•์˜ ์‹œ์ž‘์ ์—์„œ ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

flex-end

๊ต์ฐจ์ถ•์˜ ๋์ ์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

center

๊ต์ฐจ์ถ•์˜ ์ค‘์•™์— ๋งž์ถฐ ๋ฐฐ์น˜ํ•œ๋‹ค.

space-between

์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ๊ณผ ๋ ํ•ญ๋ชฉ์„ ๊ต์ฐจ์ถ•์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์— ๋งž์ถ”๊ณ  ๋‚˜๋จธ์ง€ ํ•ญ๋ชฉ์€ ๊ทธ ์‚ฌ์ด์— ๊ฐ™์€ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

space-around

๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ต์ฐจ์ถ•์— ๊ฐ™์€ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.

stretch

ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์„ ๋Š˜๋ ค์„œ ๊ต์ฐจ์ถ•์— ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋ฐฐ์น˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      div {
        font-size: 20px;
        font-weight: 700;
      }
      .parents {
        margin-bottom: 10px;
        background-color: green;
        color: white;
      }
      .flex-container {
        min-height: 160px;
        border-top: 2px solid black;
        padding: 0;
        margin: 0;
        color: green;
      }
      .box {
        background-color: yellow;
        width: 200px;
        text-align: center;
        line-height: 60px;
        margin: 0px 10px;
      }
      .box:nth-child(1) {
        margin-bottom: 10px;
      }
      .box:nth-child(2) {
        margin-bottom: 10px;
      }
      .flex-start {
        display: flex;
        flex-wrap: wrap;
        align-content: flex-start;
      }
      .flex-end {
        display: flex;
        flex-wrap: wrap;
        align-content: flex-end;
      }
      .center {
        display: flex;
        flex-wrap: wrap;
        align-content: center;
      }
      .sapce-between {
        display: flex;
        flex-wrap: wrap;
        align-content: space-between;
      }
      .space-around {
        display: flex;
        flex-wrap: wrap;
        align-content: space-around;
      }
      .stretch {
        display: flex;
        flex-wrap: wrap;
        align-content: stretch;
      }
    </style>
  </head>
  <body>
    <div class="parents">
      flex-start
      <div class="flex-start flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      flex-end
      <div class="flex-end flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      center
      <div class="center flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      sapce-between
      <div class="sapce-between flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      space-around
      <div class="space-around flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
    <div class="parents">
      stretch
      <div class="stretch flex-container">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
      </div>
    </div>
  </body>
</html>
align-content1
align-content2

5. Flexbox item ์†์„ฑ

5-1. order

flex item์˜ ๋ฐฐ์น˜ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•œ๋‹ค. HTML ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  order ํ”„๋กœํผํ‹ฐ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„๋‹จํžˆ ์žฌ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ ๋ฐฐ์น˜ ์ˆœ์„œ๋Š” flex container์— ์ถ”๊ฐ€๋œ ์ˆœ์„œ์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ด๋‹ค.

์‚ฌ์šฉ๋ฒ• order: <์ •์ˆ˜๊ฐ’>

.flex-item {
  order: 2;
}

5-2. flex-grow

flex item์˜ ๋„ˆ๋น„์— ๋Œ€ํ•œ ํ™•๋Œ€ ์ธ์ž๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ด๊ณ  ์Œ์ˆ˜๊ฐ’์€ ๋ฌดํšจํ•˜๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      .flex-container {
        display: flex;
        justify-content: space-around;
      }
      .box {
        height: 120px;
        background-color: yellow;
      }
      .box:not(:last-child) {
        margin-right: 10px;
      }
      .box:not(:nth-child(2)) {
        flex-grow: 1;
      }
      .box:nth-child(2) {
        flex-grow: 3;
      }
    </style>
  </head>
  <body>
    <div class="flex-container">
      <div class="box">1</div>
      <div class="box">2 / flex-grow: 3</div>
      <div class="box">3</div>
      <div class="box">4</div>
    </div>
  </body>
</html>
flex-grow

5-3. flex-shrink

flex item์˜ ๋„ˆ๋น„์— ๋Œ€ํ•œ ์ถ•์†Œ ์ธ์ž๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1์ด๊ณ  ์Œ์ˆ˜๊ฐ’์€ ๋ฌดํšจํ•˜๋‹ค. 0๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ถ•์†Œ๊ฐ€ ํ•ด์ œ๋˜์–ด ์›๋ž˜์˜ ๋„ˆ๋น„๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      .flex-container {
        display: flex;
        justify-content: space-around;
      }
      .box {
        width: 300px;
        height: 120px;
        background-color: yellow;
      }
      .box:not(:last-child) {
        margin-right: 10px;
      }
      .box:nth-child(2) {
        flex-shrink: 0;
      }
      .box:nth-child(3) {
        flex-shrink: 2;
      }
    </style>
  </head>
  <body>
    <div class="flex-container">
      <div class="box">1</div>
      <div class="box">2 / flex-shrink: 0</div>
      <div class="box">3 / flex-shrink: 2</div>
      <div class="box">4</div>
    </div>
  </body>
</html>
flex-shrink

5-4. flex-basis

flex item์˜ ๋„ˆ๋น„ ๊ธฐ๋ณธ๊ฐ’์„ px, % ๋“ฑ์˜ ๋‹จ์œ„๋กœ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ auto์ด๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      .flex-container {
        display: flex;
        justify-content: space-around;
      }
      .box {
        width: 100px;
        height: 120px;
        background-color: yellow;
      }
      .box:not(:last-child) {
        margin-right: 10px;
      }
      .box:nth-child(2) {
        flex-basis: 500px;
      }
      .box:nth-child(3) {
        flex-basis: 50%;
      }
    </style>
  </head>
  <body>
    <div class="flex-container">
      <div class="box">1 / flex-basis: auto => 100px</div>
      <div class="box">2 / flex-basis: 500px</div>
      <div class="box">3 / flex-basis: 50%</div>
      <div class="box">4 / flex-basis: auto => 100px</div>
    </div>
  </body>
</html>
flex-basis

5-5. flex

flex-grow, flex-shrink, flex-basis ํ”„๋กœํผํ‹ฐ์˜ shorthand์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0 1 auto์ด๋‹ค.

W3C์—์„œ๋Š” ์ด ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.


5-6. align-self

align-item ์†์„ฑ์€ ๊ต์ฐจ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ํ”Œ๋ ‰์Šค ํ•ญ๋ชฉ์˜ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜์ง€๋งŒ ๊ทธ์ค‘์—์„œ ํŠน์ • ํ•ญ๋ชฉ๋งŒ ์ง€์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด align-self ์†์„ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค. align-item ํ”„๋กœํผํ‹ฐ๋ณด๋‹ค ์šฐ์„ ํ•˜์—ฌ ๊ฐœ๋ณ„ flex item์„ ์ •๋ ฌํ•œ๋‹ค.

align-self ํ”„๋กœํผํ‹ฐ์—์„œ ์‚ฌ์šฉํ•œ ๊ฐ’์€ align-items ํ”„๋กœํผํ‹ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’๊ณผ ๊ฐ™๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <style>
      .flex-container {
        display: flex;
        justify-content: space-around;
        height: 600px;
        background-color: aliceblue;
      }
      .box {
        width: 100px;
        padding: 60px;
        background-color: yellow;
      }
      .box:not(:last-child) {
        margin-right: 10px;
      }
      .box:nth-child(1) {
        align-self: flex-start;
      }
      .box:nth-child(2) {
        align-self: flex-end;
      }
      .box:nth-child(3) {
        align-self: center;
      }
      .box:nth-child(4) {
        align-self: stretch;
      }
    </style>
  </head>
  <body>
    <div class="flex-container">
      <div class="box">1 / align-self: flex-start</div>
      <div class="box">2 / align-self: flex-end</div>
      <div class="box">3 / align-self: center</div>
      <div class="box">4 / align-self: stretch</div>
    </div>
  </body>
</html>
align-self

6. Conclusion

flex-grow๋Š” ์ฒ˜์Œ ์จ๋ณด๋Š” ํ”„๋กœํผํ‹ฐ์ด๋‹ค. ๊ต‰์žฅํžˆ ์‹ ๊ธฐํ–ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋ฅผ๋“ค์–ด box ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ div๋“ค์˜ ๋„ˆ๋น„๋ฅผ 100%๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ flex-grow๋ฅผ 1๋กœ ์ง€์ •ํ•˜๋ฉด ์ „์ฒด ๋„ˆ๋น„๋ฅผ ๋ชจ๋‘ ๋™๋“ฑํ•˜๊ฒŒ ์ฐจ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0 ์ด๋ฏ€๋กœ ๋”ฑ ์ž์‹ ์˜ ์š”์†Œ๋งŒํผ๋งŒ ๋„ˆ๋น„๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ flex-shrink๊ณผ flex-basis๋„ ์ด๋ฒˆ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์ฒ˜์Œ ์จ๋ณด๋Š” ํ”„๋กœํผํ‹ฐ์˜€๋‹ค. flex๋Š” grid๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์ „๊นŒ์ง€ ์ž์ฃผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ grid๋ฅผ ๋ฐฐ์šฐ๊ณ  ๋‚˜์„œ๋Š” ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋งŽ์ด ์ค„์—ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ ๋ชจ๋‘ CSS์—์„œ ์ค‘์š”ํ•œ ๋‚ด์šฉ์ด๋‹ˆ ํ•„์š”ํ•œ ์ƒํ™ฉ์— ๋งž์ถฐ ์ž˜ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.


์ฐธ๊ณ 

poiemaweb 2-20 ํ”Œ๋ ‰์Šค ๋ฐ•์Šค ๋ ˆ์ด์•„์›ƒ ๋„์„œ - HTML + CSS + ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์›น ํ‘œ์ค€์˜ ์ •์„


๐Ÿ‘†

๐Ÿ“… 2022-07-24

Last updated