html/css - CSS박스 모델

업데이트:

CSS박스 모델

블록 레벨 요소와 인라인 레벨 요소

HTML Block and Inline Elements - DataFlair

블록 레벨 요소

태그를 사용해 요소를 삽입했을 때 혼자 한 줄을 차지하는 요소이다. 너비나 마진, 패딩 등을 이용해 크기나 위치를 지정하려면 블록 레벨 요소여야 한다. <div>태그나 <p>태그가 대표적인 태그이다.

인라인 레벨 요소

줄을 차지하지 않는 요소이다. 즉 화면에 표시되는 콘텐츠만큼만 영역을 차지하고 나머지 공간에는 다른 요소가 올 수 있다. <img>태그나 <strong>태그 등이 인라인 레벨 요소를 만드는 태그이다.

박스 모델(box model) - 박스 형태의 콘텐츠

블록레벨 요소들은 모두 박스 형태이다. 스타일 시트에서는 이렇게 박스 형태인 요소를 박스 모델(box model)요소라고 부른다. 웹 문서 안에서 여러 요소들을 원하는 위치에 배치하려면 CSS박스 모델에 대해 잘 알고 있어야 한다. 그래야만 한 줄에 배치할지, 줄을 바꾸어 배치할지, 요소와 요소 사이의 간격을 어떻게 조절할 지 결정할 수 있기 때문이다.

image

그림에서 보는 것 처럼 패당과 테두리, 마진은 각각 상하좌우 네 방향으로 나뉘어져 있어 네 방향의 스타일을 따로 설정할 수 있다.

width, height속성 - 콘텐츠 영역의 크기

박스 모델에서 콘텐츠 영역의 크기를 지정할 때 콘텐츠 영역의 너비를 결정하는 width속성과 콘텐츠 영역의 높이를 결정하는 height속성을 사용한다.

속성 값 설명
<크기> 너비나 높이 값을 px이나 cm같은 단위와 함께 수치로 표현
<백분율> 박스 모델을 포함하는 부모 요소를 기준으로 너비나 높이 값을 백분율(%)로 지정
auto 박스 모델의 너비와 높이 값이 콘텐츠 양에 따라 자동으로 결정된다. (기본 값)

px로 값을 직접 지정한 박스는 고정이지만 %로 지정한 박스는 웹 문서 창의 크기에 따라 달라진다.

image

image

display 속성 - 화면 배치 방법 결정하기

display 속성을 사용하면 블록 레벨 요소를 인라인 레벨 요소로 바꾸거나 인라인 레벨 요소를 블록 레벨 요소로 바꿀 수 있다.

이 방법은 어떤 때 필요한가?

  • 세로로 표시되는 목록을 가로 네비게이션으로 바꿀 때, 한 줄로 표시되는 이미지에 여백과 테두리를 추가해 갤러리로 표시할 때 이 방법을 사용한다.

1. block 속성 값

display:block;으로 지정하면 해당 요소를 블록 레벨로 지정한다.

  1. 인라인으로 배치된 이미지image

  2. 블록으로 배치된 이미지

    image

	<head>
		<meta charset="utf-8">
		<title>display 속성</title>
		<style>
			div {
				margin:20px;
				border:1px solid #ccc;
				border-radius:5px;
			}
			#inline img {
				margin:10px;
			}
			#block img {
				display:block;
				margin:10px;
			}
		</style>
	</head>
	<body>
		<div id="inline">
			<img src="images/pic1.jpg">
			<img src="images/pic2.jpg">
			<img src="images/pic3.jpg">
		</div>
		<div id="block">
			<img src="images/pic1.jpg">
			<img src="images/pic2.jpg">
			<img src="images/pic3.jpg">
		</div>
	</body>

2. inline 속성 값

display 속성을 inline으로 지정하면 블록 레벨 요소를 인라인 레벨로 바꿀 수 있다.

서로 다른 줄에 배치되는 요소들을 한 줄로 함께 표시하기 위해 사용되는데 주로 목록에서 사용된다. <li>태그는 블록 레벨 요소이기 때문에 각 항목은 수직으로 배치되지만, display속성을 사용하여 항목을 한 줄로 배치할 수 있고 목록을 수평 내비게이션용으로 사용할 수 있다.

image

3. inline-block 속성 값

웹 요소를 인라인 레벨로 배치하면서 내용에는 블록 레벨 속성을 지정하고 싶다면 display속성 값 중 inline-block을 사용하면 된다. 이 속성은 블록 레벨 요소와 인라인 레벨 요소 두 가지 특성을 모두 가진다.

image

<head>
    <style>
			nav {
				width:100%;
				height:60px;
				background-color: #069;
			}
			nav ul {
				list-style-type: none;
			}
			nav ul li {
				display: inline-block;
				margin:20px;
			}
			nav ul li a {
					color: white;
					text-decoration: none;
			}
		</style>
	</head>
	<body>
		<nav>
			<ul>
				<li><a href="#">애완견 종류</a></li>
				<li><a href="#">입양하기</a></li>
				<li><a href="#">건강돌보기</a></li>
				<li><a href="#">더불어살기</a></li>
			</ul>
			<h2>애완견 종류</h2>
		</nav>
  • display:inline;으로 지정했을 경우 image

