Float vs Flex vs Grid - ChoDragon9/posts GitHub Wiki
๋ ์ด์์์ ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Float, Flex, Grid ์์๋ก ๋ ์ด์์์ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ์ ๋์์ต๋๋ค. ๊ฐ ๊ธฐ์ ๋ค์ ์ฐจ์ด์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ง๋ค์ด์ง Grid๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ฅ์ ์ด ์๋ ์ง ์ค๋ช ํฉ๋๋ค.
6 Grid๋ฅผ 1:3:2๋ก ๋๋๊ณ ๊ฐ๊ฐ ๊ฐ์ ์ฌ๋ฐฑ์ ๊ฐ์ง ๋ ์ฝ๋๋ฅผ ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
Float๋ก ๊ฐ๋ฐํ ๋๋ ๊ฐ๋ก ์ฌ์ด์ฆ๋ฅผ ์ฐ๋ฆฌ๊ฐ ๊ณ์ฐํด์ ์์ฑ์ ํด์ผ ๋ฌ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ overflow: hidden
๊ณผ ๊ฐ์ธ ํน๋ณํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ฝ๋ฉ์ ํด์ผ ํฉ๋๋ค. ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฌ๋ฐฑ๊ฐ ์์ ์ ๋ง์ ์ฝ๋๋ฅผ ์์ ํด์ผ ๋ฉ๋๋ค.
.box {overflow: hidden}
.item {float: left}
.item:nth-of-type(1) {
width: calc((100% - 20px) * 1 / 6)
}
.item:nth-of-type(2) {
width: calc((100% - 20px) * 3 / 6);
margin: 0 10px
}
.item:nth-of-type(3) {
width: calc((100% - 20px) * 2 / 6)
}
<div class="box">
<div class="item">1/6</div>
<div class="item">3/6</div>
<div class="item">2/6</div>
</div>
Flex๊ฐ ๋์ ์ด ๋๋ฉด์ ์ข๋ ์ถ์์ ์ผ๋ก ๊ธฐ์ ์ด ๊ฐ๋ฅํ์ต๋๋ค. 1:3:2 ๋น์จ์ ์์ ์๋ฆฌ๋จผํธ์ ๊ธฐ์ ํ๋ฉด ๋ ์ด์์์ ์ง์ ๊ฐ๋ฅํฉ๋๋ค.
.box {display: flex;}
.item:nth-of-type(1) {flex: 1}
.item:nth-of-type(2) {
flex: 3;
margin: 0 10px
}
.item:nth-of-type(3) {flex: 2}
<div class="box">
<div class="item">flex(1)</div>
<div class="item">flex(3)</div>
<div class="item">flex(2)</div>
</div>
Grid๋ Flex์ฒ๋ผ ์ถ์์ ์ผ๋ก ๋น์จ์ด ๊ธฐ์ ๊ฐ๋ฅํ๊ณ , ๊ทธ๊ฒ์ ๋ถ๋ชจ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์์๋ค์ ๋ ์ด์์์ ๋ถ๋ชจ์์ ์กฐ์์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋ ์ด์์ ์ฝ๋ฉ์ ํ ๋ถ๋ถ์์ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
.box {
display: grid;
grid-template-columns: 1fr 3fr 2fr;
grid-gap: 10px
}
<div class="box">
<div>1fr</div>
<div>3fr</div>
<div>2fr</div>
</div>
๊ธฐ๋ฅ๊ฒฝ๊ธฐ๋ํ ๊ณผ์ ์ค ๋ผ๋์ค ๋ฐ์ค๋ฅผ ํด๋ฆญํ๋ฉด ๋ฐฐ๊ฒฝ์ด ๋ฐ๋๋ ์๊ตฌ์ฌํญ์ด ์์ต๋๋ค. CSS๋ง์ผ๋ก ๊ตฌํํด์ผ๋์ด ์ต์ง์ค๋ฌ์ด(?) ๊ธฐ๋ฅ์ด๋ผ๊ณ ์๊ฐ๋์ง๋ง Grid๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ ๋ถ์์ฐ์ค๋ฝ์ง ์์ต๋๋ค.
Float๋ฅผ ์ฌ์ฉ ํ ๋๋ position
์ absolute
, reletive
์ top/bottom/left/right
์ ๊ฐ์ ์์ฑ์ ๊ต์ฅํ ์ธ๋ฐํ๊ฒ ๋ค๋ฃฐ ์ ์์ด์ผ ํ์ต๋๋ค. ์ด ๋ฐฉ์์ ๊ต์ฅํ ์๊ฐ๊ณผ ์ฝ๋ฉ์์ด ๋ง์ ์ง๋๋ค.
div {border: 1px solid #000}
.wrapper {
position: relative;
height: 300px;
overflow: hidden
}
.content {
position: absolute;
z-index: 2;
left: 10%;
bottom: 30px;
width: 80%;
height: 100px;
}
.radio {
position: absolute;
z-index: 2;
right: calc(10% + 20px)
}
.bg {
position: absolute;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.radio:nth-of-type(1) {bottom: 95px}
.radio:nth-of-type(2) {bottom: 75px}
.radio:nth-of-type(3) {bottom: 55px}
.radio:nth-of-type(1):checked ~ .bg {
background: #f00
}
.radio:nth-of-type(2):checked ~ .bg {
background: #0f0
}
.radio:nth-of-type(3):checked ~ .bg {
background: #00f
}
<div class="wrapper">
<div class="content"> </div>
<input type="radio" class="radio" name="btn" checked>
<input type="radio" class="radio" name="btn">
<input type="radio" class="radio" name="btn">
<div class="bg"> </div>
</div>
Flex๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ position
์ absolute
, reletive
์ฌ์ฉ์ด ์ค์ง ์์์ต๋๋ค. ๋จ์ง ๊ฐ ์์๋ค๊ฐ์ ๊ฐ๊ฒฉ์ ์ฝ๊ฒ ๋ง์ถ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
div {border: 1px solid #000}
.wrapper {
position: relative;
height: 300px;
display: flex;
justify-content: center;
align-items: flex-end;
padding-bottom: 30px
}
.content {
position: absolute;
z-index: 2;
width: 80%;
height: 100px;
}
.radio {
position: absolute;
right: calc(10% + 20px);
z-index: 2
}
.bg {
position: absolute;
z-index: 1;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.radio:nth-of-type(1) {bottom: 95px}
.radio:nth-of-type(2) {bottom: 75px}
.radio:nth-of-type(3) {bottom: 55px}
.radio:nth-of-type(1):checked ~ .bg {
background: #f00
}
.radio:nth-of-type(2):checked ~ .bg {
background: #0f0
}
.radio:nth-of-type(3):checked ~ .bg {
background: #00f
}
<div class="wrapper">
<div class="content"></div>
<input type="radio" class="radio" name="btn" checked>
<input type="radio" class="radio" name="btn">
<input type="radio" class="radio" name="btn">
<div class="bg"></div>
</div>
Grid๋ฅผ ์ฌ์ฉํ๋ฉด 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ์์ ์์๋ฅผ ์ํ๋ ์์น์ ๋ฃ์ ์ ์์ต๋๋ค. position
์ absolute
, reletive
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , top/bottom/left/right
๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ํ๋ ์์น์ ๋ฃ์ ์ ์์ต๋๋ค.
div {border: 1px solid #000}
.wrapper {
display: grid;
height: 300px;
grid-template:
'. . . .' 170px
'. . . .' 20px
'. . radio1 .' 20px
'. . radio2 .' 20px
'. . radio3 .' 20px
'. . . .' 20px
'. . . .' 30px
/ 10% auto 32px 10%
}
.content {
z-index: 2;
grid-area: 2 / 2 / 7 / 4
}
.radio {z-index: 2}
.bg {grid-area: 1 / 1 / 8 / 5; z-index: 1}
.radio:nth-of-type(1) {grid-area: radio1}
.radio:nth-of-type(2) {grid-area: radio2}
.radio:nth-of-type(3) {grid-area: radio3}
.radio:nth-of-type(1):checked ~ .bg {
background: #f00
}
.radio:nth-of-type(2):checked ~ .bg {
background: #0f0
}
.radio:nth-of-type(3):checked ~ .bg {
background: #00f
}
<div class="wrapper">
<div class="content"></div>
<input type="radio" class="radio" name="btn" checked>
<input type="radio" class="radio" name="btn">
<input type="radio" class="radio" name="btn">
<div class="bg"></div>
</div>