본문 바로가기
Web Front/HTML + CSS + 자바스크립트

[CSS] 레이아웃을 구성하는 CSS 박스 모델 (1)

by k-mozzi 2022. 7. 26.
반응형
Preface

 

이번 장에선 기본적인 박스 모델을 만들어보고, 지난 장에서 언급했던 마진과 패딩에 대해 다시 한 번 자세히 공부했다.

 

처음 마진과 패딩의 정의를 봤을 땐 솔직히 잘 이해가 되지 않았었는데,

 

직접 두 속성을 코드에 적용해보며 비교하자 두 개념의 차이점을 확실히 알 수 있었다.


 

1. CSS와 박스 모델

 

 

- 블록 레벨 요소: 태그를 사용해 요소를 삽입했을 때 혼자 한 줄을 차지하는 것

1) 해당 요소의 너비가 100%이다.

2) 왼쪽이나 오른쪽에 다른 요소가 올 수 없다.

 

 

- 인라인 레벨 요소: 콘텐츠만큼만 영역을 차지하는 것

1) 나머지 공간에 다른 요소가 올 수 있다.

 

 

- 박스 모델 요소: 박스 형태인 요소

 

 

- 박스 모델의 구성

1) 콘텐츠 영역

2) 패딩

3) 테두리

4) 마진 etc.

 

 

- 콘텐츠 영역의 크기

1) 너비: width 속성 사용

2) 높이: height 속성 사용

 

 

- width와 height의 속성 값

1) 크기: 너비나 높이의 값을 px나 em 단위로 지정한다.

2) 백분율: 박스 모델을 포함하는 부모 요소를 기준으로 너빗값이나 높잇값을 백분율로 지정한다.

3) auto: 박스 모델의 너빗값과 높잇값이 콘텐츠 양에 따라 자동으로 결정된다. (기본값)

 

 

- 실제 박스 모델이 차지하는 크기는 콘텐츠 영역 외에도 콘텐츠와 테두리 사이의 여백, 테두리 두께까지 계산해야 한다.

 

 

- box-sizing 속성: 박스 모델의 너비와 높이를 어떻게 결정할 것인지 선택한다.

1) border-box: 테두리까지 포함해서 너빗값을 지정한다.

→ 요소의 크기를 계산하기 쉽다.

2) content-box: 콘텐츠 영역만 너빗값을 지정한다. (기본값)

 

 

- box-shadow 속성: 그림자 효과를 준다.

1) 수평 거리: 그림자가 가로로 얼마나 떨어져 있는지를 나타내며, 양숫값은 요소의 오른쪽에, 음숫값은 요소의 왼쪽에 그림자를 만든다.

→ 필수 속성

2) 수직 거리: 그림자가 세로로 얼마나 떨어져 있는지를 나타내며, 양숫값은 요소의 아래쪽에, 음숫값은 요소의 윗쪽에 그림자를 만든다.

→ 필수 속성

3) 흐림 정도: 값이 커질수록 부드러운 그림자를 표시하며, 음숫값은 사용할 수 없다.

4) 번짐 정도: 양숫값을 사용하면 그림자가 퍼져서 박스보다 그림자가 크게 표시된다. (기본값: 0)

5) 색상: 한 개만 지정할 수도 있고, 공백으로 구분해서 여러 개의 색상을 지정할 수도 있다. (기본값: 현재 색상)

6) inset: 안쪽 그림자로 표시한다.

 


 

2. 테두리 스타일 지정하기

 

 

- 박스 모델은 테두리나 마진, 패딩 등을 지정할 때 한꺼번에 똑같이 지정하거나, 모두 다르게 지정할 수 있다.

1) top, right, bottom, left 순으로 지정한다.

2) 2개만 지정하면 전자는 위아래, 후자는 양 옆 값을 나타낸다.

 

 

- border-style 속성: 테두리 스타일을 지정한다.

1) none: 테두리가 없다. (기본값)

2) hidden: 테두리를 감춘다.

3) solid: 테두리를 실선으로 표시한다.

4) dotted: 테두리를 점선으로 표시한다.

5) dashed: 테두리를 짧은 직선으로 표시한다.

6) double: 테두리를 이중선으로 표시한다.

→ 두 선 사이의 간격: border-width

7) groove: 테두리를 창에 조각한 것처럼 표시한다.

8) ridge: 테두리를 창에서 튀어나온 것처럼 표시한다.

 

 

- border-width: 테두리 두께를 지정한다.

1) 1px이나 5px처럼 크기를 직접 입력한다.

2) 예약어 중 하나를 선택한다. (thin, medium, thick)

 

 

- border-color 속성: 박스 모델에서 테두리 색상을 지정한다.

 

 

- border 속성: 테두리 스타일을 묶어서 지정한다.

→ 테두리의 두께와 색상, 스타일의 속성값 순서는 상관 없다.

 

 

- border-radius 속성: 꼭짓점 부분에 원이 있다고 가정해서 둥글게 처리한다.

1) 크기: 반지름의 크기를 px, em의 단위와 함께 수치로 표시한다.

2) 백분율: 현재 요소의 크기를 기준으로 비율로 지정한다.