4. none속성 값

이 속성 값을 지정하면 해당 요소를 화면에 아예 표시하지 않는다. visibility:hidden;도 비슷한 역할을 하는데 visibility속성은 화면에서 감추기만 할 뿐 원래 요소가 있는 공간은 그대로 차지하지만 display:none;은 아예 공간조차 차지하지 않는다.

웹 사이트를 반응형 웹 디자인 기법으로 작성할 때 PC용 화면에서는 표시하지만 모바일 화면에서는 보이지 않도록 하고 싶은 부분이 있다면 그 부분을 display:none;으로 처리하면 된다.

반응형 웹 디자인 기법이란, 사용자가 접속하는 브라우저 화면 크기에 따라 PC용 웹 사이트를 보여 주거나 모바일용 웹 사이트를 보여 주도록 작성하는 방법을 말한다.

테두리 관련 속성들

border-style 속성 - 테두리 스타일 지정하기

테두리 스타일을 지정하는 border-style속성은 기본 값이 none이기 때문에 테두리 스타일을 지정하지 않으면 테두리 색상이나 두께를 지정하더라도 화면에 표시되지 않는다. 따라서 테두리를 그리기 위해서는 맨 먼저 테두리 스타일을 지정해야 한다.

CSS/Training/borders - Web Education Community Group

image

<style>
		div {
			width:200px;
			height:100px;
			display:inline-block;
			margin:15px;			
			border-width:5px;  /* 테두리 굵기 */
		}
		.box1 { border-style:solid; }  /* 실선 */
		.box2 { border-style:dotted; }  /* 점선 */
		.box3 { border-style:dashed; }  /* 선으로 된 점선 */
	</style>

border-width 속성 - 테두리 두께 지정하기

이 속성을 이용하면 테두리 두께를 지정할 수 있다.

border-top-width: <크기> | thin | medium | thick
border-right-width: <크기> | thin | medium | thick
border-left-width: <크기> | thin | medium | thick
border-bottom-width: <크기> | thin | medium | thick
border-width: <크기> | thin | medium | thick

border-color속성 - 테두리 색상 지정하기

image

<style>
		div {
			width:200px;
			height:100px;
			display:inline-block;
			margin:15px;			
			border-style:dashed;  /* 테두리 스타일 - 선으로 된 점선 */
			border-width:2px; /* 테두리 굵기 - 2px */
		}
		.box1 { border-color:red;	}  /* 색상 - 빨강 */
		.box2 { border-color:blue; }  /* 색상 - 파랑 */
	</style>

border 속성 - 테두리 스타일 묶어 지정하기

두께와 색상, 스타일 순서는 상관 없다.

border-top : <두께> <색상> <스타일>
border-bottom : <두께> <색상> <스타일>
border-right : <두께> <색상> <스타일>
border-left : <두께> <색상> <스타일>
border : <두께> <색상> <스타일>

image

		<style>
			nav {
				width:100%;
				height:60px;
				background-color: #069;
			}
			nav ul {
				list-style-type: none;
			}
			nav ul li {
				display: inline;
				margin:20px;
			}
			nav ul li a {
					color: white;
					text-decoration: none;
			}
		</style>

border-radius 속성 - 박스 모서리 둥글게 만들기

image

<style>
		div {
			width: 300px; /* 너비 */
			height: 200px; /* 높이 */
			margin : 20px; /* 영역간 마진 */
			display: inline-block; /* 가로로 배치 */
		}
		.round {
			border:2px solid red; /* 2px짜리 빨강 실선 */
			border-radius:20px;  /* 모서리 20px 만큼 라운딩 */
		}
		#bg {
			background:url(images/pic1.jpg) no-repeat; /* 배경 이미지 */			
			background-size:cover;  /* 영역을 다 채우게 */
		}
	</style>

위 예시는 네 모서리가 모두 둥글지만 특정 모서리만 둥글게 하고 싶다면 border-top-left-radius, border-top-right-radius와 같이 지정한다.

타원 형태로 둥글게 만들기

image

<style>
		div {
			width:200px;
			height:100px;
			display:inline-block;
			margin:15px;
			border:2px solid black;
			background:#ffd800;			
		}
		.round1 { border-top-left-radius:100px 50px; } /* 왼쪽 위 라운딩 */
		.round2 { border-bottom-right-radius:50% 30%; }
		.round3 { border-top-right-radius:50px;}
	</style>

box-shadow속성 - 선택한 요소에 그림자 효과 내기

image

<head>
	<meta charset="utf-8">
	<title>박스모델</title>
	<style>
		div {
			width:200px;
			height:100px;
			display:inline-block;
			margin:15px;
			border:2px solid;
			border-radius:20px;
		}
		.box1{ box-shadow:2px -2px 5px 0px black;}
		.box2{ box-shadow:5px 5px 15px 5px gray;}
	</style>
