CSS

Ch 04. CSS Box Model

Sila 2022. 4. 12. 20:55

CSS box model이란 인터넷 웹 사이트가 어떻게 렌더링 될 것인지를 결정하는 규칙의 집합이라고 볼 수 있다.

 

여기서부터 좀 본격적인 페이지의 layout을 배운다.

 

CSS는 HTML 문서의 각 element들을 각각 다른 성질을 가진 box로 취급해 페이지 어디에 나타날 것인지를 결정한다.

 

Ch 03까지는 단순히 하나 뒤에 하나, 하나 뒤에 하나를 쭉 늘어놓는 방식이었지만 이젠 그러지 말고

 

정말 우리가 접속하는 웹 페이지처럼 그럴싸한 모양이 나도록 웹 페이지를 구성해보자.

 

 

이제 padding, border block, line 등 CSS Box model의 기본적인 개념부터 공부해보자.

 

4-1 Set up

다음과 같이 html 문서를 작성해보자.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="box-styles.css">
</head>

<body>

    <h1> Headings (h1, h2... h6) 는 block이다. </h1>

    <p> p element도 block이다. <em>하지만</em> &lt;em&gt; 과 &lt;strong
        elements 는 아니다. 이 둘은 <strong>inline</strong> element이다.
    </p>

    <p>Block element가 html의 흐름을 주도한다. 반면, inline은 그다지 전체적인 흐름에 영향을 주지 않는다.</p>

</body>
</html>

 

이를 브라우저에서 불러오면 다음과 같이 나타난다.

 

이렇게 잘 나왔으면 동일한 위치에 box-style.css를 하나 더 만든다. 일단 지금은 내용을 추가하지 않는다.

 

 

4-2 Block elements vs inline elements

각 HTML element는 브라우저에 box로 렌더링된다.

 

이 box들을 크게 둘로 나눌 수 있는데, 각각 'inline', 'block'이라고 부른다.

 

위에서 본 것처럼 <h1>, <p>는 block, <em>, <strong>은 inline elements이다.

 

차이점을 좀 더 두드러지게 보기위해 다음과 같이 CSS를 추가해보자.

 

h1, p {
    background: lightgray
}

em, strong {
    background: lightblue
}

 

브라우저에서 다시 보면

 

배경색으로 해당 element가 차지하는 구획을 명확히 알 수 있는데, 이를 통해 알 수 있는 사실은 다음과 같다. 

 

- Block은 항상 그 전의 block element 아래에 나타난다. 이것이 특별한 조작이 없을 경우 'static' 한 HTML의 흐름이다.

 

- block의 넓이는 항상 parent container의 넓이를 전부 차지한다. (여기서는 윈도우 전체를 차지함)

 

- block의 넓이는 그 block의 content에 의해 결정된다. 위 사진에서 브라우저 크기를 줄여 텍스트가 밑으로 떨어지면

  background도 아래로 내려가는 것을 확인할 수 있다.

 

- inline들은 새로 방향으로는 영향을 미치지 않는다. inline들은 그 내부의 요소들을 꾸며주는 역할이지, 레이 아웃을 담    당하는 녀석들이 아니다.

 

inline의 넓이는 자신이 담고있는 contents들에 의해 결정된다. 부모 요소는 이 때 영향을 미치지 않는다.

 

이거 되게 중요함.

 

4-3 Changing Box behavior

스타일링을 통해 html element의 default box/inline값을 바꾸는 것도 가능하다. 

 

h1을 inline으로, strong을 block으로 바꾸는 것도 가능하다.

 

다음과 같이 css에 추가해보자.

 

em, strong {
    background: lightblue;
    display:block;
}

 

다시 브라우저에서 불러오면

 

이렇게 h1, p처럼 width가 parent의 넓이 전체를 차지하는 것을 볼 수 있다.

 

4-4 Contents, padding, border & margin

이제 box의 4가지 속성에 대해 알아보자.

 

i) Content : 텍스트, 이미지 등 element의 내용물

 

ii) Paddng : box의 content와 border 사이의 공간

 

iii) Border padding, margin사이의 line 

 

iv) Margin: box와 다른 box간의 공간

 

이 4가지가 브라우저가 element box를 정확하게 렌더링하는데 필요한 전부다.

 

 

4-4 Padding

Content는 내가 채우기 나름인거고, padding부터 바깥쪽으로 나가면서 하나씩 알아보자.

 

다음과 같이 h1에 padding을 추가해보자.

 

h1 {
    padding: 50px;
}

