Last Modified : 2011.12.05

주요 엘리먼트 배치

이번 과정에서는 CSS 를 사용하여 웹사이트의 화면을 완성해 나가는 방법을 설명한다.
CSS로 화면구성을 할 때 중요하게 쓰이는 CSS 속성은 float 과 margin 이다.
여기서 소개하는 방법에서 특별한 점이 있다면 margin 값에 음수를 쓴다는 데 있다.
이제부터 margin 에 음수값으로 두는 것을 음수 마진이라 하겠다.
음수마진은 화면구성를 위해 필요한 엘리먼트의 수를 최소화 할 수 있다.
표준을 따른다고 하더라도 브라우저마다 다르게 보일 수 있기 때문에 결과물을 파이어폭스, 구글 크롬, 인터넷 익스플로러 등 대표적인 웹브라우저에서 테스트를 하면서 진행하도록 한다.

고정크기를 가지는 3열(Column) 레이아웃

실습할 레이아웃은 고정넓이를 가진 3열로 된 것을 선택했다.
실습 화면은 header, man-menu, sidebar, content, extra, footer 로 구성된다.

  • header
    가장 위에 있으며 대부분 회사 로고 이미지가 위치한다.
  • main-menu
    header 바로 밑에서 메인 메뉴를 보이는 부분이다.
  • sidebar
    왼쪽에 배치할 것이고, 메인 메뉴에 대한 서브 메뉴가 위치하는 부분이다.
  • content
    중앙에 배치할 것하고, 페이지의 주요 내용을 위치하는 부분이다.
  • extra
    오른쪽에 배치할 것이고, 광고나 새로운 아이디어를 구현하는 부분이다.
  • footer
    가장 아래쪽에 있으며 Copyright, 연락처, 찾아오시는 길 등의 글로벌 메뉴를 보이는 부분이다.

주요 부분에 대한 크기를 지정한다.

header

넓이: 1000px
높이: 48px

main-menu

넓이: 1000px
높이: 35px

sidebar

넓이: 175px
높이: 내용에 따라 변함

Content

넓이: 720px
높이: 내용에 따라 변함

extra

넓이: 205px
높이: 내용에 따라 변함

footer

넓이: 1000px
높이: 56px

디폴트 HTML 문서 템플릿

XHTML 1.0 Strict 을 따르는 웹사이트를 만들어 볼 것이다.
이 문법에 맞게 작성하려면 새창을 띄우거나 프레임을 사용하는 HTML 코드를 써서는 안된다.
아래를 복사하여 사용하고 있는 에디터에 붙여넣는다.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Keywords" content="keywords" />
<meta name="Description" content="description" />
<link rel="stylesheet" href="css/screen.css" type="text/css" media="screen" />
<link rel="stylesheet" href="css/print.css" type="text/css" media="print" />
</head>
<body>

</body>
</html>

붙여넣기 해서 작성한 파일을 index.html 이름으로 웹사이트의 최상위 디렉토리에 저장한다.
만약 여러분의 에디터가 이클립스라면, 이클립스는 HTML문서를 작성할 때 DocType(Document Type) 별로 HTML 문서 템플릿을 제공한다.
디폴트 문서 템플릿이 마음에 들지 않는다면 수정할 수 있다.

이제 페이지의 주요 구성요소를 입력할 차례이다.
layout.html 파일의 body 엘리먼트 사이에 다음 내용을 붙여넣는다.


<div id="wrap">

	<div id="header"></div>
	
	<div id="main-menu"></div>
	
	<div id="container">
		<div id="content"></div>
	</div>
	
	<div id="sidebar"></div>
	
	<div id="extra"></div>
	
	
	<div id="footer"></div>
	
</div>

위에서 wrap 과 container 는 설명하지 않은 엘리먼트이다.
이 엘리먼트는 견고한 레이아웃을 위해서 필요한 여분의 엘리먼트라고 생각하면 된다.
wrap 은 문서의 모든 div 를 포함한다.
container 는 여기에서 설명하는 3열을 배치하는 데 필요하다.
되도록이면 이런 여분의 엘리먼트는 그 수를 최소화 해야 한다.