</head>
<body>
	<div class="box1"></div>
	<div class="box2"></div>
</body>

여백을 조절하는 속성들

margin속성 - 요소 주변 여백 설정하기

마진(margin)은 현재 요소 주변의 여백이다. 따라서 마진을 이용하면 한 요소와 다른 요소 사이의 간격을 조절할 수 있다.

속성 값 설명
<크기> 너비나 높이 값을 px(픽셀)이나 cm(센티미터)같은 단위와 함께 수치로 지정한다.
<백분율> 박스 모델을 포함하고 있는 부모 요소를 기준으로 너비나 높이 값을 %로 지정한다.
auto display속성에서 지정한 값에 맞게 적절한 값을 자동으로 지정한다.

image

.box1 { margin:30px 50px 30px 50px;}  /* 마진 - 30px 50px 30px 50px */

image

.box2 { margin:30px 50px;} /* 마진 - 30px 50px 30px 50px */

image

.box3 { margin:50px;}  /* 마진 - 50px 50px 50px 50px */

image

.box4 { margin:30px 5px 10px; }  /* 마진 - 30px 5px 10px 5px */

만약 margin-left와 margin-right를 auto로 지정하면 요소의 너비 값을 뺀 나머지 공간의 좌우 마진을 똑같이 맞춘다. 이 방법은 웹 요소를 중앙에 배치하려고 할 때 자주 사용한다.

image

image

<style>
		.box {
			width:200px;  /* 너비 */
			height:300px;  /* 높이 */
			background:#ff6a00;  /* 배경색 */			 
			margin:0 auto; /* 마진 - 0 auto 0 auto */
		}  
	</style>

마진 중첩(margin overlap)현상

박스 모델의 마진 속성을 사용할 때 주의할 점이 있다. 요소를 세로로 배치할 경우, 마진과 마진이 만날 때 마진 값이 큰 쪽으로 겹쳐지는 것이다. 이런 현상을 마진 중첩(margin overlap) 또는 마진 상쇄(margin collapse)라고 한다.

<div>태그를 사용해 영역을 만들고 그 영역의 네 방향 margin값을 30px로 지정한 후 사각형 3개를 세로배치했을때 중간 마진은 60px일 것이다. 결과대로 나오는지 한번 확인해보자.

	<style>
    * {
      box-sizing:border-box;
    }
		div {
			width:200px;  /* 너비 */
			height:100px;  /* 높이 */
  		margin:30px;  /* 마진 */
		}
    #box1 {
      background:rgb(0, 77, 243);
    }
    #box2 {
      background:rgb(255, 72, 0);
    }
    #box3 {
      background:rgb(18, 219, 0);
    }
	</style>

image

하지만 예상한 결과대로 출력되지 않고 마진이 30px로 균등하게 나오는 것을 볼 수 있다. 이렇게 된 이유는 여러 요소를 세로로 배치할 때 맨 위의 마진과 맨 아래 마진에 비해 중간에 있는 마진들이 너무 커지는 것을 방지하기 위한 것이다.

display:inline-block을 사용해서 div요소를 가로로 배치하면 각 요소의 마진이 그대로 유지되어 각 사각형 사이에는 총 60px의 마진이 생기게 된다.

	<style>
    * {
      box-sizing:border-box;
    }
		div {
			width:200px;  /* 너비 */
			height:100px;  /* 높이 */
  		margin:30px;  /* 마진 */
      display:inline-block;  /* 가로로 배치 */
		}
    #box1 {
      background:rgb(0, 77, 243);
    }
    #box2 {
      background:rgb(255, 72, 0);
    }
    #box3 {
      background:rgb(18, 219, 0);
    }
	</style>

image

padding 속성 - 콘텐츠 영역과 테두리 사이 여백 설정하기

패딩(padding)이란 콘텐츠 영역과 테두리 사이의 여백을 말한다. 다시 말해 테두리 안쪽의 여백이라고 생각하면 편하다.

image

	<style>
		div {
			width:200px;  /* 너비 */
			height:auto;  /* 높이 */
			background:#0094ff;  /* 배경색 */
			display:inline-block;  /* 가로로 배치 */
			margin:15px;  /* 마진 - 15px 15px 15px 15px */
			color:white;  /* 글자색 */
		}
		.box1 { padding:10px 30px 10px 30px;}  /* 패딩 - 10px 30px 10px */
		.box2 { padding:10px 30px;} /* 패딩 - 10px 30px 10px 30px */
		.box3 { padding:10px;}  /* 패딩 - 10px 10px 10px 10px */
	</style>
</head>
<body>
	<div class="box1">패딩(padding)이란 콘텐츠 영역과 테두리 사이의 여백을 말합니다. </div>
	<div class="box2">패딩(padding)이란 콘텐츠 영역과 테두리 사이의 여백을 말합니다. </div>
	<div class="box3">패딩(padding)이란 콘텐츠 영역과 테두리 사이의 여백을 말합니다. </div>
</body>

태그: ,

카테고리: ,

업데이트:

댓글남기기