CSS3 FLEXBOX๋ ์น ํ์ด์ง ๋ ์ด์์์ ์ฝ๊ฒ ์กฐ์ ํ๊ณ ๋ค์ํ ๋๋ฐ์ด์ค์ ๋ง์ถฐ ๋ฐ์ํ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ FLEXBOX์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ํ์ฉ ๋ฐฉ๋ฒ๊น์ง ์ฒด๊ณ์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
FLEXBOX ๊ธฐ๋ณธ ๊ฐ๋ ๐
FLEXBOX๋ ํ๋ ์ค ์ปจํ
์ด๋(Flex Container)์ ํ๋ ์ค ์์ดํ
(Flex Item)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
Flex Container๋ Flex Item์ ๊ฐ์ธ๋ ๋ถ๋ชจ ์์์ด๊ณ , Flex Item์ Flex Container ๋ด์ ์์นํ ์์ ์์๋ค์
๋๋ค.
์ฃผ์ ์ฉ์ด ์ค๋ช :
- Main Axis: Flex Container์ ์ฃผ ์ถ์ ๋๋ค. flex-direction ์์ฑ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
- Cross Axis: Main Axis์ ์์ง์ธ ์ถ์ ๋๋ค.
Flex Container ์์ฑ๐ฆ
display: flex;
display: flex; ์์ฑ์ Flex Container๋ฅผ ์ ์ํ๋ ๊ธฐ๋ณธ ์์ฑ์ ๋๋ค. ์ด ์์ฑ์ ๋ถ๋ชจ ์์์ ์ ์ฉํ๋ฉด ํด๋น ์์์ ์์ ์์๋ค์ด Flex Item์ผ๋ก ๋ณํ๋์ด, Flexbox ๋ ์ด์์ ์์คํ ์ ๊ท์น์ ๋ฐ๋ผ ๋ฐฐ์น๋ฉ๋๋ค.
.container {
display: flex; /* inline-flex */
}
์ด ์์ฑ์ ์ฌ์ฉํ๋ฉด Flex Container ๋ด์ ์์ ์์๋ค์ด ์ ์ฐํ ๋ฐฐ์น์ ์ ๋ ฌ ์ต์ ์ ํตํด ์ฝ๊ฒ ์ ๋ ฌ๋๊ณ , ๋ฐฐ์น๋ฉ๋๋ค. Flex Container์ Flex Item์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ ์ด์์์ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- flex: ๋ถ๋ชจ ์์๋ฅผ Flex Container๋ก ์ค์ ํ์ฌ ์์ ์์๋ค์ด Flex Item์ด ๋๋๋ก ๋ง๋ญ๋๋ค.
- inline-flex: Flex Container๋ฅผ ์ธ๋ผ์ธ ์์๋ก ์ค์ ํฉ๋๋ค. Flex Item์ผ๋ก ๋ฐฐ์น๋์ง๋ง, ์ปจํ ์ด๋ ์์ฒด๋ ์ธ๋ผ์ธ ์์์ฒ๋ผ ๋์ํฉ๋๋ค.
flex-direction
Flex Item์ ์ฃผ ์ถ ๋ฐฉํฅ์ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ row์ ๋๋ค.
.container {
flex-direction: row; /* row, row-reverse, column, column-reverse */
}
- row: ๊ธฐ๋ณธ๊ฐ์ผ๋ก, Flex Item์ ํ ๋ฐฉํฅ(์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ)์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
- row-reverse: Flex Item์ ํ ๋ฐฉํฅ์ผ๋ก ๋ฐฐ์นํ๋, ์์๋ฅผ ์ญ์์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
- column: Flex Item์ ์ด ๋ฐฉํฅ(์์์ ์๋)์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
- column-reverse: Flex Item์ ์ด ๋ฐฉํฅ์ผ๋ก ๋ฐฐ์นํ๋, ์์๋ฅผ ์ญ์์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
flex-wrap
Flex Item์ด Flex Container๋ฅผ ๋ฒ์ด๋ ๋ ์ค๋ฐ๊ฟ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
.container {
flex-wrap: nowrap; /* nowrap, wrap, wrap-reverse */
}
- nowrap: ๊ธฐ๋ณธ๊ฐ์ผ๋ก, ๋ชจ๋ Flex Item์ ํ ์ค์ ๋ฐฐ์นํฉ๋๋ค.
- wrap: Flex Item์ ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ๋ฐฐ์นํฉ๋๋ค.
- wrap-reverse: Flex Item์ ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ๋ฐฐ์นํ๋, ์ญ์์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
flex-flow
flex-direction๊ณผ flex-wrap์ ๋จ์ถ ์์ฑ์ผ๋ก ๊ฒฐํฉํฉ๋๋ค.
.container {
flex-flow: row wrap;
}
justify-content
์ฃผ ์ถ์ ๋ฐ๋ผ Flex Item์ ์ ๋ ฌํฉ๋๋ค.
.container {
justify-content: flex-start; /* flex-start, flex-end, center, space-between, space-around, space-evenly */
}
- flex-start: ๊ธฐ๋ณธ๊ฐ์ผ๋ก, Flex Item์ ์ฃผ ์ถ์ ์์ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- flex-end: Flex Item์ ์ฃผ ์ถ์ ๋ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- center: Flex Item์ ์ฃผ ์ถ์ ์ค์์ ์ ๋ ฌํฉ๋๋ค.
- space-between: Flex Item ์ฌ์ด์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ ๋ฐฐ์นํ๊ณ , ์ฒซ ๋ฒ์งธ ์์ดํ ์ ์์ ์ง์ ์, ๋ง์ง๋ง ์์ดํ ์ ๋ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- space-around: Flex Item ์ฃผ์์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ ๋ฐฐ์นํฉ๋๋ค.
- space-evenly: Flex Item์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
align-item
๊ต์ฐจ ์ถ์ ๋ฐ๋ผ Flex Item์ ์ ๋ ฌํฉ๋๋ค.
.container {
align-items: stretch; /* flex-start, flex-end, center, baseline, stretch */
}
- stretch: ๊ธฐ๋ณธ๊ฐ์ผ๋ก, Flex Item์ Flex Container์ ๋์ด์ ๋ง๊ฒ ๋๋ฆฝ๋๋ค.
- flex-start: Flex Item์ ๊ต์ฐจ ์ถ์ ์์ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- flex-end: Flex Item์ ๊ต์ฐจ ์ถ์ ๋ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- center: Flex Item์ ๊ต์ฐจ ์ถ์ ์ค์์ ์ ๋ ฌํฉ๋๋ค.
- baseline: Flex Item์ ์ฒซ ๋ฒ์งธ ์ค์ ๊ธฐ์ค์ ์ ์ ๋ ฌํฉ๋๋ค.
align-content
๊ต์ฐจ ์ถ์ ๋ฐ๋ผ ์ฌ๋ฌ ์ค์ Flex Item์ ์ ๋ ฌํฉ๋๋ค. Flex Item์ด ํ ์ค์ผ ๊ฒฝ์ฐ ์ด ์์ฑ์ ํจ๊ณผ๊ฐ ์์ต๋๋ค.
- stretch: ๊ธฐ๋ณธ๊ฐ์ผ๋ก, ์ค์ Flex Container์ ๋์ด์ ๋ง๊ฒ ๋๋ฆฝ๋๋ค.
- flex-start: ์ค์ ๊ต์ฐจ ์ถ์ ์์ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- flex-end: ์ค์ ๊ต์ฐจ ์ถ์ ๋ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- center: ์ค์ ๊ต์ฐจ ์ถ์ ์ค์์ ์ ๋ ฌํฉ๋๋ค.
- space-between: ์ค ์ฌ์ด์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ ๋ฐฐ์นํฉ๋๋ค.
- space-around: ์ค ์ฃผ์์ ๊ท ๋ฑํ ๊ฐ๊ฒฉ์ ๋ฐฐ์นํฉ๋๋ค.
Flex Item ์์ฑ๐งฉ
order
Flex Item์ ๋ฐฐ์น ์์๋ฅผ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. ์ซ์๊ฐ ์์์๋ก ์์ ๋ฐฐ์น๋ฉ๋๋ค.
.item {
order: 1;
}
flex-grow
Flex Item์ ์ฆ๊ฐ ๊ฐ๋ฅ ๋น์จ์ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. ์ซ์๊ฐ ํด์๋ก ๋ ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํฉ๋๋ค.
.item {
flex-grow: 1;
}
flex-shrink
Flex Item์ ์ถ์ ๊ฐ๋ฅ ๋น์จ์ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค. ์ซ์๊ฐ ํด์๋ก ๋ ๋ง์ด ์ถ์๋ฉ๋๋ค.
.item {
flex-shrink: 1;
}
flex-basis
Flex Item์ ๊ธฐ๋ณธ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ auto์ด๋ฉฐ, ํฌ๊ธฐ ๋จ์(px, %, em ๋ฑ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
.item {
flex-basis: 100px;
}
flex
flex-grow, flex-shrink, flex-basis๋ฅผ ๊ฒฐํฉํ ๋จ์ถ ์์ฑ์ ๋๋ค.
.item {
flex: 1 1 100px;
}
align-self
ํน์ Flex Item์ ๊ต์ฐจ ์ถ ์ ๋ ฌ์ ์ค์ ํฉ๋๋ค. align-items ์์ฑ์ ๋ฎ์ด์๋๋ค.
.item {
align-self: flex-start; /* auto, flex-start, flex-end, center, baseline, stretch */
}
- auto: ๊ธฐ๋ณธ๊ฐ์ผ๋ก, ๋ถ๋ชจ์ align-items ์์ฑ์ ์์๋ฐ์ต๋๋ค.
- flex-start: ๊ต์ฐจ ์ถ์ ์์ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- flex-end: ๊ต์ฐจ ์ถ์ ๋ ์ง์ ์ ์ ๋ ฌํฉ๋๋ค.
- center: ๊ต์ฐจ ์ถ์ ์ค์์ ์ ๋ ฌํฉ๋๋ค.
- baseline: ์ฒซ ๋ฒ์งธ ์ค์ ๊ธฐ์ค์ ์ ์ ๋ ฌํฉ๋๋ค.
- stretch: Flex Container์ ๋์ด์ ๋ง๊ฒ ๋๋ฆฝ๋๋ค.
์ค์ ์์ ๐
๊ธฐ๋ณธ ๋ ์ด์์ ๊ตฌ์ฑ ์์
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<style>
.container {
display: flex;
}
.item {
flex: 1;
padding: 10px;
background: lightblue;
margin: 5px;
}
</style>
์ ๋ ฌ ๋ฐ ๋ฐฐ์น ์์
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<style>
.container {
display: flex;
justify-content: space-between;
align-items: center;
}
.item {
padding: 20px;
background: lightcoral;
margin: 10px;
}
</style>
๋ฐ์ํ ๋ ์ด์์ ์์
<div class="container">
<div class="item">Item 1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
}
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
.item {
background-color: #4CAF50;
color: white;
padding: 20px;
margin: 10px;
flex: 1 1 calc(33.333% - 40px); /* 3 items per row, accounting for margin */
box-sizing: border-box;
}
@media (max-width: 800px) {
.item {
flex: 1 1 calc(50% - 40px); /* 2 items per row on smaller screens */
}
}
@media (max-width: 500px) {
.item {
flex: 1 1 100%; /* 1 item per row on very small screens */
}
}
</style>
๊ณ ๊ธ ํ์ฉ ๋ฐฉ๋ฒ๐
์ค์ฒฉ๋ Flexbox ์ฌ์ฉ
Flexbox ์ปจํ ์ด๋ ๋ด์ ๋ ๋ค๋ฅธ Flexbox ์ปจํ ์ด๋๋ฅผ ๋ง๋ค์ด ๋ณต์กํ ๋ ์ด์์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
<div class="outer-container">
<div class="inner-container">
<div class="item">1</div>
<div class="item">2</div>
</div>
<div class="item">3</div>
</div>
<style>
.outer-container {
display: flex;
justify-content: space-between;
}
.inner-container {
display: flex;
flex-direction: column;
}
.item {
background: lightpink;
padding: 10px;
margin: 5px;
}
</style>
Flexbox์ Grid์ ์ฐจ์ด์ ๋ฐ ๊ฒฐํฉ ์ฌ์ฉ ๋ฐฉ๋ฒ
Flexbox๋ 1์ฐจ์ ๋ ์ด์์(ํ ๋๋ ์ด) ์ค๊ณ์ ์ ํฉํ๊ณ , Grid๋ 2์ฐจ์ ๋ ์ด์์์ ์ ํฉํฉ๋๋ค. ๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ ๋ณต์กํ๊ณ ๋ค์ํ ๋ ์ด์์์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฆฌํ ์ฌ์ฉ ๋ฐฉ๋ฒ
Flexbox๋ ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋ฉ๋๋ค. ๊ตฌํ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ํด Autoprefixer์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด CSS ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
๋ฌธ์ ํด๊ฒฐ ํ๐ ๏ธ
์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
- Flex Item์ ์์์น ๋ชปํ ํฌ๊ธฐ ๋ณํ: flex-shrink์ flex-grow ๊ฐ์ ์กฐ์ ํฉ๋๋ค.
- Flex Container์ ๋์ด ๋ฌธ์ : align-items: stretch ์์ฑ์ ํ์ฉํฉ๋๋ค.
๋๋ฒ๊น ํ
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด Flex Container์ Flex Item์ ์์ฑ์ ํ์ธํฉ๋๋ค.
- Flexbox Inspector ํ์ฅ ๋๊ตฌ๋ฅผ ํ์ฉํฉ๋๋ค.
ํต์ฌ ๋ด์ฉ๐