๐งฉ 06. Flexbox: '1์ฐจ์ ๋ ์ด์์์ ๋ง๋ฒ์ฌ'
๐ ๊ฐ์
ํ๋ ์น ๋ ์ด์์์ ํ์ ๋๊ตฌ์ธ Flexbox์ ํต์ฌ ์๋ฆฌ์ ์ ๋ ฌ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ flex-grow/shrink์ ์ ๋ฐํ ๊ณ์ฐ๋ฒ์ ์์ฒ ์ด์ ํจ๊ป ๋ฐฐ์๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[์ถ(Axis)์ ์ดํด] โ [์ ๋ ฌ(Alignment) ๋ง์คํฐ] โ [flex-basis/grow/shrink์ ์ํ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ์ฃผ์ถ(Main Axis)๊ณผ ๊ต์ฐจ์ถ(Cross Axis)์ ๊ฐ๋ ์ ์๋ฒฝํ ํ์ ํฉ๋๋ค.
- ์์๋ฅผ ๊ฐ๋ก/์ธ๋ก ์ค์์ ์ ๋ ฌํ๋ ๊ฐ์ฅ ์ฐ์ํ ๋ฐฉ๋ฒ์ ์ตํ๋๋ค.
-
flex๋จ์ถ ์์ฑ์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๊ณต๊ฐ์ ๋ฐฐ๋ถํ๋์ง ์ดํดํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋!
float์ด๋position์ผ๋ก ๋ฉ๋ด ๋ฐ ๋ง๋๋๋ผ ๋ฐค์ ์๋๋ฐ, ๋ฑ 1px ์ฐจ์ด๋ก ์๊พธ ์ค์ด ๋ฐ๋์ด์. ๊ทธ๋ฆฌ๊ณ ์์ง ์ค์ ์ ๋ ฌ์ ์ ์ด๋ ๊ฒ ํ๋ ๊ฑฐ์ฃ ? ๐ญ" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ์์ง๋ 10๋
์ ๋ฐฉ์์ธ
float๊ณผ ์ธ์ฐ๊ณ ๊ณ์๊ตฐ์. ์ด์ '์ ์ฐํ ์์(Flexbox)'๋ฅผ ๋ฐฐ์ธ ๋๊ฐ ๋์ต๋๋ค. ์ถ ํ๋๋ง ์ ๋๋ก ์ดํดํ๋ฉด, ๋ฐค์ํ ํ์ ์์ด ๋จ ํ ์ค๋ก ํด๊ฒฐ๋๊ฑฐ๋ ์."
๐ค ์ ์์์ผ ํ๋๊ฐ
Flexbox๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ๊น์ง ์น ๋ ์ด์์์ '๊ผผ์'์ ์ฐ์์ด์์ต๋๋ค. ์ฌ์ง ์์ ํ
์คํธ๋ฅผ ๋๋ํ ๋๋ ค๊ณ float์ ์ฐ๊ณ clearfix๋ก ๋ท์ ๋ฆฌ๋ฅผ ํด์ผ ํ์ฃ . ํนํ ์์ง ์ค์ ์ ๋ ฌ์ ํ๋ก ํธ์๋ ๋ฉด์ ์ ๋จ๊ณจ ์ง๋ฌธ์ผ ์ ๋๋ก ์
๋ช
๋์ ๋์ ์์ต๋๋ค.
Flexbox๋ ์์๋ค์ ํ ๋ฐฉํฅ(๊ฐ๋ก ํน์ ์ธ๋ก)์ผ๋ก ์ ๋ ฌํ๊ณ , ๋จ๋ ๊ณต๊ฐ์ ์ด๋ป๊ฒ ๋๋ ๊ฐ์ง์ง ๊ฒฐ์ ํ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ์ง๊ด์ ์ธ ๋๊ตฌ์
๋๋ค. 5๋
์ฐจ ๊ฐ๋ฐ์๋ ๋จ์ํ display: flex๋ฅผ ๋จ๋ฐํ๋ ๊ฒ ์๋๋ผ, ์์ดํ
๋ค์ด '์ ์ฐํ๊ฒ(Flex)' ๋ฐ์ํ๋ ์๋ฆฌ๋ฅผ ์กฐ์ ํด ์ด๋ค ํ๋ฉด ํฌ๊ธฐ์์๋ ๊นจ์ง์ง ์๋ ๋ ์ด์์์ ์ค๊ณํฉ๋๋ค.
๐๏ธ 1. ๋ ๊ฐ์ ์ถ(Axis): ๋ช ์ค์ ์์
Flexbox์ ๋ชจ๋ ๊ฒ์ ์ถ(Axis) ์์ ์์๋ฉ๋๋ค.
- Main Axis (์ฃผ์ถ):
flex-direction์ ๊ฒฐ์ ๋ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐrow์ผ ๋๋ ๊ฐ๋ก,column์ผ ๋๋ ์ธ๋ก๊ฐ ๋ฉ๋๋ค. - Cross Axis (๊ต์ฐจ์ถ): ์ฃผ์ถ๊ณผ ์ง๊ตํ๋ ์ถ์ ๋๋ค.
๐ฆ ์ํธ์ ํต์ฌ ๋ ์จ:
"justify-content๋ ์ฃผ์ถ ๋ฐฉํฅ์ ์ ๋ ฌ์,align-items๋ ๊ต์ฐจ์ถ ๋ฐฉํฅ์ ์ ๋ ฌ์ ๋ด๋นํฉ๋๋ค. ์ด ๋ ์ค๋ง ์์ผ๋ฉด ์ ์ค์ '๊ฐ๋ก์ธ๋ก ์ค์ ์ ๋ ฌ'์ด ์์ฑ๋์ฃ ."
.container {
display: flex;
justify-content: center; /* ๊ฐ๋ก(์ฃผ์ถ) ์ค์ */
align-items: center; /* ์ธ๋ก(๊ต์ฐจ์ถ) ์ค์ */
}๐ฏ ์ถ ์ ๋ ฌ ๋๊ฒฐ: justify-content vs align-items
๐ 2. flex-basis, grow, shrink: ๊ณต๊ฐ ๋ฐฐ๋ถ์ ์ํ
์์ดํ ๋ค์ด ๋จ๋ ๊ณต๊ฐ์ ์ด๋ป๊ฒ ๋๋ ๊ฐ์ง์ง ๊ฒฐ์ ํ๋ 3ํ์ ์ ๋๋ค.
flex-basis: ์์ดํ ์ ๊ธฐ๋ณธ ํฌ๊ธฐ์ ๋๋ค. (width์ ๋น์ทํ์ง๋ง ์ถ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ค๋ฆ)flex-grow: ๋จ๋ ๊ณต๊ฐ์ ๋น๋กํด์ ๊ฐ์ ธ๊ฐ๋ ๋น์จ์ ๋๋ค. (๊ธฐ๋ณธ๊ฐ 0: ์ ๊ฐ์ ธ๊ฐ)flex-shrink: ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋ ๋น๋กํด์ ์ค์ด๋๋ ๋น์จ์ ๋๋ค. (๊ธฐ๋ณธ๊ฐ 1: ๋๊ฐ์ด ์ค์ด๋ฌ)
/* ๐ฃ ์์ฒ ์ด์ ํฉ๊ธ ๋น์จ ๋ฉ๋ด */
.nav-item {
flex: 1 1 200px; /* grow: 1, shrink: 1, basis: 200px */
}โ๏ธ ๊ณต๊ฐ ๋ฐฐ๋ถ์ ๋ง๋ฒ: flex-grow
โ ๏ธ 5๋ ์ฐจ์ ๊ฒฝ๊ณ :
flex: 1์ ์ฌ์คflex: 1 1 0%์ ์ค์๋ง์ ๋๋ค. ๋ฐ๋ฉดflex: auto๋flex: 1 1 auto์ฃ . ์ด ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ๋ ์ด์์์ด ๊ฝ ์ฐจ๋๋, ์ฝํ ์ธ ํฌ๊ธฐ๋งํผ๋ง ์ปค์ง๋๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
๐ ๏ธ 3. gap: ๋ง์ง ๋ ธ๊ฐ๋ค์ ์ข ๋ง
๊ณผ๊ฑฐ์๋ ์์ดํ
์ฌ์ด ๊ฐ๊ฒฉ์ ์ฃผ๋ ค๊ณ margin-right๋ฅผ ์ฃผ๊ณ ๋ง์ง๋ง ์์ดํ
๋ง last-child๋ก ๋นผ๊ณค ํ์ต๋๋ค. ์ด์ ๋ gap ์์ฑ ํ๋๋ก ๋๋
๋๋ค.
.container {
display: flex;
gap: 20px; /* ์์ดํ
์ฌ์ด ๊ฐ๊ฒฉ๋ง 20px! ๋ฐ๊นฅ์ชฝ์ ๊น๋ํฉ๋๋ค. */
}๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. flex-direction: column;์ผ ๋ ์์๋ค์ ์์ง ๋ฐฉํฅ(์์์ ์๋)์ ํ๊ฐ์ด๋ฐ์ ๋์ผ๋ ค๋ฉด ์ด๋ค ์์ฑ์ ์จ์ผ ํ ๊น์?
โ
์ ๋ต: justify-content: center;
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ:
justify-content๋ ์ธ์ ๋ ์ฃผ์ถ(Main Axis) ๋ฐฉํฅ์ ์ ๋ ฌ์ ๋ด๋นํฉ๋๋ค.flex-direction: column์ผ ๋๋ ์ธ๋ก๊ฐ ์ฃผ์ถ์ด ๋๋ฏ๋ก,justify-content: center๋ฅผ ์จ์ผ ์์ง ์ค์ ์ ๋ ฌ์ด ๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์ฃผ์ถ์ด ๋ฐ๋๋ฉด ์์ฑ์ ์ญํ ๋ ๋ฐ๋๋ค๋ ๊ฑธ ๊ผญ ๊ธฐ์ตํ์ธ์. ํท๊ฐ๋ฆฐ๋ค๋ฉด '์ฃผ์ ํ(Justify-Main)'์ด๋ผ๊ณ ์ธ์๋ณด์ธ์!"
Q2. flex-shrink: 0; ์์ฑ์ด ๋ถ์ฌ๋ ์์ดํ
์ ์ปจํ
์ด๋ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋ ์ด๋ป๊ฒ ๋ฐ์ํ ๊น์?
- ์ปจํ ์ด๋ ํฌ๊ธฐ์ ๋ง์ถฐ ์ค์ด๋ ๋ค.
- ์ ๋ ์ค์ด๋ค์ง ์๊ณ ์๊ธฐ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ฉฐ ์์ ธ๋์จ๋ค.
- ๋ค์ ์ค๋ก ์๋์ผ๋ก ๋์ด๊ฐ๋ค.
- ์ฌ๋ผ์ง๋ค.
โ
์ ๋ต: 2. ์ ๋ ์ค์ด๋ค์ง ์๊ณ ์๊ธฐ ํฌ๊ธฐ๋ฅผ ์ ์งํ๋ฉฐ ์์ ธ๋์จ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ:
flex-shrink๋ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๋ ์์ดํ ์ด ์ผ๋ง๋ ์ค์ด๋ค์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋น์จ์ ๋๋ค.0์ผ๋ก ์ค์ ํ๋ฉด "์ด๋ค ์ผ์ด ์์ด๋ ๋๋ ์ค์ด๋ค์ง ์๊ฒ ๋ค"๋ ๊ณ ์ง์ ๋ถ๋ฆฌ๊ฒ ๋์ด ์ปจํ ์ด๋ ๋ฐ์ผ๋ก ๋์น๊ฒ ๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋ด์ฉ๋ฌผ์ด ์๋ฆฌ๋ฉด ์ ๋๋ ์ค์ํ ์์ด์ฝ์ด๋ ๋ฒํผ์๋
flex-shrink: 0์ ์ค์ ๋ฐฉ์ด๋ง์ ์ณ์ค์ผ ํด์."
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง]
์์ฒ ์ด๊ฐ ์นด๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์๋๋ฐ, ๋ง์ง๋ง ์ค์ ์นด๋ ํ๋๊ฐ ํผ์์ ์ปจํ
์ด๋ ์ ์ฒด ๋๋น๋ฅผ ์ฐจ์งํ๋ฉฐ ๋ฑ๋ฑํ๊ฒ ๋์ด๋ ๋ฒ๋ ธ์ต๋๋ค. ์์ ๋์์ด๋ ๋์ด "๋ง์ง๋ง ์นด๋๋ ๋ค๋ฅธ ์นด๋๋ ๋๊ฐ์ ํฌ๊ธฐ์ฌ์ผ ํด์!"๋ผ๊ณ ํ์๋ค์. ์์ฒ ์ด๊ฐ flex ์์ฑ์ ์ด์ฉํด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ์ค์ ํด์ผ ํ ๊น์?
โ
์ ๋ต: flex-grow: 0 (๋๋ flex: none)์ ์ฃผ์ด ํ์ฅ์ ๋ง๊ณ , flex-basis๋ width๋ก ๊ณ ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ค.
๐ก ์์ธ ํด์ค:
- ๋ฌธ์ ์ง๋จ:
flex-grow: 1์ "๊ฐ๋ฅํ ๋ชจ๋ ๋น ๊ณต๊ฐ์ ์ฑ์๋ผ"๋ผ๋ ๊ฐ๋ ฅํ ๋ช ๋ น์ ๋๋ค. ์ฌ๋ฌ ์ค๋ก ๋์ด๋ ์นด๋ ๋ฆฌ์คํธ์์ ๋ง์ง๋ง ์ค์ ์์ดํ ์ด ํ๋๋ง ๋จ์ผ๋ฉด, ๊ทธ ์์ดํ ์ด ํด๋น ์ค์ ๋ชจ๋ ์ฌ๋ฐฑ์ ๋ ์ํ๊ฒ ๋์ด ๋์์ธ์ด ๊นจ์ง๊ฒ ๋ฉ๋๋ค. (๋ง์น ํผ์์ ์ํ ์ ์ฒด๋ฅผ ์ฐจ์งํ๊ณ ๋์์๋ ์๋ฏธ์ด ์น๊ตฌ์ฒ๋ผ์!) - ํด๊ฒฐ ๋ฐฉ์ (์ค๋ฌด ํต์ฌ):
- ์ ์ ํ (Flex-grow: 0): ์์ดํ
์
flex-grow: 0์ ์ฃผ์ด ๋ฌด๋ถ๋ณํ ํ์ฅ์ ๋ง์ต๋๋ค. ๋์flex-basis: calc(50% - gap)์ด๋width๋ก ๋ช ํํ ์๊ธฐ ์๋ฆฌ๋ฅผ ์ง์ ํด์ค์ผ ํฉ๋๋ค. - ๊ฑด์ถํ (Grid): ์ ์ด์ ์ด๋ฐ ๊ฒฉ์ํ ๋ ์ด์์์ 07๊ฐ์์ ๋ฐฐ์ธ CSS Grid๋ฅผ ์ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ ๋๋ค. (Grid๋ ์ค์ด ๋ฐ๋์ด๋ ๊ฐ ์นธ์ ํฌ๊ธฐ๋ฅผ ์ผ์ ํ๊ฒ ์ ์งํ๋๊น์!)
- ์ ์ ํ (Flex-grow: 0): ์์ดํ
์
โ ๋ฌธ์ ์ํฉ: flex-grow: 1 (๋ง์ง๋ง ์์ดํ ๋น๋ํ)
โ ํด๊ฒฐ ๋ฐฉ๋ฒ: flex-grow: 0 (๋๋น ๊ณ ์ )
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋,
flex: 1์ ๋ง๋ฒ์ ์ฃผ๋ฌธ์ด ์๋์์. ์ํฉ์ ๋ฐ๋ผ ๊ณต๊ฐ์ ๋๋ ๊ฐ์ง ์๋๋ก 0์ผ๋ก ์ ๊ทธ๋ ๋ฒ๋ ๋ฐฐ์์ผ ํฉ๋๋ค. ํนํ ์ฌ๋ฌ ์ค ๋ ์ด์์์์flex-grow๋ ์๋ ์ ๊ฒ์ด๋ ์กฐ์ฌํด์ ํ๋๋ฌ์ผ ํด์!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋จ ์ฃผ๊ธด ์๊น๊ณ ๋๋ง ์ปค๊ธด ์ซ์ ๋? flex-grow: 0์ผ๋ก ์์ฌ์ ๋ฒ๋ฆฌ๊ณ ์ ๋์ ์งํค์!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ float์ ๋ฒ๋ฆฌ๊ณ Flexbox์ ์ธ๊ณ์ ์
์ฑํ๋ค.
์์ง ์ค์ ์ ๋ ฌ์ด ๋จ ๋ ์ค ๋ง์ ๋๋๋ ๊ฑธ ๋ณด๊ณ ๋ด ์ง๋ ๋ฐค์์ด ํ๋งํ๊ฒ ๋๊ปด์ก์ง๋ง, ์ด์ ๋ผ๋ ์์์ผ๋ ๋คํ์ด๋ค.
ํนํ flex-grow๋ flex-shrink๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ํ ๊ณ์ฐ์ ํ๊ณ ์๋ค๋ ๊ฒ ์ ๋ง ์ ๊ธฐํ๋ค.
๐ก "์ ๋ ฌ์ ์ฃผ๊ด์ด ์๋๋ผ ์ถ(Axis)์ ์ํ ๋ฌผ๋ฆฌ์ ์ธ ๋ฐฐ์น๋ค. ์ถ์ ์ง๋ฐฐํ๋ ์๊ฐ ๋ ์ด์์์ ์ง๋ฐฐํ๋ค."
์ํธ ๋์ด "๋จ์ํ ์ธ์ฐ์ง ๋ง๊ณ ๊ณต๊ฐ์ด ์ด๋ป๊ฒ ๋จ๊ณ ๋ชจ์๋ผ๋์ง๋ฅผ ๋๊ปด๋ด๋ผ"๋ผ๊ณ ํ์ จ๋๋ฐ, ์ง์ ๊ฐ๋ ์งํ์ฒ ์ข์๋ Flexbox๋ก ๋ณด์ด๊ธฐ ์์ํ๋ค. ์ ์์ ์จ๊ฐ ์์ผ๋ฉด์ ๋ด ๊ณต๊ฐ์ด 'shrink' ๋๊ณ ์๋ค... ๋ด์ผ์ 2์ฐจ์ ๋ง๋ฒ์ฌ Grid๋ฅผ ๋ฐฐ์ด๋ค๋๋ฐ ๋ฒ์จ ๊ธฐ๋๋๋ค. ๐งฉ