DevLog

[CSS] ๋ฐ•์Šค๋ชจ๋ธ(box model) ๋ณธ๋ฌธ

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ๊ฐœ๋ฐœ

[CSS] ๋ฐ•์Šค๋ชจ๋ธ(box model)

Seungjae Lee 2021. 5. 27. 09:39

๋ฐ•์Šค ๋ชจ๋ธ(box model)

๋ชจ๋“  HTML ์š”์†Œ๋Š” ๋ฐ•์Šค(box) ๋ชจ์–‘์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์ด๊ฒƒ์„ ๋ฐ•์Šค ๋ชจ๋ธ(box model)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋ฐ•์Šค ๋ชจ๋ธ์€ HTML ์š”์†Œ๋ฅผ ํŒจ๋”ฉ(padding), ํ…Œ๋‘๋ฆฌ(border), ๋งˆ์ง„(margin), ๊ทธ๋ฆฌ๊ณ  ๋‚ด์šฉ(content)์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

1. ๋‚ด์šฉ(content) : ํ…์ŠคํŠธ๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐ•์Šค์˜ ์‹ค์งˆ์ ์ธ ๋‚ด์šฉ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

2. ํŒจ๋”ฉ(padding) : ๋‚ด์šฉ๊ณผ ํ…Œ๋‘๋ฆฌ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ํŒจ๋”ฉ์€ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

3. ํ…Œ๋‘๋ฆฌ(border) : ๋‚ด์šฉ์™€ ํŒจ๋”ฉ ์ฃผ๋ณ€์„ ๊ฐ์‹ธ๋Š” ํ…Œ๋‘๋ฆฌ์ž…๋‹ˆ๋‹ค.

4. ๋งˆ์ง„(margin) : ํ…Œ๋‘๋ฆฌ์™€ ์ด์›ƒํ•˜๋Š” ์š”์†Œ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง„์€ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋ฐ•์Šค๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ปจํ…์ธ  ์ฒ˜๋ฆฌ

๋ฐ•์Šค์˜ height ์†์„ฑ์— ์ฝ˜ํ…์ธ ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ง€์ •ํ•˜์„ธ์š”. ์ปจํ…์ธ ๊ฐ€ ๋ฐ•์Šค ๋ฐ”๊นฅ์œผ๋กœ ๋น ์ ธ๋‚˜์˜ค๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋ฐ•์Šค์— ๋งž๊ฒŒ ๊ฐ€๋ ค์ง€๋‚˜์š”?

p { height: 40px; }

[์ฝ”๋“œ] pํƒœ๊ทธ์˜ height ์†์„ฑ์— ์ฝ˜ํ…์ธ ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋†’์ด๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

๋ฐ•์Šค ํฌ๊ธฐ๋ณด๋‹ค ์ฝ˜ํ…์ธ  ํฌ๊ธฐ๊ฐ€ ๋” ํฐ ๊ฒฝ์šฐ์—๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ•์Šค ๋ฐ”๊นฅ์œผ๋กœ ๋น ์ ธ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ•์Šค๋ฅผ ๋šซ๊ณ  ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ•์Šค ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ๋”์ด์ƒ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ˜น์€ ๋ฐ•์Šค ์•ˆ์— ์Šคํฌ๋กค์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฝ˜ํ…์ธ ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

[์ฝ”๋“œ] pํƒœ๊ทธ์— overflow ์†์„ฑ์„ ์ง€์ •ํ•ด ๋ฐ•์Šค๋ณด๋‹ค ํฐ ์ฝ˜ํ…์ธ ์—๋Š” ์Šคํฌ๋กค์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์‚ฌํ•ญ์€ codepen์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

overflow ์†์„ฑ์˜ auto ๊ฐ’์€, ์ฝ˜ํ…์ธ ๊ฐ€ ๋„˜์น˜๋Š” ๊ฒฝ์šฐ ์Šคํฌ๋กค์„ ์ƒ์„ฑํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ๋„˜์น˜๋Š” ์ฝ˜ํ…์ธ ์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ์—๋Š” overflow ์†์„ฑ์— hidden ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. overflow ์†์„ฑ์€ x์ถ•๊ณผ y์ถ•์„ ์ง€์ •ํ•ด ๊ฐ€๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํฌ๋กคํ•˜๊ฑฐ๋‚˜ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์Šคํฌ๋กค ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. overflow-x ์†์„ฑ๊ณผ overflow-y ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋‘ ๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ•์Šค ํฌ๊ธฐ ์ธก์ • ๊ธฐ์ค€

๋ฐ•์Šค ํฌ๊ธฐ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ธฐ์ค€์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉฐ ํ•จ๊ป˜ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

<div id="container">
  <div id="inner"> 
    ์•ˆ์ชฝ box
  </div> 
</div>

[์ฝ”๋“œ] html ์˜ˆ์‹œ

#container { 
  width: 300px; 
  padding: 10px; 
  background-color: yellow;
  border: 2px solid red; 
} 

