โฐ [Ver1] 30๋ถ„ ๊ฐœ๋ฐœ ๋ฐ ํšŒ๊ณ  - FlexBox

โœŒ๐Ÿป ํšŒ๊ณ 

์ธํ”„๋Ÿฐ ๋งŒ์šฐ์ ˆ ์ด๋ฒคํŠธ ๋•๋ถ„์— ๋‹จ๋ˆ 1,000์›์— ํšจ๋นˆ๋‹˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ๋น„ํŠธ์ฝ”์ธ, ๋„์ปค ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐ•์˜๋ฅผ ์“ธ์–ด ๋‹ด์•˜๋‹ค.

๋•๋ถ„์— ๊ฐ•์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž”๋œฉ ๋Š˜์–ด๋‚ฌ๊ณ , ๋ณต์Šต๋„ ํ•  ๊ฒธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ํŒŒํŠธ๋ฅผ ๋‹ค์‹œ ๋“ฃ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ…

 

๋ฌธ์ œ๋Š”, ๋จธ๋ฆฟ์†์— ์˜จ์ข…์ผ “์˜ค๋Š˜ 30๋ถ„ ํ”„๋กœ์ ํŠธ๋Š” ๋ญ˜ ํ•˜์ง€?” ์ด ์ƒ๊ฐ๋งŒ ๋งด๋Œ์•˜๋‹ค๋Š” ๊ฑฐ๋‹ค.

์ด์ œ ๋ง‰ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ๋ฒŒ์จ๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ๊ฐ€ ์—†์–ด์„œ ํ™•์žฅํ•˜๊ธฐ ๋ง‰๋ง‰ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค๊ณ ,

‘ํ˜น์‹œ ์ž‘์‹ฌ์‚ผ์ผ๋กœ ๋๋‚˜๋Š” ๊ฑฐ ์•„๋ƒ?’ ํ•˜๋Š” ๋ถˆ์•ˆํ•จ๋„ ์Šค์ณค๋‹ค.

 

๊ทธ๋ž˜๋„ ๋งˆ์Œ์„ ๋‹ค์žก์•˜๋‹ค.

“์‚ฌ์†Œํ•œ ๊ฑฐ๋ผ๋„ ํ•ด๋ณด์ž. ๊ฒฐ๊ตญ์—” ๋‚˜๋Š” ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชฉํ‘œ์ž–์•„”

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐฑ์—”๋“œ๋„ ์–ธ์  ๊ฐ€๋Š” ๋ถ€๋”ชํ˜€์•ผ ํ•  ๋ถ€๋ถ„์ด๋‹ค.

 

์šฐ์„  ๋จธ๋ฆฟ์†์„ ์Šค์ณ ์ง€๋‚˜๊ฐ„ ๊ธฐ๋Šฅ ์•„์ด๋””์–ด ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ, ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ๋ฐฉ๋ช…๋ก,

๊ทธ๋ฆฌ๊ณ  ์นด๋“œ ํ˜•ํƒœ์˜ ์„น์…˜์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ๋ Œ๋”๋งํ•˜๋Š” ๊ธฐ๋Šฅ ๊ฐ™์€ ๊ฒƒ๋“ค์ด๋‹ค.

 

๋ฒˆ์™ธ๋กœ, ์š”์ฆ˜์€ ์Šต๊ด€์„ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ๋งˆ์Œ์œผ๋กœ

1์ผ 1๋ฉด์ ‘ ์งˆ๋ฌธ ํ•™์Šต, 1์ผ 1์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ ํ’€์ด ๊ฐ™์€ ๊ฑธ ์กฐ๊ธˆ์”ฉ ์ถ”๊ฐ€ํ•ด๋ดค๋‹ค.

์†”์งํžˆ ๋งํ•˜๋ฉด… ํ•  ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋Š” ๋А๋‚Œ์ด ๋“ค๊ธด ํ•œ๋‹ค.

๊ทธ๋ž˜๋„ ์ง€๊ธˆ์€ “์ผ๋‹จ ํ•ด๋ณด์ž”๋Š” ์ž์„ธ๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ˆ๊นŒ, ๋ฌด๋ฆฌํ•˜์ง€ ์•Š๋Š” ์„ ์—์„œ ๋„์ „ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

์ด ๊ธ€์„ ์“ฐ๋Š” ์ง€๊ธˆ๋„, ํ•œํŽธ์œผ๋กœ๋Š” “์˜ค๋Š˜์€ ๊ทธ๋ƒฅ ์Šคํ‚ตํ• ๊นŒ?” ํ•˜๋Š” ์œ ํ˜น์ด ์‚ด์ง ์Šค์ณค๋‹ค.

(์ž‘์‹ฌ์ด์ผ์€ ์•ˆ๋ผ...)์•„์ง ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜์ด๋ผ๋Š” ๊ฑธ ํ•‘๊ณ„ ์‚ผ์•„์„œ๋ผ๋„