이 레이아웃의 좋은점에 대해서 생각해 보면, 비록 container 안에 있지만 HTML문서에서 content 가 sidebar 보다 먼저 나온다는 것이다.
웹페이지에서 content 가 가장 중요하기 때문에 코드에서 먼저 나오는 것이 유지보수에 더 낫다.

다음은 css 폴더에 screen.css 파일을 아래와 같은 내용으로 만든다.


@CHARSET "UTF-8";
/*** The Essential Code ***/
html, body {
	margin: 0;
	padding: 0;
}

#wrap {
	margin: 0 auto;
	padding: 0;
	width: 1000px;
}

#header {
	width: 1000px;
	height: 48px;
}

#main-menu {
	width: 1000px;
	height: 35px;	
}

#container {
	width: 100%;
}

#content {
	
}

#sidebar {
	width: 175px;
}

#extra {
	width: 205px; 
}

#footer {
	width: 1000px;
	height: 70px;
}

/*** Just for Looks ***/
#header, #footer {
	font-size: large;
	text-align: center;
	background: #999;
}

#main-menu {
	font-size: large;
	text-align: center;
	background: #DAEAAA;
}
#content {
	font-size: large;
	text-align: center;
	background: #DDD;
	height: 100px;
}

#sidebar {
	font-size: large;
	text-align: center;
	background: #66F;
	height: 100px;
}

#extra {
	font-size: large;
	text-align: center;
	background: #F66;
	height: 100px;
}

먼저 이 문서를 해석하기 위해 CSS 의 파일의 기본 형식부터 알아보자.
CSS 문서의 내용은 다음과 같은 형식의 반복이다.


selector {
	속성: 속성값;
	속성: 속성값;
	..
	.
}

selector 종류에는 Type, Descendant, Class, id, Child, attribute 가 있다.
다음은 각 셀렉터의 모습이다.


/* Type Selector */
body {

}
/* Descendant Selector */
ul strong {

}
/* Class Selector */
.redwine {

}
/* id Selector */
#header {

}
/* Child Selector */
body > p {

}
/* attribute Selector */
input[type="text"] {

}

id selector 를 CSS 파일에서 정의할 때는 id 앞에 # 을 붙여야 한다.
id 는 HTML문서에서 해당 엘리먼트에 유일성을 부여한다.
따라서 id 값은 단 한번 나와야 한다.
때문에 id 는 HTML문서에서 단 한번만 나타나야 하는 엘리먼트에 사용한다.
index.html 에서 wrap, header, main-menu, container, content, sidebar, extra, footer 가 바로 그런 엘리먼트이다.
반면, Class selector 를 CSS 파일에서 선언할 때는 클래스 이름앞에 . 을 붙여야 한다.
Class 는 id 와 달리 HTML문서에서 반복되어 사용할 수 있다.

지금까지 작성한 페이지를 웹브라우저로 확인한다.
예제보기 1

screen.css 설명

아직까지 완성 전 코드이지만 지금까지의 CSS 파일의 내용을 살펴보자.
screen.css 파일이 완성되면 화면 구성도 완성된다.
HTML 문서의 내용은 바뀌지 않는다.

html,body

html, body {
	margin: 0;
	padding: 0;
}

selector 자리에 , 는 "or" 를 의미한다.
그래서 위 CSS 코드는 html 과 body 엘리먼트 모두에 적용된다.
div 와는 달리 html 과 body 엘리먼트는 거의 모든 웹브라우저에서 디폴트 마진과 패딩을 가지고 있다.
만약 해상도가 낮은 모니터에서는 작지만 이 값 때문에 정밀하게 계산된 화면이 깨질 수 있다.
그래서 대부분의 웹디자이너는 html 과 body 의 마진과 패딩을 0 으로 설정한 후 디자인을 시작한다.

wrap

#wrap {
	margin: 0 auto;
	padding: 0;
	width: 1000px;
}