이러면 상하좌우 각 방향으로 50px 만큼 padding이 생겼다는 것을 확인할 수 있다.

 

이 padding은 각 방향으로 다르게 크기를 설정할 수 있다. 다음과 같이 수정해보자.

 

h1 {
    padding-top : 20px;
    padding-bottom: 20px;
    padding-left: 10px;
    padding-right: 10px;
}

이러면 상하, 좌우 각각에 다른 크기 만큼의 padding을 줄 수 있다.

 

한 줄로 정리해서 쓰는 것도 가능하다. 

 

h1 {
    padding: 20px 10px 20px 10px;
}

 

각각 순서대로 12시, 3시, 6시 9시 방향의 padding을 설정해준다고 보면 된다.

 

단위로는 px 뿐만 아니라 em 등의 다른 단위도 설정 가능하다.

 

4-5 Border

말 그래도 경계선이라고 보면 된다. 3개의 값을 정해줘야 하는데, 순서대로 선 굵기, 선 형태, 선의 색을 의미한다.

 

h1의 스타일링을 다음과 같이 추가하고 보면 경계선이 나타나느 것을 볼 수 있다.

 

h1 {
    padding: 20px 10px 20px 10px;
    border: 3px solid #5d6063;
}

 

경계선은 스타일링 뿐만 아니라 웹 페이지를 디자인 할 때,

 

element가 어디서부터 어디까지 렌더링되는지를 잘 볼 수 있게끔 표시를 해줘 디자인 하는 사람 입장에서 도움이 된다.

 

 

4-6 Margin

마진은 해당 box를 얼마나 다른 요소들과 떨어뜨려 놓을건지를 border 밖에 설정한다.

 

p element에 다음과 같이 설정해보자.

 

p {
    margin: 0 0 50px 0;
}

아래 쪽에 50px의 margin을 주겠다는 말이다. 다시 브라우저에서 불러오면

 

이렇게 p element 중심 아래쪽으로 50px만큼 빈 공간이 추가된 것을 볼 수 있다.

 

4-7 inline element의 margin

inlineblock content의 중요한 차이점중 하나는 각각의 margin을 어떻게 다룰 것인지에 있다.

 

inline은 element의 위, 아래 margin은 그냥 다 무시한다.

 

em, strong의 display: block 을 지우고 strong에 margin을 50px 준 후 어떻게 되는지 확인해보자.

 

양 옆으로는 margin이 생겨 간격이 벌어졌지만 위 아래로는 아무런 변화가 없음을 알 수 있다.

 

그럼 이를 padding으로 바꿔보자.

 

padding의 경우, 새로축의 값이 먹히지만 여전히 다른 element의 새로축 배치에 영향을 주지는 않는다.

 

주지한 바와 같이, 웹 페이지의 새로축 디자인을 조정하기 위해선 반드시 block type element의 도움이 필요하다.

 

4-8 generic boxes

웹 페이지의 구획을 나누기 편하기 위해 우리가 자주 사용하는 element중 <div>, <span>이 있다.

 

둘 간의 차이점은 div는 block, span은 inline이라는 정도뿐이다.

 

이 자체로 특별한 무언가가 있는 것이 아니라 웹 페이지의 레이아웃을 좀 더 자유롭게 하는데 도움을 주는 것이다.

 

내용물을 채우지 않고 자리만 적당히 차지하게 만들어 충돌하는 element들을 분리하는데 사용할 수도 있고,

 

몇 개의 element들을 하나로 묶어주는 역할을 하기도 한다.

 

조금 더 구체적으로 알아보기 위해 우선 다음과 같이 html, CSS를 추가해보자.

 

<!-- html -->

<div>Button</div>
/*  CSS stylesheet  */

div {
   color: #FFF;
   background:#5995DA;
   font-weight: bold;
   padding:20px;
   text-align:center;
   border: 2px solid #5D6063;
   border-radius: 5px;
}

 

 

 

4-9 Dimension 설정

지금까지는 html element가 알아서 자기 구획을 정하게끔 해왔다.

 

padding, margin 등에서 무슨 일이 벌어지건 어쨋든 그 경계 안에서 놀게 해왔다.

 

그런데 가끔은 element의 구획 자체를 변경해야 할 필요가 있다.

 

아직 채울 내용물이 없지만 나중에 생길 내용물을 채울 공간을 미리 만들고 일단 비워둔 채로 있게 하고 싶다던가..

 

이런 때를 위해 스타일링 중 width, height 등의 특성을 제공한다.

 

다음을 CSS에 추가해보자.

 

