[CSS] 5. 박스 모델



5. 박스 모델

박스 모델이란

  • 네모 박스를 어떻게 구성하느냐
  • 네모가 겹겹히 쌓여서 있는 구조
  • content > padding > border > margin
  • content : html 내용이 담기는 요소 (width, height)
  • padding : content가 테두리를 가질 수 있는데 그 테두리와 내용 사이의 공백
  • border : content의 테두리 (기본값 0)
  • margin : 가장 바깥쪽 여백
  • 실선 영역 : content 박스, border 박스 (content + border)


크기 - width, height

  • width : 요소의 너비 설정
  • 기본값 : auto
  • 상속되지 않는다.
  • auto : 블록/인라인시 자기가 차지할 수 있는 부분의 전체
  • inline 요소에는 width,height를 지정할 수 없다!


크기 - max-width, min-width, max-height, min-height


.container {
    width: 50vw;
    min-width: 300px;
    height: 50px;
}
  • width, height와 사용방법 거의 동일
  • 뷰포트에 따라 달라질때, 어느 시점부터는 동일했으면 좋겠다 싶을 때 사용
  • 부모에 따라서 작아지다가(커지다가) 어느 순간부터 부모영향 안받고 최소(최대) 크기 유지
  • 함수표기법은 익스 안되지만 이건 익스된다!


여백 - margin

<div class="parent">
안녕!
    <div class="child">
    안녕!
    </div>
</div>

.parent {
    width: 300px;
    height: 200px;
}
.child {
    width: 50px;
    height: 50px;
}
  • 박스 모델의 가장 바깥 부분
  • shorthand : top > right > bottom > left
  • 기본값 == 0
  • margin: 10px (네 영역 모두 적용 / rem 사용 가능)
  • margin: 10px 20px (위아래: 10 좌우: 20)
  • margin: 10px 20px 30px (위:10 좌우: 20 아래: 30)
  • % 사용시 부모의 width의 %로 들어간다 (주의하기)


여백 - margin collapsing (마진 상쇄)

<div class="box"><div>
<div class="box"><div>
<div class="box"><div>

.box {
    width: 50px;
    height: 50px;
    margin-top: 10px;
    margin-bottom: 20px;
    // top, bottom 이 만나 더 큰 bottom 20 적용
}
  • margin이 여러개가 겹쳤을 때 사라지는 것
  • 여러 블록요소들의 위/아래 margin이 경우에 따라 가장 큰 크기를 가진 margin으로 결합(상쇄)되는 현상
  • 블록요소에서만 발생
  • 위/아래에서 발생 (좌우 x)


인접 형제일 때 (위아래로)

<div class="box"><div>
<div class="box"><div>
<div class="box"><div>

.box {
    width: 50px;
    height: 50px;
    margin-top: 10px;
    margin-bottom: 20px;
    // top, bottom 이 만나 더 큰 bottom 20 적용
}


부모-자식요소 간

<div class="parent">
    <div class="child">
    </div>
<div>

.parent {
    width: 50px;
    height: 50px;
    margin-top: 10px;
    // border: 1px 주면 마진 상쇄 없어진다.
}

.child {
    width: 20px;
    height: 20px;
    margin-top: 40px;
}
  • 부모의 border,padding이 없을 때 부모의 margin과 자식의 margin이 만난다.
  • 부모의 margin-top이 40으로 적용된다.


빈 블록

  • 내부 컨텐츠가 아무것도 없거나 내부 컨텐츠의 height == 0 일때,
    자신의 margin-top/bottom이 만나서 발생한다.


여백 - padding

<div class="parent">
안녕!
    <div class="child">
    안녕!
     <div class="grand-child">
     </div>
    </div>
</div>

.parent {
    width: 300px;
    height: 300px;
}
.child {
    width: 60px; 
    height: 60px;
    padding: 10%; // 부모 요소(parent)의 가로가 100 > 30
}
.grand-child {
    width: 30px; 
    height: 30px;
}

  • margin과 사용법이 동일하다.
  • shorthand 가능
  • margin은 음수 사용 가능 (padding은 불가)
  • % 조심하기 : 부모 요소의 가로길이가 100이다.
  • 세로의 마진을 주고자할때도 기준은 가로이니 조심하기


테두리 - border-style, border-width, border-color

<div class="contatiner">
    안녕!
</div>

.container {
    width: 300px;
    height: 300px;

    border-style: dotted solid;
    // border-style: none; 이면 아래 속성 반영 안된다.

    border-width: 10px;
    border-color: red blue;
}
  • border-style: solid dashed (maring/padding과 같은 조건으로 적용)
  • border-width: 두께 thin, medium, thick, <length> (thin…얘네는 브라우저마다 다르다)
  • border-color


테두리 - border (shorthand)

.box {
    width: 300px;
    height: 300px;
    border: solid 1px red;
}
  • 세가지 요소 모두 optional
  • style은 기본이 none 이므로 solid 사용하기
  • border와 outline은 개념이 다르다(탭하여 버튼 이동시 외곽선)
  • 순서 상관 없다.


테두리 - border-radius

.box {
    width: 300px;
    height: 300px;
    border: solid 1px red;
    border-radius: 30px;
    // border-radius: 150px 주면 원이 된다.
    // border-radius: 50% 주면 원이 된다.
}
  • 요소 테두리 경계의 꼭지점을 동그랗게 만드는 것
  • px 사용시 모서리에 반지름이 30px 만큼의 원이 생긴다.
  • <lenght>
  • <percentage> : 기준이 가로는 부모의 가로, 세로는 부모의 세로
  • border-radius: 10px 20px 30px 40; (margin과 가능)
  • border-style: none이어도 사용 가능


box-sizing

<div class="box">
    <span>반갑습니다.</span>
    <h3>안녕하세요</h3>
</div>

* {
    box-sizing: border-box;
    // 이 상태를 많이 한다.
}

.box {
    width: 300px;
    height: 300px;
    border: 30px solid blue;
    padding: 20px;
    // 전체 크기 : 300 + 30 + 30 + 20 + 20 = 400

    box-sizing: content-box; // 컨텐츠 박스 기준
    box-sizing: border-box; // border 박스 기준 (padding + border)
    // width 값이 보이는 값과 같으니 더 좋다.
}
  • 박스의 가로와 세로를 지정할 수 있는 방법
  • content-box : 기본값 (content 기준)
  • border-box : 총 가로 길이가 width, 총 세로 길이가 height 이 된다. (margin 제외)


나의 회고 🤫

박스 모델의 마진 상쇄가 항상 내 발목을 잡았었는데 오늘 확실히 알 수 있어서 좋았다.
box-sizing의 개념도 새로웠다. 그동안은 box-sizing을 활용하지 못했었는데,
앞으로 이걸 moverster에 적용하면 더 이쁘게 css 를 꾸밀 수 있을 것 같다.