[CSS] ๐ ํ๋์ค(Flex) ๐ฏ ์ด์ ๋ฆฌ
CSS Flexbox
Flexbox๋ ๋ชจ๋ ์น์ ์ํ์ฌ ์ ์๋ ๊ธฐ์กด layout๋ณด๋ค ๋ ์ธ๋ จ๋ ๋ฐฉ์์ ๋์ฆ์ ๋ถํฉํ๊ธฐ ์ํ CSS3์ ์๋ก์ด layout ๋ฐฉ์์ด๋ค. ์์์ ์ฌ์ด์ฆ๊ฐ ๋ถ๋ช ํํ๊ฑฐ๋ ๋์ ์ผ๋ก ๋ณํํ ๋์๋ ์ ์ฐํ ๋ ์ด์์์ ์คํํ ์ ์๋ค. ๋ณต์กํ ๋ ์ด์์์ด๋ผ๋ ์ ์ ์ฝ๋๋ก ๋ณด๋ค ๊ฐ๋จํ๊ฒ ํํํ ์ ์๋ค.
โ
Q. ์์ฆ ๋ค๋ค grid ์ฐ๋๋ฐ, flex์ด์ ์์ฐ๋๊ฑฐ ์๋๋๊น?
A. ์ ๋ต์ No๋ค.
๋ฌผ๋ก grid๋ก๋ง ๋ ์ด์์์ ๋ชจ๋ ๊ตฌํ์ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋จ์ํ ์ปจํ ์ธ ๋ฅผ ๊ฐ๋ก ์ ๋ ฌํ๋๋ฐ๋ flex๊ฐ ํจ์ฌ ๊ฐ๋จํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅ ํ๊ธฐ ๋๋ฌธ์, grid๋ 2์ฐจ์ ํ๋ ฌ ๊ฐ์ด ํฐ ํ ๋ ์ด์์์ ๊ตฌํ ํ ๋ ์ฐ๊ณ , flex๋ 1์ฐจ์ ํ๋ ฌ ๊ฐ์ด ์์ ์ปจํ ์ธ ์์ดํ ์ ๊ฐ๋ก ์ ๋ ฌํ ๋ ์์ฃผ ์ด๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋ค์์ ์ค์ ์์ ์ด๊ณ , ํฐ ํ(ํ๋)์ grid๋ก ์ง๊ณ ๋ค๋ชจ ์์ ์ฌ์ง์ด๋ ๊ธ์ ์ปจํ ์ธ ๋ค์ flex(๋นจ๊ฐ)์ผ๋ก ์ฌ์ฉํ๊ฑธ ํ์ธ ํ ์ ์๋ค.
Flexbox ๊ธฐ๋ณธ ๊ตฌ์กฐ
Flexbox ๋ ์ด์์์ flex item์ด๋ผ ๋ถ๋ฆฌ๋ ๋ณต์์ ์์ ์์์ ์ด๋ค์ ๋ดํฌํ๋ flex-container ๋ถ๋ชจ ์์๋ก ๊ตฌ์ฑ๋๋ค.
โflexbox๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ HTML ๋ถ๋ชจ ์์์ display ์์ฑ์ flex๋ฅผ ์ง์ ํ๋ค. (๋ถ๋ชจ ์์๊ฐ inline ์์์ธ ๊ฒฝ์ฐ inline-flex์ ์ง์ ํ๋ค.)
๊ฐ | ์๋ฏธ |
flex | Block ํน์ฑ์ Flex Container๋ฅผ ์ ์ |
inline-flex | Inline ํน์ฑ์ Flex Container๋ฅผ ์ ์ |
.flex-container {
display: flex;
}
.flex-container-inline {
display: inline-flex;
}
Container ์ item
โflexbox์์ ์ฌ์ฉํ๋ ์์ฑ์ ๋ถ๋ชจ ์์์ธ flex container์ ์ ์ํ๋ ์์ฑ๊ณผ ์์ ์์์ธ flex item์ ์ ์ํ๋ ์์ฑ์ผ๋ก ๋๋์ด์ง๋ค.
โ์ ์ฒด์ ์ธ ์ ๋ ฌ์ด๋ ํ๋ฆ์ ๊ด๋ จ๋ ์์ฑ์ flex container์ ์ ์ํ๊ณ , ์์ ์์์ ํฌ๊ธฐ๋ ์์์ ๊ด๋ จ๋ ์์ฑ์ flex item์ ์ ์ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
Flex Container ์์ฑ
์์ฑ | ์๋ฏธ |
display | Flex Container๋ฅผ ์ ์ |
flex-flow | flex-direction์ flex-wrap์ ๋จ์ถ ์์ฑ |
flex-direction | Flex Items์ ์ฃผ ์ถ(main-axis)์ ์ค์ |
flex-wrap | Flex Items์ ์ฌ๋ฌ ์ค ๋ฌถ์(์ค ๋ฐ๊ฟ) ์ค์ |
justify-content | ์ฃผ ์ถ(main-axis)์ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์ค์ |
align-content | ๊ต์ฐจ ์ถ(cross-axis)์ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์ค์ (2์ค ์ด์) |
align-items | ๊ต์ฐจ ์ถ(cross-axis)์์ Items์ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์ค์ (1์ค) |
โ
flex-direction
- flex-direction ์์ฑ์ flex ์ปจํ ์ด๋์ ์ฃผ์ถ(main axis) ๋ฐฉํฅ์ ์ค์ ํ๋ค.
โ
flex-direction: row;
์ข์์ ์ฐ๋ก(ltr) ์ํ ๋ฐฐ์น๋๋ค. flex-direction ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
โ
flex-direction: row-reverse;
์ฐ์์ ์ข๋ก(rtl) ์ํ ๋ฐฐ์น๋๋ค.
โ
flex-direction: column;
์์์ ์๋๋ก ์์ง ๋ฐฐ์น๋๋ค.
โ
flex-direction: column-reverse;
์๋์์ ์๋ก ์์ง ๋ฐฐ์น๋๋ค.
โ
์ ์ํ ์ ์, Items ์์๋ฅผ ๊ฑฐ๊พธ๋ก ๋ค์ง๊ฑฐ๋, ์์ง์ผ๋ก ์ค์ ํ ๊ฒฝ์ฐ, ์ฃผ ์ถ๊ณผ ๊ต์ฐจ์ถ ๋ชจ๋ ๋ณํ๊ฒ ๋๋ค. ์ฆ, ๋ฐฉํฅ(์ํ, ์์ง)์ ๋ฐ๋ผ ์ฃผ ์ถ๊ณผ ๊ต์ฐจ ์ถ์ด ๋ฌ๋ผ์ง๋ค.
โ
โ
flex-wrap
- flex-wrap ์์ฑ์ flex ์ปจํ ์ด๋์ ๋ณต์ flex item์ 1ํ์ผ๋ก ๋๋ ๋ณต์ํ์ผ๋ก ๋ฐฐ์นํ๋ค.
- flex๋ ๊ธฐ๋ณธ์ ์ผ๋ก 1์ฐจ์ ํํ์ด๋ค.
- flex ์ปจํ ์ด๋์ width๋ณด๋ค flex item๋ค์ width์ ํฉ๊ณ๊ฐ ๋ ํฐ ๊ฒฝ์ฐ, ํ์ค๋ก ํํํ ๊ฒ์ธ์ง, ์ฌ๋ฌ์ค๋ก ํํํ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํ๋ค.
โ
flex-wrap: nowrap;
flex item์ ๊ฐํํ์ง ์๊ณ 1ํ์ ๋ฐฐ์นํ๋ค. flex-wrap ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
๊ฐ flex item์ ํญ์ flex container์ ๋ค์ด๊ฐ ์ ์๋ ํฌ๊ธฐ๋ก ์ถ์๋๋ค.
โ
flex-wrap: wrap;
flex item๋ค์ width์ ํฉ๊ณ๊ฐ flex ์ปจํ ์ด๋์ width๋ณด๋ค ํฐ ๊ฒฝ์ฐ, flex item์ ๋ณต์ํ์ ๋ฐฐ์นํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ข์์ ์ฐ๋ก, ์์์ ์๋๋ก ๋ฐฐ์น๋๋ค.
โ
flex-wrap: wrap-reverse;
flex-wrap: wrap;๊ณผ ๋์ผํ๋ ์๋์์ ์๋ก ๋ฐฐ์น๋๋ค.
โ
โ
flex-flow
- flex-flow ์์ฑ์ flex-direction ์์ฑ๊ณผ flex-wrap ์์ฑ์ ์ค์ ํ๊ธฐ ์ํ shorthand์ด๋ค.
- ๊ธฐ๋ณธ๊ฐ์ row nowrap์ด๋ค.
/* flex-flow: <flex-direction> || <flex-wrap>; */
/* flex-flow: ์ฃผ์ถ ์ฌ๋ฌ์ค๋ฌถ์; */
flex-flow: row-reverse wrap;
โ
โ
justify-content
- flex container์ main axis๋ฅผ ๊ธฐ์ค์ผ๋ก flex item์ ์ํ ์ ๋ ฌํ๋ค.
โ
justify-content: flex-start;
main start(์ข์ธก)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค. justify-content ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
โ
justify-content: flex-end;
main end(์ฐ์ธก)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
flex-direction: row-reverse;๊ณผ ๋ค๋ฅธ ์ ์, 1,2,3,4,5 ์์๋ ๊ทธ๋๋ก ์ธ์
โ
justify-content: center;
flex container์ ์ค์์ ์ ๋ ฌํ๋ค.
โ
justify-content: space-between;
์ฒซ๋ฒ์งธ์ ๋ง์ง๋ง flex item์ ์ข์ฐ ์ธก๋ฉด์ ์ ๋ ฌ๋๊ณ ๋๋จธ์ง์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ผ๋ก ์ ๋ ฌ๋๋ค.
โ
justify-content: space-around;
๋ชจ๋ flex item์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ผ๋ก ์ ๋ ฌ๋๋ค.
โ
โ
align-content
- flex container์ cross axis๋ฅผ ๊ธฐ์ค์ผ๋ก flex item์ ์์ง ์ ๋ ฌํ๋ค. (๋ ์ค ์ด์์ผ ๊ฒฝ์ฐ)
[align-conent / justiry-content]
- align-conent : ์์ดํ ์ ์์ง ์ ๋ ฌ
- justiry-content : ์์ดํ ์ ์ํ ์ ๋ ฌ
[align-content / align-items ]
- align-content : ์์ดํ ์ด ๋์ค ์ด์์ผ๋ ์์ง ์ ๋ ฌ
- align-items : ์์ดํ ์ด ํ์ค์ผ๋ ์์ง ์ ๋ ฌ
โ
align-content: stretch;
๋ชจ๋ flex item์ flex item์ ํ ์ดํ์ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐ๋ ๊ณต๊ฐ์ ์ ๋ ฌ๋์ด ๋ฐฐ์น๋๋ค. align-content ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
โ
align-content: flex-start;
๋ชจ๋ flex item์ flex container์ cross start ๊ธฐ์ค์ผ๋ก stack ์ ๋ ฌ๋๋ค.
โ
align-content: flex-end;
๋ชจ๋ flex item์ flex container์ cross end ๊ธฐ์ค์ผ๋ก stack ์ ๋ ฌ๋๋ค.
โ
align-content: center;
๋ชจ๋ flex item์ flex container์ cross axis์ ์ค์์ stack ์ ๋ ฌ๋๋ค.
โ
align-content: space-between;
์ฒซ๋ฒ์งธ flex item์ ํ์ flex container์ ์๋จ์ ๋ง์ง๋ง flex item์ ํ์ flex container์ ํ๋จ์ ๋ฐฐ์น๋๋ฉฐ ๋๋จธ์ง ํ์ ๊ท ๋ฑ ๋ถํ ๋ ๊ณต๊ฐ์ ๋ฐฐ์น ์ ๋ ฌ๋๋ค.
โ
align-content: space-around;
๋ชจ๋ flex item์ ๊ท ๋ฑ ๋ถํ ๋ ๊ณต๊ฐ ๋ด์ ๋ฐฐ์น ์ ๋ ฌ๋๋ค.
โ
โ
align-items
- flex item์ flex container์ ์์ง ๋ฐฉํฅ(cross axis)์ผ๋ก ์ ๋ ฌํ๋ค. (ํ ์ค์ผ ๊ฒฝ์ฐ)
- align-items ์์ฑ์ ๋ชจ๋ flex item์ ์ ์ฉ๋๋ค.
โ
align-items: stretch;
๋ชจ๋ flex item์ flex container์ ๋์ด(cross start์์ cross end๊น์ง์ ๋์ด)์ ๊ฝ์ฐฌ ๋์ด๋ฅผ ๊ฐ๋๋ค. align-items ์์ฑ์ ๊ธฐ๋ณธ๊ฐ์ด๋ค.
โ
align-items: flex-start;
๋ชจ๋ flex item์ flex container์ cross start ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋ค.
โ
align-items: flex-end;
๋ชจ๋ flex item์ flex container์ cross end ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋ค.
โ
align-items: center;
๋ชจ๋ flex item์ flex container์ cross axis์ ์ค์์ ์ ๋ ฌ๋๋ค.
โ
align-items: baseline;
๋ชจ๋ flex item์ flex container์ baseline์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋ค.
์ฆ, flex item ๋ฐ์ค ํฌ๊ธฐ๊ฐ ์ ๊ฐ๊ฐ ์ด๋ผํด๋, ์์ ํ ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ง์ถ๋ค.
Flex Item ์์ฑ
float, clear, vertical-align ์์ฑ์ 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 | ๊ต์ฐจ ์ถ(cross-axis)์์ Item์ ์ ๋ ฌ ๋ฐฉ๋ฒ์ ์ค์ |
โ
order
- flex item์ ๋ฐฐ์น ์์๋ฅผ ์ง์ ํ๋ค.
- HTML ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ order ์์ฑ๊ฐ์ ์ง์ ํ๋ ๊ฒ์ผ๋ก ๊ฐ๋จํ ์ฌ๋ฐฐ์นํ ์ ์๋ค.
- ๊ธฐ๋ณธ ๋ฐฐ์น ์์๋ flex container์ ์ถ๊ฐ๋ ์์์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค.
.flex-item {
order: ์ ์๊ฐ;
}
โ
flex-grow
- flex item์ ๋๋น์ ๋ํ ํ๋ ์ธ์(flex grow factor)๋ฅผ ์ง์ ํ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0์ด๊ณ ์์๊ฐ์ ๋ฌดํจํ๋ค.
- ๋ชจ๋ flex item์ด ๋์ผํ flex-grow ์์ฑ๊ฐ์ ๊ฐ์ง๋ฉด ๋ชจ๋ flex item์ ๋์ผํ ๋๋น๋ฅผ ๊ฐ๋๋ค.
.flex-item {
flex-grow: ์์ ์ ์๊ฐ;
}
โ
์๋ฅผ ๋ค์ด Item์ด 3๊ฐ์ด๊ณ ์ด๋๋น๊ฐ 400px, ์ฆ๊ฐ ๋๋น๊ฐ ๊ฐ๊ฐ 1, 2, 1์ด๋ผ๋ฉด,
- ์ฒซ ๋ฒ์งธ Item์ ์ด ๋๋น์ 25%(1/4)์,
- ๋ ๋ฒ์งธ Item์ ์ด ๋๋น์ 50%(2/4)๋ฅผ,
- ์ธ ๋ฒ์งธ Item์ ์ด ๋๋น์ 25%(1/4)์ ๊ฐ์ง๊ฒ ๋๋ค.
.flex-item-1 {
flex-grow: 1;
}
.flex-item-2{
flex-grow: 2;
}
.flex-item-3 {
flex-grow: 1;
}
์์ ์ฝ๋)
See the Pen flex-grow by park young woong (@heropark) on CodePen.
flex-shrink
- flex item์ ๋๋น์ ๋ํ ์ถ์ ์ธ์(flex shrink factor)๋ฅผ ์ง์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ 1์ด๊ณ ์์๊ฐ์ ๋ฌดํจํ๋ค.
- 0์ ์ง์ ํ๋ฉด ์ถ์๊ฐ ํด์ ๋์ด ์๋์ ๋๋น๋ฅผ ์ ์งํ๋ค.
.flex-item {
flex-shrink: ์์ ์ ์๊ฐ;
}
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ flex item์ ์ถ์๋ ์ํ๋ก ์ง์ (๊ธฐ๋ณธ๊ฐ 1)ํ๊ณ ๋๋ฒ์งธ flex item๋ง ์ถ์๋ฅผ ํด์ (flex-shrink: 0;)ํ๋ฉด ์๋์ ๋๋น๋ฅผ ์ ์งํ๋ค.
โ๊ณ์ฐ์ด ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ ํ์ฉ๋๋ ์กฐ๊ธ ๋จ์ด์ง๋ค๊ณ ์๊ฐํ๋ค. ์๋ฆฌ ์ ๋๋ง ์ดํดํ๊ณ ๋์ด๊ฐ์๋ค.
โ
โ
flex-basis
- flex item์ ๋๋น ๊ธฐ๋ณธ๊ฐ์ px, % ๋ฑ์ ๋จ์๋ก ์ง์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ auto์ด๋ค.
.flex-item {
flex-basis: auto; /* ๊ฐ๋ณ Item๊ณผ ๊ฐ์ ๋๋น */
}
.flex-item-4 {
flex-basis: 350px;
}
โ
โ
flex
- flex-grow, flex-shrink, flex-basis ์์ฑ์ shorthand์ด๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0 1 auto์ด๋ค.
/* flex: none | auto | [ <flex-grow> <flex-shrink>? || <flex-basis> ]; */
/* flex: ์ฆ๊ฐ๋๋น ๊ฐ์๋๋น ๊ธฐ๋ณธ๋๋น; */
flex: 1 1 20px; /* ์ฆ๊ฐ๋๋น ๊ฐ์๋๋น ๊ธฐ๋ณธ๋๋น */
flex: 1 1; /* ์ฆ๊ฐ๋๋น ๊ฐ์๋๋น */
flex: 1 20px; /* ์ฆ๊ฐ๋๋น ๊ธฐ๋ณธ๋๋น (๋จ์๋ฅผ ์ฌ์ฉํ๋ฉด flex-basis๊ฐ ์ ์ฉ๋ฉ๋๋ค) */
flex-grow๋ฅผ ์ ์ธํ ๊ฐ๋ณ ์์ฑ์ ์๋ตํ ์ ์๋ค.
๋ง์ฝ flex: 1;๋ก ์์ฑํ๋ฉด flex-grow: 1;๊ณผ ๊ฐ๋ค.
โ
๊ทธ๋ฌ๋ฉด ๋๋จธ์ง ์์ฑ์ ์๋ตํ์ผ๋ ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋์ด flex-shrink: 1;, flex-basis: auto;๊ฐ ๋๊ฒ ์ฃ ?
์ฆ flex: 1; ํน์ flex: 1 1;์ flex: 1 1 auto;์ ๊ฐ๋ค๊ณ ๋ณผ ์ ์๋ค๋ง ๊ทธ๋ ์ง ์๋๋ค.
โ
flex-basis์ ๊ธฐ๋ณธ๊ฐ์ auto์ ๋๋ค๋ง ๋จ์ถ ์์ฑ์ธ flex์์ ๊ทธ ๊ฐ์ ์๋ตํ ๊ฒฝ์ฐ 0์ด ์ ์ฉ๋๋ค.
๋ค์ ์ ๋ฆฌํ๋ฉด flex: 1; ํน์ flex: 1 1;์ flex: 1 1 0;์ด ๋๋ค๋ ๊ฒ์ด๋ค.
์ด ๋ถ๋ถ์ ๊ธฐ์ตํ์ง ์์ผ๋ฉด ์๋ฑํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ผ๋ ์ฃผ์ํฉ์๋ค!
โ
โ
align-self
- flex item์ ์์ง ๋ฐฉํฅ(cross axis)์ผ๋ก ์ ๋ ฌํ๋ค
- align-items ์์ฑ๋ณด๋ค ์ฐ์ ํ์ฌ ๊ฐ๋ณ flex item์ ์ ๋ ฌํ๋ค. ๊ธฐ๋ณธ๊ฐ์ auto์ด๋ค.
.flex-item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
3๋ฒ์งธ, 4๋ฒ์งธ flex item์ align-self ์์ฑ๊ฐ์ด ์ฐ์ ์ ์ฉ๋์ด ์ ๋ ฌ๋๋ค.
See the Pen Flexbox playground by Gabi (@enxaneta) on CodePen.
# ์ฐธ๊ณ ์๋ฃ
https://poiemaweb.com/css3-flexbox
https://webdir.tistory.com/349
https://d2.naver.com/helloworld/8540176
https://velog.io/@bearsjelly/css-flex
https://heropy.blog/2018/11/24/css-flexible-box/