div {
/*  전략  */
   width: 200px;  /* 추가 */
}

 

이렇게 div의 넓이를 200px로 지정 후, 다시 불러오면 넓이가 가로 200px로 줄어들었음을 알 수 있다.

 

원래 div는 block이므로 늘 parent element의 넓이만큼의 넓이 (여기선 window 전체)를 가졌지만,

 

넓이를 절대값을 설정해줌으로써 그 크기를 변경해준 것이다.

 

div 안의 텍스트를 늘려도 div의 크기가 200px 보다 커지지는 않는다.

 

200px 이상의 텍스트는 다음 줄로 떨어져 새로로 div가 확장되게 된다.

 

4-10 Content box & border box

width, height는 box의 content 부분의 크기만을 결정한다. 

 

즉, padding~margin까지는 따로 계산해서 가산한다는 말이다.

 

방금 div에 200px을 준 것은 순수하게 content 부분의 크기가 200px이라는 것을 의미하고,

 

여기에 padding을 주고 border, margin을 주면 그만큼 더 크기가 커진다.

 

만약 600px의 parent element에 딱 맞게 200px짜리 element 3개를 넣었다고 하자.

 

여기서 border를 1px 주면 총 width는 202px이 되서 예상과 매우 다른 결과물이 나올 수도 있다.

 

이런 대참사를 막기 위해 CSS에서 box-sizing이라는 property가 있다.

 

이를 추가하면 border, padding등을 전부 감안해 width를 자동으로 조절해준다.

 

앞의 예시에서 1px border를 줘도 그걸 포함해 총합이 200px이 되도록 해준다는 의미이다.

 

다음과 같이 css에 추가해보자.

 

div {
/*  전략  */
   box-sizing:border-box;
}

 

이를 사용하면 padding, border 등을 사용할때 일일히 그 크기를 계산할 필요가 없으므로 매우 유용하다.

 

4-11 Box 정렬

이번엔 좌우 방향으로 박스들을 정렬하는 방법들에 대해 몇가지 알아보자.

 

text-align같은 성질은 inline element에 적용할 수 있지만 block들을 정렬하는데는 다른 방법들이 필요하다.

 

우선 body를 정렬시켜보자.

 

body {
   text-align: center;
}

 

이렇게 추가한 후 결과를 보면 block내부의 content들은 가운데 정렬이 되었지만 block자체는 여전히 왼쪽에 붙어 있다.

 

이는 Button이 있는 div을 통해 알 수 있다.

 

이런 block element들을 정렬하는데는 크게 3가지 방법이 있다.

 

그중 flex, float는 다음 장에서 다루도록 하고, 우선 지금 할 수 있는 한 가지 방법만 알아보자.

 

4.11.1 Auto margin

좌우의 margin을 auto로 값을 주면 parent element를 기준으로 중앙에 정렬할 수 있게 된다.

 

div에 css를 다음과 같이 추가해보자.

 

div {
   margin: 20px auto;
}

 

이렇게 margin값을 추가하고 다시 불러오면 버튼이 중앙에 온 것을 확인할 수 있다.

 

이는 가로 방향의 width가 지정된 block element에만 적용된다. 

 

(원래 block은 그 줄 전체를 차지하므로 넓이가 지정되지 않았다면 당연히 중앙 정렬이 의미가 없다.)

 

 

4-12 스타일링 reset

지금까지 한 작업물을 브라우저에서 불러와 자세히 보면 양 옆으로 조금씩 여백이 있다는 걸 볼 수 있을 것이다.

 

이는 브라우저에 의해 투가된 디폴트 margin, padding이다.

 

이런 디폴트 margin, padding은 브라우저마다 다르기 때문에

 

내버려두면 스타일링의 범용성을 활용하기 어려워지는 문제가 있다.

 

css 파일 최상단에 다음을 추가해보자.

 

/*  css stylesheet  */

* {
   margin:0;
   padding:0;
   box-sizing:border-box;
}

 

다시 불러와보면 양 옆의 여백이 사라져 있음을 알 수 있다.

 

보통 처음 스타일링을 시작하기 전에 이렇게 디폴트 margin, padding값을 0으로 만들어주고 작업을 진행하곤 한다.

 

'CSS' 카테고리의 다른 글

Ch 05. CSS 선택자  (0) 2022.04.14
Ch 03. CSS (Cascading Style Sheets)  (0) 2022.01.25
Ch 02. Links & Images  (0) 2022.01.24
Ch 01. Introduction  (0) 2022.01.16