๐ฆ 01. ๋ฐ์ค ๋ชจ๋ธ๊ณผ ๋ ๋๋ง ์๋ฆฌ: '์ ๋ด ๋ฐ์ค๊ฐ ์๊พธ ์์ ธ๋๊ฐ๊น?'
๐ ๊ฐ์
CSS์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด์ ํต์ฌ์ธ ๋ฐ์ค ๋ชจ๋ธ์ ๊ตฌ์ฑ ์์์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ์์ฒ ์ด์ ํจ๊ป ํํค์ณ ๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 8๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 4๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๋ฐ์ค์ ๊ตฌ์ฑ ์์] โ [box-sizing์ ํ๋ช
] โ [๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- CSS ๋ฐ์ค ๋ชจ๋ธ์ 4๊ฐ์ง ๊ตฌ์ฑ ์์๋ฅผ ์๋ฒฝํ๊ฒ ์ค๋ช ํ ์ ์์ต๋๋ค.
-
content-box์border-box์ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ ์ค๋ฌด์์ ์ค์ํ์ง ์์ต๋๋ค. - CSS ์์ฑ ํ๋๊ฐ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ(Reflow/Repaint)์ ๋ฏธ์น๋ ์ํฅ์ ์ธ์งํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์ ): "์ํธ ๋! ๋ถ๋ช ํ ๊ฐ๋ก ๊ธธ์ด๋ฅผ 100px๋ก ์คฌ๋๋ฐ, ํจ๋ฉ์ด๋ ํ ๋๋ฅผ ๋ฃ์ผ๋๊น ๋ฐ์ค๊ฐ 120px์ด ๋์ด์! ๋ ์ด์์์ด ๋ค ๊นจ์ ธ์ ์์ ๋์ด ํธํต์น์๊ธฐ ์ผ๋ณด์ง์ ์ด์์... ๐ญ"
- ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, CSS๋ ๋จ์ํ ์์น ํ๋ ๋๊ตฌ๊ฐ ์๋์์. ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต๊ฐ์ ๊ณ์ฐํ๋ 'Box Model'์ ์ฒ ํ์ ์ดํดํ์ง ๋ชปํ๋ฉด ํ์ 1px๊ณผ ์ธ์์ผ ํ ๊ฒ๋๋ค. ์, ๋ฐ์ค ์์ชฝ๋ถํฐ ๋ค์ ๋ค์ฌ๋ค๋ณด์ฃ ."
๐ค ์ ์์์ผ ํ๋๊ฐ
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ CSS๋ '๊ณต๊ฐ์ ๋ค๋ฃจ๋ ์์ ' ์ ๋๋ค. ํ์ง๋ง ๊ทธ ์์ ์ ๊ธฐ์ด๋ ์์ฃผ ์ฐจ๊ฐ์ด ์ํ์ ๊ณ์ฐ ์์ ์ธ์์ ธ ์์ฃ .
์์ฒ ์ด๊ฐ ๊ฒช์ ๋ฌธ์ ๋ ๋จ์ํ ์ค์๊ฐ ์๋๋ผ, CSS์ ๊ธฐ๋ณธ๊ฐ์ธ content-box์ ๋์ ์๋ฆฌ๋ฅผ ๋ชฐ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ํ์ฐ์ ์ธ ๊ฒฐ๊ณผ์
๋๋ค. ์ด ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ฉด ํ๋ฉด์ด ์กฐ๊ธ๋ง ๋ณต์กํด์ ธ๋ ๋ ์ด์์์ด ํฝ์
๋จ์๋ก ์ด๊ธ๋๊ณ , ์ด๋ ๊ณง ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ์ ํ๋ก ์ด์ด์ง๋๋ค. ๋์๊ฐ ์ฐ๋ฆฌ๊ฐ ์ด CSS ํ ์ค์ด ๋ธ๋ผ์ฐ์ ๋ด๋ถ์์ ์ด๋ป๊ฒ ํฝ์
๋ก ๋ณํ๋์ง(Rendering)๋ฅผ ์์์ผ 5๋
์ฐจ ์ด์์ ์๋์ด๊ฐ ๊ฐ์ถฐ์ผ ํ '์ฑ๋ฅ' ์ ๋ํ ๊ฐ๊ฐ์ ๊ธฐ๋ฅผ ์ ์์ต๋๋ค.
๐๏ธ 1. CSS ๋ฐ์ค์ 40์ธต ์ํ: ๊ตฌ์ฑ ์์
๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ ์์๋ฅผ ์ฌ๊ฐํ ๋ฐ์ค๋ก ์ทจ๊ธํฉ๋๋ค. ์ด ๋ฐ์ค๋ ์์ชฝ์์๋ถํฐ ๋ฐ๊นฅ์ชฝ์ผ๋ก 4๊ฐ์ ์ธต์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Content (๋ด์ฉ): ์ค์ ํ ์คํธ๋ ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ๋ ํต์ฌ ์์ญ์ ๋๋ค.
- Padding (์์ชฝ ์ฌ๋ฐฑ): ํ ๋๋ฆฌ์ ๋ด์ฉ ์ฌ์ด์ ๊ณต๊ฐ์ ๋๋ค. ๋ฐฐ๊ฒฝ์์ ์ํฅ์ ๋ฐ์ต๋๋ค.
- Border (ํ ๋๋ฆฌ): ํจ๋ฉ๊ณผ ๋ง์ง ์ฌ์ด์ ๊ฒฝ๊ณ์ ์ ๋๋ค.
- Margin (๋ฐ๊นฅ ์ฌ๋ฐฑ): ๋ฐ์ค์ ๋ค๋ฅธ ๋ฐ์ค ์ฌ์ด์ ๊ณต๊ฐ์ ๋๋ค. ์ธ์ ํ ์์๋ค๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
.box {
width: 100px;
padding: 10px;
border: 5px solid black;
margin: 15px;
}๐ฆ ์ํธ์ ํ:
"์์ฒ ๋, ์ฌ๊ธฐ์width: 100px์ ์ด๋๋ฅผ ์๋ฏธํ ๊น์? ๊ธฐ๋ณธ์ ์ผ๋ก๋ Content ๋ง์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋์ ์ค์ ๋ฐ์ค๊ฐ ์ฐจ์งํ๋ ์ ์ฒด ๊ฐ๋กํญ์100 + 10*2(ํจ๋ฉ) + 5*2(ํ ๋๋ฆฌ) = 130px์ด ๋๋ ๊ฑฐ์ฃ . ๋ง์ง์ ๋ฐ์ค ๋ฐ๊นฅ์ ๊ณต๊ฐ์ด๋ ์ด 160px์ ์๋ฆฌ๊ฐ ํ์ํด์ง๋๋ค."
๐ 2. box-sizing: ๊ฐ๋กํญ์ ํํ๋ฅผ ์ํ์ฌ
์์ฒ ์ด์ฒ๋ผ ์ํ ๊ณ์ฐ์ ์ง์น ๊ฐ๋ฐ์๋ค์ ์ํด CSS๋ ๊ตฌ์ํฌ์๋ฅผ ๋ฑํ์์ผฐ์ต๋๋ค. ๋ฐ๋ก box-sizing ์์ฑ์
๋๋ค.
content-box(๊ธฐ๋ณธ๊ฐ):width๊ฐ ์ค์ง ๋ด์ฉ๋ฌผ(Content)๋ง ๋ด๋นํฉ๋๋ค. ํจ๋ฉ์ ๋ฃ์ผ๋ฉด ๋ฐ์ค๊ฐ ์ปค์ง๋๋ค.border-box(์ค๋ฌด ํ์ค):width๊ฐ ํ ๋๋ฆฌ(Border)๊น์ง ํฌํจํฉ๋๋ค. ์ฆ, ํจ๋ฉ์ด๋ ํ ๋๋ฆฌ๋ฅผ ์๋ฌด๋ฆฌ ๋ฃ์ด๋ ์ ์ฒด ๋ฐ์ค ํฌ๊ธฐ๋ ๋ณํ์ง ์๊ณ ๋ด์ฉ๋ฌผ ์์ญ์ด ์์์ ์ค์ด๋ญ๋๋ค.
/* ๐ฆ ์ํธ: ์ค๋ฌด์์๋ ๋ฌด์กฐ๊ฑด ์ด๊ฑธ ์ต์๋จ์ ๊น๊ณ ์์ํฉ๋๋ค. */
* {
box-sizing: border-box;
}๐ฃ ์์ฒ : "์! ๊ทธ๋ผ ์ด์ ์ผ์ผ์ด ๊ณ์ฐ ์ ํด๋ ๋ด๊ฐ ์ง์ ํ width ์์์ ๋ค ํด๊ฒฐ๋๋ ๊ฑฐ๋ค์? ์ง์ง ํธํ๋ค!"
๐จ 3. ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ (The Way to Pixel)
์ฐ๋ฆฌ๊ฐ ์ด CSS๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ง๊ธฐ๊น์ง ๋ธ๋ผ์ฐ์ ๋ ํ๋ํ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- DOM + CSSOM = Render Tree: HTML ๊ตฌ์กฐ์ CSS ์คํ์ผ์ ํฉ์ณ์ '๋ณด์ฌ์ค ๊ฒ'๋ค์ ์ง๋๋ฅผ ๋ง๋ญ๋๋ค.
- Layout (Reflow): ๋๊ฐ ์ด๋์ ์์นํ ์ง, ํฌ๊ธฐ๋ ์ผ๋ง์ผ์ง ๊ณต๊ฐ์ ๊ณ์ฐํฉ๋๋ค. (๋ฐ์ค ๋ชจ๋ธ์ด ์ฌ๊ธฐ์ ์ฐ์ ๋๋ค!)
- Paint (Repaint): ๊ณ์ฐ๋ ์์น์ ์์ ์น ํ๊ณ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฝ๋๋ค.
- Composite: ์ฌ๋ฌ ๊ฐ์ ์ธต(Layer)์ ํฉ์ณ ์ต์ข ํ๋ฉด์ ๋ง๋ญ๋๋ค.
โ ๏ธ ์ฃผ์! ์ฑ๋ฅ ๊ฒฝ๋ณด:
width,height,margin๋ฑ์ ๋ฐ๊พธ๋ฉด Layout ๋จ๊ณ๋ถํฐ ๋ค์ ์์ํด์ผ ํฉ๋๋ค(Reflow). ๋ฐ๋ฉดcolor,background-color๋ง ๋ฐ๊พธ๋ฉด ๊ณ์ฐ์ ๊ฑด๋๋ฐ๊ณ Paint ๋ง ๋ค์ ํ๋ฉด ๋์ฃ (Repaint). 5๋ ์ฐจ ๊ฐ๋ฐ์๋ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ๋ Reflow๊ฐ ๋ฐ์ํ๋ ์์ฑ ๋์ ๋ถํ๊ฐ ์ ์transform์ด๋opacity๋ฅผ ์ ํํฉ๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. box-sizing: border-box ์ค์ ์ด ๋์ด ์์ ๋, width: 200px, padding: 20px, border: 1px์ธ ์์์ ์ค์ Content ์์ญ ๊ฐ๋ก ๊ธธ์ด๋ ์ผ๋ง์ผ๊น์?
โ
์ ๋ต: 158px
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
border-box์์๋width๊ฐ Content + Padding + Border๋ฅผ ๋ชจ๋ ํฌํจํฉ๋๋ค. ๋ฐ๋ผ์ Content = 200 - (20ร2) - (1ร2) = 158px์ ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋,
content-box(๊ธฐ๋ณธ๊ฐ)์๋ค๋ฉด Content๊ฐ 200px ๊ทธ๋๋ก์ง๋ง,border-box๋ ์ดํฉ์ด 200px์ด๋๊น ์์ชฝ์ผ๋ก ์ค์ด๋๋ ๊ฑฐ์์!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "border-box = ํ ๋๋ฆฌ๊น์ง ํฌํจํ๋ ์ด๋ ์ ํ. ์์์ ์์์ ๋๋ ๊ฐ์ ธ๋ผ!"
Q2. ๋ค์ ์ค ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์์ ๊ฐ์ฅ ๋ง์ ์ฐ์ฐ ๋น์ฉ์ด ๋ฐ์ํ๋(Reflow๋ฅผ ์ ๋ฐํ๋) ์์ฑ์ ๋ฌด์์ผ๊น์?
opacitybackground-colormargin-topvisibility
โ
์ ๋ต: 3. margin-top
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
margin-top์ ์์์ ๊ธฐํํ์ ์์น๋ฅผ ๋ฐ๊พธ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์์ ์ฒ์๋ถํฐ ๋ค์ ๊ณ์ฐ(Reflow)ํด์ผ ํฉ๋๋ค. ๋ฐ๋ฉดopacity,background-color,visibility๋ ๋ ์ด์์ ๋ณ๊ฒฝ ์์ด ์์/ํฌ๋ช ๋๋ง ๋ฐ๊พธ๋ฏ๋ก Repaint๋ง ๋ฐ์ํฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์์น๋ ํฌ๊ธฐ๋ฅผ ๋ฐ๊พธ๋ ์์ฑ(
margin,width,padding๋ฑ)์ Reflow์ ์ฃผ๋ฒ์ด์์. ์ ๋๋ฉ์ด์ ์๋transform๊ณผopacity๋ง ์ฐ๋ ๊ฒ ์ฑ๋ฅ์ ํต์ฌ์ ๋๋ค!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์์นยทํฌ๊ธฐ = Reflow(๋น์), ์๊นยทํฌ๋ช ๋ = Repaint(์ ๋ ด)"
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง]
์์ฒ ์ด๊ฐ ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ํ๋จ ํ
๋๋ฆฌ๋ฅผ ๋ฃ์๋๋ ๊ฐ์๊ธฐ ๋ฆฌ์คํธ ์ ์ฒด ๋์ด๊ฐ ๋์ด๋๋ฉด์ ์คํฌ๋กค๋ฐ๊ฐ ์๊ฒจ๋ฒ๋ ธ์ต๋๋ค. ์์ ๋์์ด๋ ๋์ด "์คํฌ๋กค ์๊ธฐ๋ฉด UX ๋ง๊ฐ์ ธ์!"๋ผ๊ณ ์ธ์น๊ณ ๊ณ์๋ค์. ์์ฒ ์ด๊ฐ ๋ฐ์ค ๋ชจ๋ธ์ ์๋ฆฌ๋ฅผ ์ด์ฉํด ์ด ์ํฉ์ ๊ฐ์ฅ ์ฐ์ํ๊ฒ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น์?
โ
์ ๋ต: ํด๋น ์์์ box-sizing: border-box๋ฅผ ์ ์ฉํ๊ฑฐ๋, ๋์ด๋ ํ
๋๋ฆฌ ๋๊ป๋งํผ height๋ฅผ ์ค์ด๊ธฐ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ํ ๋๋ฆฌ(Border)๋ ๋ฐ์ค ๋ชจ๋ธ์์ ๋ฐ์ค์ ํฌ๊ธฐ๋ฅผ ํค์ฐ๋ ์์์ ๋๋ค. ๊ณ ์ ๋ ๋์ด๋ฅผ ๊ฐ์ง ์ปจํ ์ด๋ ์์์ ์์ ์์์ ํ ๋๋ฆฌ๊ฐ ์ถ๊ฐ๋๋ฉด ๋ด๋ถ ๊ณต๊ฐ์ด ๋ถ์กฑํด์ ธ ์คํฌ๋กค์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋,
overflow: hidden์ผ๋ก ์คํฌ๋กค๋ง ๊ฐ๋ฆฌ๋ ๊ฑด ์์๋ฐฉํธ์ผ ๋ฟ์ด์์. ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ์ค๊ฐ ์ ์ปค์ก๋์ง๋ฅผ ์ดํดํ๊ณborder-box๋ฅผ ์ฐ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋ด ๊ฐ๋ก์ธ๋ก๋ฅผ ๋๊น์ง ์ฑ ์์ง๊ณ ์ถ๋ค๋ฉด? border-box!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ ์ ๋ง 1px์ ์์คํจ์ ๊นจ๋ฌ์ ํ๋ฃจ์๋ค.
์์ ๋์ด "๋ ์ด์์์ด ์ ์ด๋ ๊ฒ ๋์ปน๊ฑฐ๋ ค?"๋ผ๊ณ ํ์ค ๋ ์์๋์ด ๋ฌ๋๋ฐ, ์ํธ ๋์ด ๋ฐ์ค ๋ชจ๋ธ ๊ทธ๋ฆผ ํ ์ฅ์ผ๋ก ๊น๋ํ๊ฒ ์ ๋ฆฌํด ์ฃผ์
จ๋ค.
๊ทธ๋์ ๋๋ ๊ทธ๋ฅ ๋๋์ค์ผ๋ก ํจ๋ฉ ๋ฃ๊ณ ๋ง์ง ๋ฃ์ผ๋ฉด์ "๋์ถฉ ๋ง๊ฒ ์ง" ํ๋๋ฐ, ๊ทธ๊ฒ ๋ด ์ฝ๋์ ํ๋ฆฌํฐ๋ฅผ ๊น์๋จน๊ณ ์์๋ค๋ ๊ฒ ์ข ๋ถ๋๋ฌ์ ๋ค.
๐ก "CSS ๋ฐ์ค๋ ๋จ์ํ ๋ค๋ชจ๊ฐ ์๋๋ผ, ์ ๊ตํ๊ฒ ์ง์กฐ๋ 4๊ฐ์ ์ธต์ด๋ค. ์ด ์ธต๋ค์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๋ ์ด์์์ ์์์ด๋ค."
ํด๊ทผ๊ธธ์ ํธ์์ ์ ๋ค๋ ๋๋ฐ ์ง์ด๋ ๋ฐ์ค ์ํ๋ค์ ๋ณด๋ฉด์๋ '์, ์ ๊ฑด ํจ๋ฉ์ด ์ข ์ข๋ค?', '์ ๋ง์ง์ด๋ฉด ์ธ์ ์ํ์ด๋ ๋๋ฌด ๋ถ์ด์๋ ๊ฑฐ ์๋?' ๊ฐ์ ์๊ฐ์ ํ๋ ๋๋ฅผ ๋ฐ๊ฒฌํ๋ค. ์ด๊ฒ ๊ฐ๋ฐ์ ๋ณ์ธ๊ฐ?
์ง์ ๊ฐ์ ์นํจ ์์ผ ๋จน์ผ๋ฉด์ ์ค๋์ ๋ทํ๋ฆญ์ค ๋์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ ์ ํ ๋ฒ ๋ ๋ณต์ตํ๊ณ ์์ผ๊ฒ ๋ค. ๋ด์ผ์ ์ํธ ๋ํํ
์นญ์ฐฌ๋ฐ์์ผ์ง!