“์•„์ฃผ ์‚ฌ์†Œํ•œ ๊ฑฐ๋ผ๋„ ํ•ด๋ณด์ž.”๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์˜ 30๋ถ„ ํ”„๋กœ์ ํŠธ๋Š” ๋ฐฉ๋ช…๋ก ๋งŒ๋“ค๊ธฐ๋กœ ์ •ํ–ˆ๋‹ค.

๊ฑฐ์ฐฝํ•œ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ž„์‹œ๋กœ๋ผ๋„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ฐฝ๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

“์ด๋Ÿฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋˜๋ฉด ์ข‹๊ฒ ์–ด์š”.”

“์ด ๊ธฐ๋Šฅ ๋ญ”๊ฐ€ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.”

“์ด๋Ÿฐ ์•„์ด๋””์–ด๋Š” ์–ด๋–จ๊นŒ์š”?”

 

์ด๋Ÿฐ ๋ฉ”์‹œ์ง€๋“ค์„ ๊ฐ€๋ณ๊ฒŒ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด,

๊ธฐํš?์ถ”๊ฐ€๊ธฐ๋Šฅ์„ ์ƒ๊ฐํ•˜๋Š”๊ฑด ์กฐ๊ธˆ ๋œ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

 

์Œ… ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ๋“ ํ˜„์‹ค์ ์ธ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ๋– ์˜ฌ๋ž๋‹ค.

๋ฐฑ์—”๋“œ๊ฐ€ ์—†๋Š”๋ฐ, ์‚ฌ๋žŒ๋“ค์˜ ํ”ผ๋“œ๋ฐฑ ๋ฐ์ดํ„ฐ๋ฅผ ๋„๋Œ€์ฒด ์–ด๋””์— ์ €์žฅํ•˜์ง€?

 

์ฐพ์•„๋ณด๋‹ˆ Firebase, Supabase ๊ฐ™์€ BaaS(Backend as a Service)๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์†”์งํžˆ ๋งํ•˜๋ฉด… ์จ๋ณธ ์ ๋„ ์—†๊ณ , ์ •ํ™•ํ•œ ๋™์ž‘ ์›๋ฆฌ๋„ ์•„์ง ์ž˜ ๋ชจ๋ฅธ๋‹ค.

 

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ์š•์‹ฌ๋‚ด์ง€ ์•Š๊ณ  UI๋งŒ ๋จผ์ € ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋‚ด์ผ์€ Firebase์™€ Supabase ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ

๊ณต์‹ ๋ฌธ์„œ๋„ ์ฝ๊ณ , ๊ฐ„๋‹จํ•œ ์—ฐ๊ฒฐ๋ถ€ํ„ฐ ์‹œ๋„ํ•ด๋ณผ ๊ณ„ํš์ด๋‹ค.

(๊ทธ๋ž˜๋„ ์˜ค๋Š˜ UI ๋งŒ๋“  ๊ฑฐ๋‹ˆ๊นŒ ํ”„๋กœ์ ํŠธ ํ•œ ๊ฑฐ ๋งž์Œ ใ…Ž)

 

๊ทธ๋Ÿฐ๋ฐ ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ํšŒ๊ณ  ์“ฐ๋Š” ๋ฐ๋งŒ 10๋ถ„ ์ด์ƒ์€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋Ÿฐ ํšŒ๊ณ  ๊ธ€๋ฟ ์•„๋‹ˆ๋ผ, ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐฐ์šด์ ๋„ ์ •๋ฆฌ ํ•ด์•ผํ•˜๋‹ˆ๊นŒ..

 

“30๋ถ„ ํ”„๋กœ์ ํŠธ”๋ฅผ “45๋ถ„ ํ”„๋กœ์ ํŠธ”๋กœ ์Šน๊ฒฉ(?)์‹œ์ผœ์•ผ ํ•˜๋‚˜...


๐Ÿ“š ์ •๋ฆฌ

Flexbox

  • Flexbox๋Š” CSS์—์„œ 1์ฐจ์›(๊ฐ€๋กœ or ์„ธ๋กœ) ๋ฐฉํ–ฅ์œผ๋กœ ์•„์ดํ…œ๋“ค์„ ์ •๋ ฌํ•˜๊ณ  ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ ˆ์ด์•„์›ƒ ์‹œ์Šคํ…œ
  • ๊ธฐ์กด์˜ float, position, inline-block ๋“ฑ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ต๋˜ ์ •๋ ฌ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

์šฉ์–ด ์ •๋ฆฌ

