Box model : 여긴 내 구역이야 XX들아!

지난 포스팅 중 개발자 도구 뜯어먹기 : Elements 편에서 마지막에 Box-model에 대해서 짧게 언급하고 지나갔었다.

근데 이게 프론트엔드 면접 질문으로 나올 수도 있다기에 조금 더 정리해 보려고 작성해 본다.

 

먼저 읽고 오면 좋은 글

개발자 도구 뜯어먹기 : Elements

 


Box model

이미지 출처 : https://edu.gcfglobal.org/en/basic-css/the-css-box-model/1/

기본적으로 박스 모델에 대한 정의를 해보자면 모든 HTML 요소를 이루고 있는 구조다.

기본적인 구성은 margin, border, padding, content로 구성이 되어있다.

 

모든 HTML 요소를 이루고 있는 구조라고 하는 말은

HTML에서 사용한 각 태그마다 이 박스 모델을 가지고 있다는 것을 의미한다.

모든 태그가 이 박스 모델을 가지고 있다는 것은 결국 문서의 레이아웃을 구성하기 위함이라고 볼 수 있겠다.

 

박스 모델의 4개 요소를 조금 더 살펴보자.

 

Margin

Margin은 요소의 바깥 영역 여백을 담당하는 부분이다.

주로 요소와 요소와의 간격 설정을 위해 사용하곤 한다.

 

근데 이 margin을 사용하다 보면 마진 병합 현상(Margin Collapsing)이라는 것이 발생하곤 하는데

요 부분에 대해서는 차후에 다뤄보도록 하자.

 

Border

Border는 요소의 테두리를 담당하는 부분이다.

이 테두리를 기준으로 margin과 padding을 나누게 되고, 

만약 content가 요소의 너비보다 클 경우, overflow: hidden을 통해 넘치는 content를 숨기게 되는 경우

숨기게 되는 기준이 border가 된다.

 

Padding

Padding은 요소의 내부 영역 여백을 담당하는 부분이다.

조금 더 자세하게 말하면 border와 content 사이의 영역을 담당한다.

 

나 같은 경우에는 배경색이나 테두리 스타일을 지정 한 뒤에,

디자인 적으로 좋은 레이아웃을 표현할 때 종종 사용하는 것 같다.

 

Content

Content는 요소의 내부 요소를 뜻한다.

지금까지 margin, padding, border는 모두 CSS 스타일을 통해 직접적으로 적용할 수 있는데

이 Content는 어떤 요소가 들어오게 될지 알 수 없다.

 

그냥 텍스트가 들어올 수도 있고, 또 다른 영역이 들어올 수도 있기 때문에

어떤 요소의 내부 요소라고 표현하는 게 맞겠다.

 

728x90

 

여기까지 박스 모델에 대한 내용을 알아봤는데, 그냥 끝내기에는 좀 아쉽다.

왜냐하면 박스 모델과 함께 엮여서 등장하는 몇 가지 개념들이 있는데

기왕 말 나온 김에 그 내용들도 한번 정리해 보려고 한다.

 

Block vs Inline

이미지 출처 : https://www.samanthaming.com/pictorials/css-inline-vs-inlineblock-vs-block/

 

박스 모델이 HTML 문서의 레이아웃을 구성하기 위해 적용되는 개념이라고 했는데,

CSS에서 자주 사용하는 속성 중 display라는 속성이 있다.

이 속성은 해당 요소가 웹 페이지에서 어떻게 배치될 것인지를 정하는 속성인데

대표적으로 block과 inline이 있다.

 

block과 inline에 대해 간략하게 말하면 위의 사진처럼

block은 요소가 한 라인을 전부 차지하도록 하는 것이고,

inline은 요소 옆에 다음 요소가 위치할 수 있게 되는 것이다.

이 성질을 이용하면 레이아웃을 구성할 때 조금 더 쉽게 레이아웃을 구현할 수 있다.

 

근데 엄밀히 따지자면 이게 박스 모델과는 크게 상관없어 보이는데

block과 inline이 가지고 있는 특징과 박스 모델과 밀접하게 연관되어 있는 부분이 있다.

 

See the Pen Untitled by KIM_MS (@sstaar91) on CodePen.

 

위의 코드를 보면 display:block을 기본적으로 가지고 있는 div태그와

display:inline을 기본적으로 가지고 있는 span 태그에 각각 margin, padding, width, heigth를 적용하고 있다.

적용된 결과를 보면, block의 성질을 가지고 있는 div는 모든 속성이 적용되어 있는데,

inline의 경우는 일부분만 적용된 것을 볼 수 있다.

 

margin의 경우 좌, 우는 적용 됐지만, 상하는 적용이 되지 않았고,

width와 height는 전혀 적용이 되지 않고 있는 것을 볼 수 있다.

 

모든 요소가 박스 모델의 4가지 구성 요소로 이루어지긴 했지만

CSS의 속성에 따라서 적용이 되는 경우도 있고 아닌 경우도 있기에,

이러한 부분도 고려하면서 스타일을 적용해야 하겠다.

 

box sizing

CSS 속성 중에는 box-sizing이라는 속성이 있다.

해당 속성은 해당 속성을 적용한 요소의 박스 모델 기준을 잡아주는 속성이다.

 

위의 사진은 box-sizing에 대해 MDN에서 보여주고 있는 예시다.

여기서 box-sizing에는 border-box와 content-box가 있는데,

border-box는 기준을 border로 잡겠다는 의미가 되고,

content-box는 기준을 content로 잡겠다는 의미가 된다.

 

 

위의 예시 사진을 보면 두 개의 차이를 좀 더 명확하게 볼 수 있는데,

두 개의 사진 중 위의 사진을 보면 content-box로 기준을 잡고, width 값에 100px을 부여했고,

아래 사진은 border-box로 기준을 잡고, 마찬가지로 width 값에 100px을 부여했다.

 

정리해 보면, box-sizing이 content-box일 때는 content를 기준으로 잡기 때문에

width에 100px을 부여하면 content가 100px이 된다.

그 후 나머지 요소에 (padding, border) 추가적인 너비를 부여하게 된다.

 

반대로 border-box일 때는 border를 기준으로 잡아서 width에 100px을 부여하면

margin을 제외한 요소가 100px로 설정이 된다.

100px 안에서 padding, border의 영역이 계산이 되고, 나머지 부분이 content로 할당 되게 된다.

 

이렇다고 할 때, 레이아웃을 구성하는데 더 유리한 건 어떤 속성이 될까?

 

 

그렇다. border-box가 레이아웃을 구성하는데 더 유리하게 구성할 수 있다.

content 영역을 기준으로 잡게 되면 그에 맞게 모든 너비를 일일이 계산해야 할 경우가 있을 수 있는데

border를 기준으로 잡게 되면 전체 크기만 잡아주면 알아서 조절이 되기 때문에

레이아웃을 구성하는데 조금 더 유리한 속성이라고 볼 수 있겠다.

 


 

포스팅 작성에 참고한 감사한 글들

MDN : Box model

박예슬님 블로그 : Box model

Hyodduru님 블로그 : display 속성에 관하여

MDN : box-sizing

 

'Stack > CSS' 카테고리의 다른 글

CSS 적용 우선 순위 : 어려운 말로 CSS 명시도  (0) 2024.11.04