margin 에는 4개의 값이 있어야 한다.
만약 값이 하나만 있다면 top right bottom left 에 모두 그 값으로 설정된다.
값이 2개이면 첫번째 값이 top과 bottom 에 대한 값이고 두번째 값이 right 와 left 에 대한 값이다.
값이 3개라면 순서대로 top right bottom 에 대한 값이며 left는 right와 같게 설정된다.
값이 4개라면 순서대로 top right bottom left 에 대한 값이다.

margin 프로퍼티의 두번째 값 auto 는 해당 엘리먼트를 가운데에 위치시킨다.
속성값 0이면 단위를 적지 않아도 된다.
div 엘리먼트의 디폴트 margin 과 padding 값은 0 이다.
wrap 는 HTML문서내의 모든 엘리먼트를 담아야 하니 전체 넓이만큼 넓이를 지정한다.

CSS 파일에서 /*** Essential Code ***/ 부분이 중요하다.
/*** Just for Looks ***/ 부분은 예제를 브라우저로 확인할 때 보기 좋으라고 쓴 것으로, 프로젝트가 진행되면서 없어질 부분이다.

container

#container {
	width: 100%;
}

container 의 width가 100% 로 설정되어 있다.
100% 라 함은 container 의 내용이 확보할 수 있는 최대한의 넓이를 말한다.
container 가 마진과 패딩이 0 이고 border 역시 설정되어 있지 않기 때문에 100% 는 1000px 이다.

content 을 중앙에 배치

content 의 margin 을 다음과 같이 조정한다.


#content {
	margin-left: 175px;
	margin-right: 205px;
}

예제보기 2

sidebar 를 content 의 왼쪽에 배치

웹브라우저에서 content 가 중앙에 위치하는 것을 확인할 수 있다.
이젠 sidebar 와 extra 가 중앙의 content 양쪽에 위치시켜야 하는데, 이때 float 와 음수 마진을 이용한다.
먼저 sidebar 가 content 의 왼쪽에 위치하도록 코드를 수정하기로 하자.
CSS파일을 아래와 같이 고친다.


#container {
	float: left;
	width: 100%;
}

#content {
	margin-left: 175px;
	margin-right: 205px;
}

#sidebar {
	float: left;
	width: 175px;
}

#extra {
	float: left;
	width: 205px; 
}

#footer {
	clear: both;
	width: 1000px;
	height: 70px;
}

예제보기 3
아직 sidebar 가 content 의 왼쪽에 있지 않다.
다음 예제에서 완성하기로 하자.
우선 center 를 감싸고 있는 container 에 float 속성이 적용한다.
container 다음부터 나오는 엘리먼트인 sidebar, extra 도 역시 float 속성을 적용해야 한다.
footer 는 clear 프로퍼티를 both 로 설정해서 footer 의 위치를 가장 아래에 위치하도록 보장한다.

이제 sidebar 에 한줄을 더한다.


#sidebar {
	float: left;
	width: 175px;
	margin-left: -1000px;
}

예제보기 4

"예제보기 4"와 같은 결과가 나오는 이유
  1. container, sidebar, extra 모두 float 이 적용되었으므로 정상적인 흐름안의 박스처럼 위 아래에 있는 것이 아니라 옆으로 인접해 있다고 생각해야 한다.
  2. float 이 적용된 엘리먼트에 음수 마진이 left 으로 적용되면 엘리먼트는 left 방향으로 엘리먼트가 움직이게 된다.
extra 를 content 의 오른쪽에 배치

sidebar 가 제대로 위치를 잡았다.
다음은 extra 가 content 의 오른쪽으로 위치하도록 하겠다.
이때에도 음수 마진을 이용한다.


#extra {
	float: left;
	width: 205px;
	margin-left: -205px; 
}

예제보기 5

참고문서

http://www.html.net/tutorials/css/
http://www.subcide.com/articles/creating-a-css-layout-from-scratch/P1/
http://www.alistapart.com/articles/holygrail/
http://coding.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins/
http://www.w3.org/QA/2002/04/valid-dtd-list.html
http://www.ibm.com/developerworks/kr/library/wa-css/
http://www.maxdesign.com.au/articles/css-layouts/