์šฉ์–ด ์„ค๋ช…
Main Axis ํ”Œ๋ ‰์Šค ์•„์ดํ…œ์ด ์ •๋ ฌ๋˜๋Š” ์ฃผ ์ถ• (row or column)
Cross Axis ์ฃผ ์ถ•์— ์ˆ˜์ง์ธ ์ถ• (row๋ฉด ์„ธ๋กœ, column์ด๋ฉด ๊ฐ€๋กœ)
Flex Container display: flex๊ฐ€ ์ ์šฉ๋œ ๋ถ€๋ชจ ์š”์†Œ
Flex Items ์ปจํ…Œ์ด๋„ˆ์˜ ์ง๊ณ„ ์ž์‹ ์š”์†Œ๋“ค

 

Flex Container ์†์„ฑ

1. display: flex / inline-flex

.container {
  display: flex;
  /* ๋˜๋Š” inline-flex */
}
  • flex: ๋ธ”๋ก ์š”์†Œ์ฒ˜๋Ÿผ ๋™์ž‘
  • inline-flex: ์ธ๋ผ์ธ ์š”์†Œ์ฒ˜๋Ÿผ ๋™์ž‘

 

2. flex-direction: ์ฃผ ์ถ• ๋ฐฉํ–ฅ ์„ค์ •

.container {
  flex-direction: row;
}

 

 

3. justify-content: Main Axis ์ •๋ ฌ (๊ฐ€๋กœ ์ •๋ ฌ or ์„ธ๋กœ ์ •๋ ฌ)

๊ฐ’ ์ •๋ ฌ ๋ฐฉ์‹
flex-start ์‹œ์ž‘์  ์ •๋ ฌ (๊ธฐ๋ณธ๊ฐ’)
flex-end ๋์  ์ •๋ ฌ
center ๊ฐ€์šด๋ฐ ์ •๋ ฌ
space-between ์–‘ ๋ ์ •๋ ฌ + ์‚ฌ์ด ๊ท ๋“ฑ
space-around ์–‘์ชฝ ์—ฌ๋ฐฑ + ์‚ฌ์ด ์—ฌ๋ฐฑ
space-evenly ์—ฌ๋ฐฑ์„ ์™„์ „ํžˆ ๊ท ๋“ฑ ๋ถ„๋ฐฐ
.container {
  justify-content: space-between;
}

 

 

4. align-items: Cross Axis ์ •๋ ฌ (์„ธ๋กœ ์ •๋ ฌ or ๊ฐ€๋กœ ์ •๋ ฌ)

๊ฐ’ ์„ค๋ช…
stretch (๊ธฐ๋ณธ๊ฐ’) ๊ต์ฐจ์ถ• ์ „์ฒด ๋Š˜๋ฆฌ๊ธฐ
flex-start ๊ต์ฐจ์ถ• ์‹œ์ž‘์  ์ •๋ ฌ
flex-end ๊ต์ฐจ์ถ• ๋์  ์ •๋ ฌ
center ๊ต์ฐจ์ถ• ๊ฐ€์šด๋ฐ ์ •๋ ฌ
baseline ํ…์ŠคํŠธ ๊ธฐ์ค€์„  ์ •๋ ฌ

 

 

5. align-content: ์—ฌ๋Ÿฌ ์ค„์˜ ๊ต์ฐจ์ถ• ์ •๋ ฌ (์ค„๋ฐ”๊ฟˆ๋œ ๊ฒฝ์šฐ๋งŒ ์ ์šฉ)

  • align-items๋Š” ํ•œ ์ค„์— ๋Œ€ํ•ด
  • align-content๋Š” ์—ฌ๋Ÿฌ ์ค„์— ๋Œ€ํ•ด

 

6. flex-wrap: ๋„˜์น  ๋•Œ ์ค„๋ฐ”๊ฟˆ ์—ฌ๋ถ€

๊ฐ’ ์„ค๋ช…
nowrap ์ค„๋ฐ”๊ฟˆ ์•ˆ ํ•จ (๊ธฐ๋ณธ๊ฐ’)
wrap ๋„˜์น˜๋ฉด ๋‹ค์Œ ์ค„๋กœ ๊ฐ
wrap-reverse ๋‹ค์Œ ์ค„๋กœ ๊ฐ๋˜, ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ
.container {
  flex-wrap: wrap;
}

 

 

7. gap: ์•„์ดํ…œ ๊ฐ„ ๊ฐ„๊ฒฉ

  • gap์€ Flexbox์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (Grid์—์„œ๋„!)
.container {
  display: flex;
  gap: 16px;
}

 

 

Flex Item ์†์„ฑ

1. flex-grow: ๋‚จ์€ ๊ณต๊ฐ„์˜ ๋น„์œจ

  • ๊ธฐ๋ณธ๊ฐ’: 0 (๋‚จ์€ ๊ณต๊ฐ„ ์•ˆ ์”€)
  • flex-grow: 1 → ๋‚จ๋Š” ๊ณต๊ฐ„์„ ์ฑ„์›€
  • ๋น„์œจ ๋‹จ์œ„ ๊ฐ€๋Šฅ (flex-grow: 2๋Š” 1์˜ 2๋ฐฐ)