3) 이미지 요소의 너비와 높이를 똑같이 만든 후 반지름값을 너비나 높이의 50%로 지정하면 원이 된다.

4) top-right, bottom-right, bottom-left, top-left를 사용하여 꼭짓점마다 따로 처리할 수 있다.

 

 

- 꼭짓점을 타원 형태로 만들기

1) border-radius 속성에 반지름 대신 타원의 가로 반지름값과 세로 반지름값을 넣는다.

→ 가로 반지름과 세로 반지름 사이에 슬래시(/)를 넣어서 구분한다.

2) 특정한 꼭짓점만 타원 형태로 만들 땐 슬래시 없이 사용한다.

 


 

3. 여백을 조절하는 속성

 

 

- 마진: 두 박스 모델 사이의 여백 (요소 주변의 여백)

1) 단위, 백분율, auto 값을 사용하여 지정한다.

2) 배치할 요소의 너빗값을 정한 후 margin-left와 right의 속성값을 auto로 지정하면 웹 문서의 내용이 화면 중앙에 배치된다.

 

 

- 마진 중첩(상쇄): 요소를 세로로 배치할 경우에 각 요소의 마진과 마진이 서로 만나면 마진값이 큰 쪽으로 겹쳐지는 현상

→ 위아래 마진이 만날 때 합쳐지는 것이고, 양 옆 마진이 만날 경우엔 중첩되지 않는다.

 

 

- 패딩: 한 박스 모델에서 콘텐츠 영역과 테두리 사이의 여백

 

 

- 웹 브라우저에서 전체 내용을 화면 중앙에 배치하고, 마진을 사용하여 박스를 구분하는 코드

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>상품 소개 페이지</title>
  <link rel="stylesheet" href="css/product-result.css">
</head>
<body>
  <div id="container">
    <div id="description">
      <h1>레드향</h1>
      <p>껍질에 붉은 빛이 돌아 <b>레드향</b>이라 불린다.</p>
      <p>레드향은 <em>한라봉과 귤을 교배</em>한 것으로<br>일반 귤보다 2~3배 크고, 과육이 붉고 통통하다.</p>
      <p>비타민 C와 비타민 P가 풍부해<br> <strong>혈액순환, 감기예방</strong> 등에 좋은 것으로 알려져 있다.</p>
    </div>
    <div id="receipe">
      <h2>레드향 샐러드 레시피</h2>
      <p><b>재료 : </b>레드향 1개, 아보카도 1개, 토마토 1개, 샐러드 채소 30g</p>
      <p><b>드레싱 : </b>올리브유 1큰술, 레몬즙 2큰술, 꿀 1큰술, 소금 약간</p>
      <ol>
        <li>샐러드 채소를 씻고 물기를 제거한 후 준비합니다.</li>
        <li>레드향과 아보카도, 토마토를 먹기 좋은 크기를 썰어둡니다.</li>
        <li>드레싱 재료를 믹서에 갈아줍니다.</li>
        <li>볼에 샐러드 채소와 썰어 둔 레드향, 아보카도, 토마토를 넣고 드레싱을 뿌리면 끝!</li>
      </ol>
    </div>   
    <div id="package">
      <h2>상품 구성</h2>
      <table>
        <caption>선물용과 가정용 상품 구성</caption>
        <colgroup>
          <col style="background-color:#eee;">
          <col>
          <col span="2" style="width:150px">
        </colgroup>
        <thead>
          <tr>
            <th>용도</th>
            <th>중량</th>
            <th>갯수</t>
            <th>가격</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td rowspan="2">선물용</td>
            <td>3kg</td>
            <td>11~16과</td>
            <td>35,000원</td>
          </tr>
          <tr>
            <td>5kg</td>
            <td>18~26과</td>
            <td>52,000원</td>
          </tr>
          <tr>
            <td rowspan="2">가정용</td>
            <td>3kg</td>
            <td>11~16과</td>
            <td>30,000원</td>
          </tr>   
          <tr>
            <td>5kg</td>
            <td>18~26과</td>
            <td>47,000원</td>
          </tr>
        </tbody>        
      </table>      
    </div>
  </div>
</body>
</html>
table, th, td {
  border:1px solid #ccc;
  border-collapse: collapse;
}
th, td { 
  padding:10px 20px; 
}
#container {
  width:600px;    /* 컨테이너의 너비 */
  border:none;    /* 테두리 없앰 */
  margin:0 auto;   /* 화면 중앙에 배치 */
}
div {
  border:1px dotted #222;  /* 테두리 */
  padding:20px;  /* 패딩 */
  margin:20px;  /* 마진 */
}
#description {
  /* width: 400px; */
  border-top-left-radius:30px;   /* 왼쪽 위 모서리 라운딩 */
  border-top-right-radius:30px;  /* 오른쪽 위 모서리 라운딩 */
}
#package {
  /* width: 400px; */
  border-bottom-left-radius:30px;  /* 왼쪽 아래 모서리 라운딩 */
  border-bottom-right-radius:30px;  /* 오른쪽 아래 모서리 라운딩 */
}

 

728x90
반응형

댓글