#inner { 
  width: 100%; 
  height: 200px; 
  border: 2px solid green; 
  background-color: lightgreen; 
  padding: 30px; 
}

[์ฝ”๋“œ] CSS ์˜ˆ์‹œ

๋ณ€๊ฒฝ์‚ฌํ•ญ์€ codepen์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ฌธ์ œ์ธ์ง€ ์•Œ๊ฒ ๋‚˜์š”? id๊ฐ€ container์ธ ๋ฐ•์Šค์˜ width ์†์„ฑ์— 300px์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋กœ ํ™•์ธํ•œ ํ•ด๋‹น ์š”์†Œ์˜ width ๊ฐ’์€ 324px ์ž…๋‹ˆ๋‹ค. CSS์—์„œ ์ง€์ •ํ•œ ๋‘ ์š”์†Œ์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • #container์˜ ๋„ˆ๋น„๋Š” 300px์ด ์•„๋‹ˆ๋ผ, 324px์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    300px (์ฝ˜ํ…์ธ  ์˜์—ญ) + 10px (padding-left) + 10px (padding-right) + 2px (border-left) + 2px (border-right)
  • #inner์˜ 100%๋Š” 300px์ด ์•„๋‹ˆ๋ผ, 364px์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    300px (300px์˜ 100%) + 30px (padding-left) + 30px (padding-right) + 2px (border-left) + 2px (border-right)

์ฒ˜์Œ ๋ ˆ์ด์•„์›ƒ ๋””์ž์ธ์„ ํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ดํ•˜๋Š” ์‹ค์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ•์Šค์— ์ ์šฉํ•  ์—ฌ๋ฐฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋ฐ•์Šค์˜ ํฌ๊ธฐ๋ฅผ ๋””์ž์ธํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ฐ•์Šค์˜ ํฌ๊ธฐ๋ฅผ ๋””์ž์ธํ•  ๋•Œ ์ฝ˜ํ…์ธ  ์˜์—ญ๋งŒ ๊ณ ๋ คํ•˜๋ฉด, ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ฒ˜์Œ ์ƒ๊ฐํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋ฐฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ณ„์‚ฐ ๋ฐฉ์‹์€ ๋ ˆ์ด์•„์›ƒ ๋””์ž์ธ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋ ˆ์ด์•„์›ƒ ๋””์ž์ธ์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋ฐฑ๊ณผ ํ…Œ๋‘๋ฆฌ ๋‘๊ป˜๋ฅผ ํฌํ•จํ•œ ๋ฐ•์Šค ๊ณ„์‚ฐ ๋ฒ•์ž…๋‹ˆ๋‹ค. *์€ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋Š” ์…€๋ ‰ํ„ฐ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์†Œ๋ฅผ ์„ ํƒํ•ด box-sizing ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , border-box๋ผ๋Š” ๊ฐ’์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

* { 
  box-sizing: border-box; 
}

[์ฝ”๋“œ] ๋ชจ๋“  ์š”์†Œ์— 'box-sizing: border-box'๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ์‚ฌํ•ญ์€ codepen์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์š”์†Œ์— box-sizing: border-box๋ฅผ ์ ์šฉํ•˜๋ฉด, ๋ชจ๋“  ๋ฐ•์Šค์—์„œ ์—ฌ๋ฐฑ๊ณผ ํ…Œ๋‘๋ฆฌ๋ฅผ ํฌํ•จํ•œ ํฌ๊ธฐ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ box-sizing์€ HTML ๋ฌธ์„œ ์ „์ฒด์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. box-sizing์„ ์ผ๋ถ€ ์š”์†Œ์—๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํ˜ผ๋ž€์„ ๊ฐ€์ค‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ ˆ์ด์•„์›ƒ๊ณผ ๊ด€๋ จ๋œ ์ด์•ผ๊ธฐ๋ฅผ ํ•  ๋•Œ์—๋Š” border-box ๊ณ„์‚ฐ๋ฒ•์„ ๊ธฐ์ค€์œผ๋กœ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ•์Šค ํฌ๊ธฐ ์ธก์ • ๊ธฐ์ค€ ๋‘๊ฐ€์ง€๋ฅผ ํ•ญ์ƒ ์—ผ๋‘ํ•ด์ฃผ์„ธ์š”.

* content-box๋Š” ๋ฐ•์Šค์˜ ํฌ๊ธฐ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ์ด์•„์›ƒ ๋””์ž์ธ์—์„œ ์—ฌ๋ฐฑ๊ณผ ํ…Œ๋‘๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐ•์Šค ํฌ๊ธฐ ๊ณ„์‚ฐ๋ฒ•์ธ border-box๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ถœ์ฒ˜:
 http://tcpschool.com/css/css_boxmodel_boxmodel

์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ ๊ธ€:
https://dasima.xyz/css-box-sizing-content-box-vs-border-box/

Comments