CSS

박스 모델 속성

mukom 2022. 10. 20. 20:36

1. 박스 모델

 

박스 모델은 블록 레벨 요소인지 인라인 레벨 요소인지에 따라 나열 방법이 달라진다.

블록 레벨 : width 속성을 100% 가지고 있는 요소로 혼자 한 줄 전체를 차지한다.
인라인 레벨 : 콘텐츠 크기만큼만 영역을 차지해서 옆에 다른 요소가 올 수 있다.
블록 레벨 태그 <p>, <h1> ~ <h6>, <ul>, <ol>, <div>, <blockquote>, <form>,
<hr>, <table>, <fieldset>, <address>
인라인 레벨 태그 <img>, <object>, <br>, <sub>, <sup>, <span>, <input>,
<textarea>, <label>, <button>
 

 

2. width, height 속성 : 콘텐츠 영역의 크기

 

width : <크기> | <백분율> | auto
height : <크기> | <백분율> | auto

width 속성은 콘텐츠 영역의 너비를, height 속성은 콘텐츠 영역의 높이를 결정한다.

 크기 : 너비 혹은 높이 값을 px 이나 em 같은 단위로 지정한다.
           값은 고정적이라 화면의 크기 변화에 영향을 받지 않는다.
백분율 : 해당 박스 모델을 포함하는 부모 요소를 기준으로 너비 혹은 높이 값을 백분율로 지정한다.
              값이 가변적이기 때문에 부모 요소의 크기가 바뀌면 함께 바뀐다.
auto : 박스 모델의 너비 혹은 높이의 값이 콘텐츠 내의 양에 따라 자동으로 결정된다. 기본값
<style>
        .box1 {
            width: 400px;
            height: 100px;
            background: #ff6a00;
        }
        .box2 {
            width: 50%;
            height: 100px;
            background: #0094ff;
        }
        div {
            margin: 10px;
        }
</style>
<body>
    <div class="box1"></div>
    <div class="box2"></div>
</body>

예시의 박스 모델은 <div> 태그로 만들어졌으며, 이들의 부모 요소는 <body> 태그이다. 

즉 백분율의 경우, 웹 창의 크기에 영향을 받는다는 말이다.

 

빨간 박스의 경우 크기로 값을 지정하고 있기 때문에 브라우저의 크기가 줄어들어도 크기에 변함이 없지만,

파란 박스는 백분율로 값을 지정하였기 때문에 전체 브라우저의 크기에 따라 유동적으로 그 값이 변하는 것을 확인할 수 있다.

 

📌 실제 콘텐츠 크기 계산하기

모던 브라우저에서의 박스 모델 전체 너비는 다음과 같다.

실제 박스가 차지하는 너비 = width 값 + 좌우 패딩 두께 + 좌우 테두리 두께

예를 들어 다음과 같은 박스 모델이 있다고 해보자.

.box {
	width : 200px;
    padding : 10px;
    border : 5px solid black;
}

이 박스 모델의 실제 너비를 구해보면 

width 값으로 200, padding 값으로 10 * 2(좌우), border 값으로 5 * 2(좌우) 이 되어 총 230px 가 된다.

하지만 익스플로러 6 환경에서는 다음과 같은 계산법을 사용하고 있으니 환경에 유의해야 한다.

박스 모델의 콘텐츠 영역 너비 = width 너비 - 좌우 패딩 두께 - 좌우 테두리 두께

 

 

3. display 속성 : 화면 배치 방법 결정하기

 

display : none | contents | block | inline | inline-block | table | table-cell 등

display 속성을 사용하면 인라인 레벨의 요소를 블록 레벨 요소처럼 배치하거나 그 반대도 가능해진다.

 

1️⃣ block 속성 값 : 인라인 레벨 👉 블록 레벨

<style>
        .block img {
            display: block;
            margin: 10px;
        }
</style>
<body>
    <div class="inline">
        <img src="images/pic1.jpg">
        <img src="images/pic2.jpg">
        <img src="images/pic3.jpg">
    </div>
    <div class="block">
        <img src="images/pic1.jpg">
        <img src="images/pic2.jpg">
        <img src="images/pic3.jpg">
    </div>
</body>

인라인 레벨
블록 레벨

2️⃣ inline 속성 값 : 블록 레벨 👉 인라인 레벨

    <style>
        nav ul li {
            display: inline;
            margin: 10px;
        }
        li > a {
            border-top: 4px solid black;
            text-decoration: none;
            color: black;
            padding: 7px 10px;
        }
    </style>
<body>
    <nav>
        <ul>
            <li><a href="#">상단 메뉴1</a></li>
            <li><a href="#">상단 메뉴2</a></li>
            <li><a href="#">상단 메뉴3</a></li>
            <li><a href="#">상단 메뉴4</a></li>
        </ul>
    </nav>
</body>

블록 레벨
인라인 레벨

📌 불릿이 사라진 이유

<li> 태그는 블록 레벨 태그로 불릿과 함께 쓰인다는 특징이 있다.

하지만 inline 속성 값이 적용되면 자동으로 불릿이 사라지며 수평 배치가 적용된다.

 

3️⃣ inline-block 속성 값 : 요소는 인라인, 내용은 블록

 

inline 속성 값으로 지정하여 요소를 배치하면 한 줄로 수평 배치가 가능하지만, 

너비나 높이, 위 아래의 마진 등이 제대로 동작하지 않는다는 단점이 생긴다.

 

이러한 단점을 극복할 수 있는 속성 값이 바로 inline-block 속성 값이다.

이 속성은 인라인으로 배치되면서 블록 레벨의 특징을 가질 수 있게 된다.

    <style>
        nav ul li {
            display: inline-block;
            margin: 10px;
        }
        li > a {
            border-top: 4px solid black;
            text-decoration: none;
            color: black;
            padding: 7px 10px;
        }
    </style>
<body>
    <nav>
        <ul>
            <li><a href="#">상단 메뉴1</a></li>
            <li><a href="#">상단 메뉴2</a></li>
            <li><a href="#">상단 메뉴3</a></li>
            <li><a href="#">상단 메뉴4</a></li>
        </ul>
    </nav>
</body>

 

인라인 레벨
인라인ㅡ블록
인라인
인라인-블록

해당 문서에서는 캡쳐를 통한 예시를 보여주기 때문에 큰 차이를 못 느낄 수 있지만,

실제 코드를 적용해보면 달라진 점을 확인할 수 있게 된다.

 

4️⃣ none 속성 값 : 해당 요소를 배치하지 않는다.

 

    <style>
        .box {width: 100px; height: 100px; border: 1px solid;}
        .b1 {background: red;}
        .b2 {background: green;}
        .b3 {background: blue;}
        .dis .b2 {display: none;}
    </style>
<body>
    <h3>display </h3>
    <div class="dis">
        <div class="box b1">b1</div>
        <div class="box b2">b2</div>
        <div class="box b3">b3</div>
    </div>  
</body>

none 속성 값은 해당되는 속성을 화면 상에 아예 배치하지 않기 때문에

원래 존재하던 공간 자체도 차지하지 않아서 위와 같은 모습으로 나타난다.