Cicindela

2008-12-31

100% 레이아웃의 사이트 제작

등록된 분류: webPublishing — 태그:, , , , , , , , , , — Cicindela @ 4:19 오후

자주 확인하는 CSS 포럼인 CDK(CSS Design Korea)에 어떤분이 페이지 레이아웃에 대해 질문을 올린게 있었다. 확인 해보니 나도 한참 골머리를 쌓았던 가로세로 100% 레이아웃 사이트 제작 이었다. 그전 회사에서 작업한 MCC(MirageWorks Control Center) 사이트작업도 가로세로 100% 인 사이트 였는데 CSS만으로 레이아웃을 해결못하고 자바스크립을 사용해 해결한기억이있어 다시한번 해결하려는데 역시 난감한부분이 있다. (사실 옛날처럼 테이블로 레이아웃을 만들면 어렵지않다.)

MCC(MirageWorks Control Center) 의 User 페이지의 모습과 소스

  • MirageWorks Control Center User Page
  • MirageWorks Control Center User Page Source

MCC 사이트 작업을 하기전, 세로100%레이아웃 작업에 골머리를 썩고있었는데 http://www.dave-woods.co.uk/?p=144이곳의 내용을 이용한 신현석님의 개인홈페이지에서 해결방법을 알아내고 그뒤로 그방법을 써서 세로100% 사이트제작을 해왔다.

CSS 만을 이용해서 100% Height Layout 제작방법

CSS

html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
}
.header {
    position: relative;
    height: 100px;
    background: #ddd;
    z-index: 1;
}
.container{
    min-height: 100%;
    margin: -100px 0 -50px;
}
*html .container{
    height: 100%;
}
.content-area {
    padding: 100px 0 50px;
}
.footer{
    height: 50px;
    background: #ddd;
}

Markup

<div class="header">
    Header
</div>
<div class=”container”>
  <div class=”content-area”>
    Contents
  </div>
</div>
<div class=”footer”>
  Footer
</div>
</body>

하지만 가로세로 100% 에 서브메뉴가있는 구조 는 정말 난감했다. 어떤경우냐면, 가로세로 100% 레이아웃에 서브메뉴의 높이값이 필요한 디자인(마진&패딩 값이 존재하고, 100%의 높이 또는 최대최소 높이를 정해서 스크롤 생성등등) 에서는 CSS 만으로 해결하기가 힘들었다. 결국 자바스크립트의 offsetheight를 이용해 Header 와 Footer 를 제외한 가운데 Container 부분의 높이를 구해서 해결을했다. 하지만 자바스크립 미숙인지 어떻게든 해결은 했지만, 내가만든 스크립트가 브라우저마다 적용이 조금씩 달라서 힘들었기도 하고, 약간 부족한게 있어서 찜찜하기도 했다.

서브메뉴가 스크롤바가 생기고 100%  Height 레이아웃

그래서 이번에는 다른방법을 써봤다. 마크업시 아에 테이블을 빼고 코딩이아니라 레이아웃을 위해 Header,Container,Footer 를 테이블로 레이아웃을 나누어봤다.

CSS

table{width:100%;height:100%;min-height:768px;border-collapse:collapse;}
td{margin:0;padding:0;vertical-align:top;}
.branding{height:100px;background:#226699;}
.container{height:100%;background:#fff;}
.site_info{height:50px;background:#009900;}

Markup

<table>
  <tr><td class="header">
    Header
  </td></tr>
  <tr><td class=”Container”>
    SubMenu/Contents
  </td></tr>
  <tr><td class=”Footer”>
    Footer
  </td></tr>
</table>

이렇게 사용해보니 Header 와 Footer 를 제외한 Container 의 높이값을 100%로 가질수있었다!! 하지만 기쁨도 잠시 테스트를 Firefox 에서 했는데, Firefox/Chrome/Safari/Opera 에서는 내가 원하는대로 나왔으나 DTD설정이 있는경우에 IE6, IE7 은 가운데 Container 의 100%높이값을 브라우저 그대로 높이값으로 계산해버리는 현상이 나타났다. 결국 원하는대로 해결이 되지않았다. 또 다시 IE를 저주하며 자바스크립 을 사용하지 않고 해결하는방법은 찾지 못했다. 추후 해결방법을 알게되면 다시 글을 써야겠다.
IE 와 다른브라우져의 TD height 100% 비교

관련링크


문제를 간단하게 해결하는방법을 알아냈다!!

IE 에서만 사용할수 있는데 (어짜피 IE에서만 생기는 문제니까..) height:expression(document.body.clientHeight-60); 이렇게 사용하면 된단다. 뒤에 60은 전체 높이에서 제외할 px 을 적으면 된다. document.body.clientHeight 를 이용해서 자바스크립만들고 뻘짓을 했는데.. CSS 만으로 간단하게 고칠수 있었구나. CDK 를 보다가 알아낸 방법인데.. 역시 배워야할꺼는 많고 세상에 고수들도 많구나~

CSS

html,body { height:100%; margin:0; padding:0; }
.layout { width:100%; height:100%; min-height:768px; border-collapse:collapse; }
.layout td { position:relative; margin:0; padding:0; vertical-align:top; }
.branding { height:100px; background:#226699; }
.container { height:100%; height:expression(document.body.clientHeight-150); background:#fff; }
.site_info { height:50px; background:#009900; }
.navigation-wrapper { float:left; position:relative; width:250px; height:100%; overflow:auto; background:yellow; }
.navigation { width:200px; height:618px; background:#ddd; }
.contents { float:left; min-width:750px; height:100%; background:#dd5588; }

Markup

<table class="layout">
<tr class="branding"><td>
로고 및 메뉴 영역
</td></tr>
<tr class="container" style=""><td>
<div class="navigation-wrapper">
<div class="navigation">
네비
</div>
</div>
<div class="contents">
컨텐츠
</div>
</td></tr>
<tr class="site_info"><td>
푸터 영역
</td></tr>
</table>

참조 - DOCTYPE 적용 후 IE에서의 다단 100% Height Table Layout 풀림 문제 - CSS Design Korea
새로운 글 »

이 블로그는 워드프레스로 운영합니다.