Parent's height of the absolute children
Absolute child is not contained in parent's content
1. One Child ๐ฉโ๐ป
1. Problem
<section class="container">
<div class="child child-1"></div>
</section>
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
position: relative;
}
.child {
position: absolute;
width: 200px;
height: 150px;
background-color: #37e;
top: 0;
right: 20px;
}
์ด๋ฐ์์ผ๋ก ์์์ด ๋ถ๋ชจ๋ก๋ถํฐ ์์ ๋ก์์ง๋ค๋ณด๋ ๋ถ๋ชจ๋ content ๊ฐ ์๋ ๊ฒ์ด๋ ๋ง์ฐฌ๊ฐ์ง์ธ ์ํฉ์ด ๋์ด ๋์ด๋ฅผ ๊ฐ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
2. Solution 1 - Calculate Height
๊ฐ์ฅ ์ฝ์ง๋ง ๋ณ๋ก ์ฐ๊ณ ์ถ์ง ์์ ๋ฐฉ๋ฒ์ด๋ค. ์์์ ๊ฐ์ธ๊ธฐ ์ํด ํ์ํ ๋์ด๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํด์ ๋ฃ๋ ๊ฒ์ด๋ค. ๋ฌธ์ ๋ ์์์ด ๋ณ๊ฒฝ๋๋ฉด ๋ถ๋ชจ ์ญ์ ํฌ๊ธฐ๋ฅผ ์์ ํด์ค์ผํ๋ฉฐ, ๋ฐ์ํ์ผ๋ก ์์ฑํ๋ ๋ฐ ๋ฌด๋ฆฌ๊ฐ ์๊ธด๋ค. ์ด ํฌ์คํ ์ ์ฐ๊ฒ ๋ ๊ณ๊ธฐ๊ฐ ์ธ๊ฐ์์ ์ด๋ฐ์์ผ๋ก ๊ฐ๋ฅด์น๋ ๊ฒ์ ๋ณธ ์ ์ด ์๋ค. ์ธ๊ฐ์ด ์ด๋ฌ๋ฉด ์ ๋๋๊ฑฐ ์๋? ๐คจ
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
position: relative;
height: 158px;
}
.child {
position: absolute;
width: 200px;
height: 150px;
background-color: #37e;
top: 0;
right: 20px;
}
3. Solution 2 - Use float
์์ฆ์์ผ flex
์ grid
๊ฐ ๋์์ ๊ฐ๋ก ๋ฐฐ์น๋ฅผ ์ํด ๊ตณ์ด float
์ ์ ์ฐ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ ์ข์ ํด๊ฒฐ์ฑ
์ด ๋ ์ ์๋ค.
<section class="container clearfix">
<div class="child child-1"></div>
</section>
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
}
.clearfix {
display: flow-root;
}
.child {
width: 200px;
height: 150px;
background-color: #37e;
float: right;
margin-right: 20px;
}
๋๋
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
}
.clearfix::after {
content: "";
display: block;
clear: both;
}
.child {
width: 200px;
height: 150px;
background-color: #37e;
float: right;
margin-right: 20px;
}
4. Solution 4 - Use flex/grid
๋ฐ๋ก ์ float ์ ์ฌ์ฉํ ๋ฌธ์ ํด๊ฒฐ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก absolute
๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ค.
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
display: flex;
justify-content: flex-end;
}
.child {
width: 200px;
height: 150px;
background-color: #37e;
margin-right: 20px;
}
๋๋
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
display: grid;
justify-content: end;
}
.child {
width: 200px;
height: 150px;
background-color: #37e;
margin-right: 20px;
}
2. Children ๐ฉโ๐ป
<section class="container">
<div class="child child-1"></div>
<div class="child child-2"></div>
</section>
๊ทธ๋ ๋ค๋ฉด ์์์ด ๋ ์ด์์ด๊ณ , ์ด๋ค์ ๋ฐฐ์น๊ฐ ์ ๋๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค๋ฉด(= absolute ๋ฅผ ํตํ ๊ฒน์นจ) ์ด๋ป๊ฒ ํด์ผํ ๊น?
1. Solution 1 - Calculate Height
์ด ๊ฒฝ์ฐ ๋น์ฐํ๊ฒ๋ ๋์ด๋ฅผ ๊ณ์ฐํด ๋ฃ์ด์ฃผ๋ฉด ์ ์์ ์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์์์๋ ์ธ๊ธํ๋ฏ์ด ๋ฐ์ํ์ ๋์ํ ์ ์์ด ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ค.
.container {
border: 4px solid #a00;
width: 300px;
position: relative;
box-sizing: border-box;
height: 158px;
}
.child {
position: absolute;
width: 200px;
height: 150px;
background-color: #37e;
top: 0;
right: 20px;
&.child-2 {
background-color: #3e7;
opacity: 0;
&:hover {
opacity: 1;
}
}
}
2. Solution 2 - Use float
์ด ๊ฒฝ์ฐ float
๊ณผ relative/absolute
๋ฅผ ๋ชจ๋ ์ฌ์ฉํด์ผํ๋ค.
- ๋ถ๋ชจ์๊ฒ ๋์ด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด
float
์ด ํ์. - ์์์ด ์๋ก ๊ฒน์น๊ธฐ ์ํด
relative/absoltue
๊ฐ ํ์.
ํ๊ธฐ ๋๋ฌธ์ด๋ค.
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
position: relative;
}
.clearfix {
display: flow-root;
}
.child {
width: 200px;
height: 150px;
background-color: #37e;
&.child-1 {
float: right;
margin-right: 20px;
}
&.child-2 {
background-color: #3e7;
opacity: 0;
position: absolute;
top: 0;
right: 20px;
&:hover {
opacity: 1;
}
}
}
3. Solution 3 - Use flex/grid
์ด ๊ฒฝ์ฐ ์ญ์ ๋ฐ๋ก ์ float ์ ์ฌ์ฉํ ๋ฌธ์ ํด๊ฒฐ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก flex/grid
์ relative/absolute
๋ฅผ
๋ชจ๋ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์๋ค.
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
position: relative;
display: flex;
justify-content: flex-end;
}
.child {
width: 200px;
height: 150px;
background-color: #37e;
&.child-1 {
margin-right: 20px;
}
&.child-2 {
background-color: #3e7;
opacity: 0;
position: absolute;
top: 0;
right: 20px;
&:hover {
opacity: 1;
}
}
}
4. Solution 4 - Use block
ํ์ง๋ง ์ ์ผ์ด์ค๋ค์ ๋ชจ๋ CSS ์๋ ์๋ฆฌ์ ๊ธฐ๋ฐํด ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์์ ์ผ ๋ฟ ์ค์ ๋ก ์ ๋ฐ ์ผ์ด์ค๋ ๋ณด๊ธฐ ํ๋ค๋ค.
์ฃผ๋ก ๋ง์ด ๋ณผ ์ ์๋ ๊ฒ์ 2๊ฐ๊ฐ ๊ฒน์น์ง๋ง ๋ถ๋ชจ๊ฐ ๋จ์ง Wrapper ๋ก์์ ์ญํ ๋ง ํ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๋ณต์กํ๊ฒ ์๊ฐํ ํ์ ์์ด ๋ถ๋ชจ๋ relative
๋ฅผ
๊ฐ๊ณ , ์์ ํ๋๋ position ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ ธ ๋์ด๋ฅผ ์ ๊ณตํ๊ณ , ๋ค๋ฅธ ์์์ absolute
๋ฅผ ๊ฐ์ ธ ๊ฒน์น๋๋ก ํ๋ฉด ๋๋ค.
.container {
border: 4px solid #a00;
box-sizing: border-box;
width: 300px;
position: relative;
}
.child {
width: 100%;
height: 150px;
background-color: #37e;
&.child-2 {
background-color: #3e7;
opacity: 0;
position: absolute;
top: 0;
left: 0;
&:hover {
opacity: 1;
}
}
}
์ด๊ฒ์ ์ฃผ๋ก โ๊ทธ๋ฆผ๊ณผ gif ๋ฅผ ๊ฒน์น๊ฑฐ๋โ, โ๊ทธ๋ฆผ๊ณผ ๋์์์ ๊ฒน์น ๋โ ์ฌ์ฉ๋๋ค. ์๋๋ ์ฌ์ฉ ์์๋ค.