2. flex-shrink: ๊ณต๊ฐ„ ๋ถ€์กฑํ•  ๋•Œ ์ค„์–ด๋“œ๋Š” ๋น„์œจ

  • ๊ธฐ๋ณธ๊ฐ’: 1 → ์ค„์–ด๋“ฆ
  • 0 → ์ค„์–ด๋“ค์ง€ ์•Š์Œ

3. flex-basis: ๊ธฐ๋ณธ ํฌ๊ธฐ ์„ค์ •

  • ๊ธฐ๋ณธ๊ฐ’: auto (๋‚ด์šฉ ๊ธฐ๋ฐ˜)
  • flex-basis: 200px → ๊ธฐ๋ณธ์ ์œผ๋กœ 200px ํ™•๋ณดํ•˜๋ ค๊ณ  ํ•จ

4. flex: shorthand ์†์„ฑ

.item {
  flex: 1 0 auto; /* grow shrink basis */
}
  • flex: 1 → flex-grow: 1, flex-shrink: 1, flex-basis: 0
  • ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์†์„ฑ!

5. align-self: ๊ฐœ๋ณ„ ์•„์ดํ…œ์˜ ๊ต์ฐจ์ถ• ์ •๋ ฌ ์„ค์ •

  • align-items๋Š” ์ „์ฒด ์•„์ดํ…œ ์ •๋ ฌ
  • align-self๋Š” ํ•ด๋‹น ์•„์ดํ…œ๋งŒ ์ •๋ ฌ
.item {
  align-self: flex-end;
}

 

 

์‹ค๋ฌด์—์„œ ๋งŽ์ด ์“ฐ๋Š” ํŒจํ„ด

1. ์„ธ๋กœ ์ค‘์•™ ์ •๋ ฌ

.container {
  display: flex;
  align-items: center;
}

 

 

2. ๊ฐ€๋กœ + ์„ธ๋กœ ์™„์ „ ์ •์ค‘์•™

.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

 

 

3. ์˜ค๋ฅธ์ชฝ ์ •๋ ฌ + ์•„๋ž˜ ์ •๋ ฌ

.container {
  display: flex;
  justify-content: flex-end;
  align-items: flex-end;
}

 

 

โš ๏ธ Flexbox ์ฃผ์˜ํ•  ์ 

์ƒํ™ฉ ์›์ธ ํ•ด๊ฒฐ
์•„์ดํ…œ์ด ๋„˜์น˜๊ฑฐ๋‚˜ ๊นจ์ง flex-wrap: nowrap (๊ธฐ๋ณธ๊ฐ’) ๋•Œ๋ฌธ flex-wrap: wrap ์ถ”๊ฐ€
ํ…์ŠคํŠธ๊ฐ€ ๊นจ์ง€๊ฑฐ๋‚˜ ์ค„์–ด๋“ฆ flex-shrink: 1๋กœ ์ธํ•ด ์ค„์–ด๋“ฆ flex-shrink: 0 ์‚ฌ์šฉ
์•„์ดํ…œ ๊ฐ„๊ฒฉ ํ•„์š” margin ๋Œ€์‹  gap ์‚ฌ์šฉ ๊ณ ๋ ค gap ์‚ฌ์šฉ ๊ณ ๋ ค

 

์ •๋ฆฌ

์†์„ฑ ์„ค๋ช…
display: flex ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ ์ง€์ •
flex-direction ์ฃผ ์ถ• ๋ฐฉํ–ฅ ์ง€์ •
justify-content ์ฃผ ์ถ• ์ •๋ ฌ
align-items ๊ต์ฐจ ์ถ• ์ •๋ ฌ
flex-wrap ์ค„๋ฐ”๊ฟˆ ์—ฌ๋ถ€ ์„ค์ •
gap ๊ฐ„๊ฒฉ ์„ค์ •
flex grow/shrink/basis ํ•œ ๋ฒˆ์— ์ง€์ •
align-self ๊ฐœ๋ณ„ ์ •๋ ฌ
  • Flexbox๋Š” 1์ฐจ์› ๋ ˆ์ด์•„์›ƒ(๊ฐ€๋กœ or ์„ธ๋กœ)์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ
  • ๐Ÿ“ฆ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ •๋ ฌ, ๋ฒ„ํŠผ ๋ฐฐ์น˜, ์นด๋“œ ๋ ˆ์ด์•„์›ƒ, ๋กœ๊ทธ์ธ ํผ ๋“ฑ
  • ํ˜„์—…์—์„œ Flexbox๋งŒ์œผ๋กœ๋„ ๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ์ด์•„์›ƒ์„ ํ•ด๊ฒฐ