레이아웃 시리즈 #1
Wednesday, July 20, 2005 
레이아웃 시리즈를 시작하겠습니다. 레이아웃은 일단 xhtml 과 css 의 기본을 이해하고 적용하는데에 가장 접하기 쉬우면서 까다로운 부분이라 다루고 싶었습니다. 이제 점점 표준에 관한 의식도 점점 높아가면서 더 그 중요성을 느끼고 있습니다.
가장 기본적인 레이아웃으로 시작해서 많이사용되는 예들로 채워보겠습니다.
xhtml 은 1.0 transitional, 그리고 css 2.0 중심 입니다.
아시다시피 가장 많이 쓰이는 형태가

이런 형태입니다.
물론 내용을 다 생각하여 짜 맞추고 어떻게 하면 문서화에 최적화 될까 생각하면서, 상상하면서 (시멘틱) 구조화 해야 하지만 일단 레이아웃 부분만 보는 것이니 곧바로 레이아웃으로 들어갑니다.
글로 설명하자면, 헤더와 중간부분, 푸터로 이루어져 있고 중간부분 안에 사이드바 그리고 콘텐트가 들어가는 형태입니다. 블로그에서도 많이 쓰이고 보통 전형적인 홈페이지 형태입니다.
먼저 xhtml 부분을 제작해 보겠습니다. 문서 부분이죠. div가 제 생각에 6개가 틀을 잡기 위해서 필요합니다. 5개도 괜찮겠지만요.
모든걸 감싸기 -> <div id=”wrap”></div>
헤더 -> <div id=”header”></div>
중간 -> <div id=”middle”></div>
푸터 -> <dif id=”footer”></div>
중간안에 사이드바 -> <div id=”sidebar”></div>
중간안에 콘텐트 -> <div id=”content”></div>
이래서 직접 xhtml 부분을 보면 이렇습니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title> 레이아웃 기본1 </title> <meta name="Author" content="ILMOL" /> <meta name="Keywords" content="css xhtml" /> <meta name="Description" content="Layout posting #1" /> <link type="text/css" media="screen" rel="stylesheet" href="style.css" /> </head> <body> <div id="wrap"> <div id="header"></div> <div id="middle"> <div id="sidebar"></div> <div id="content"></div> </div> <div id="footer"></div> </div> </body> </html>
자 이걸 실행 시켜 보세요. 아직은 썰렁합니다. css 로 이제 짜 보아야죠.
800px 해상도에서도 보여질수 있도록 배려하는 마음으로 너비는 800 을 잡고 해보겠습니다. 해더는 높이가 200px, 푸터는 높이가 50px, 사이드바는 한 200px로 너비를 잡겠습니다.
style.css에 이렇게 넣습니다.
/*기본 정의 */ body { font-family: Gulim, 굴림, Arial, sans-serif; font-size: .8em; text-align: center; /*IE 5.5 */ margin:0; padding: 0; background: #fff; } /* =layout - 레이아웃 부분 */ #wrap { text-align: left; width: 800px; margin: 0 auto; /*중간정렬*/ padding: 0; } #header { height: 200px; width: 100%; /*불필요*/ margin: 0; padding: 0; } #middle { margin: 0; padding: 0; float:left; background: gray; /*임의로 삽입 */ } #sidebar { width: 200px; margin: 0; padding: 0; float:left; height: 300px; /*임의로 삽입 */ background: blue; /*임의로 삽입 */ } #content { width: 600px; margin: 0; padding: 0; float:right; height: 200px; /*임의로 삽입 */ background: black; /*임의로 삽입 */ } #footer { clear:both; height: 50px; padding: 0; margin: 0; }
자 끝났습니다..
약간 살펴보자면 맨 처음 body 부분에 text-align: center 를 주었습니다. #wrap 에 정해진, margin: 0 auto; 로도 가운데 정렬이 되지만, IE 5.5에서는 먹히지 않으니 text-align:center를 body 에 주시면 정렬이 됩니다. 물론 #wrap 에서 다시 text-align:left 주시는거 잊지 마시구요.
주르륵 보시면 대충 값이 어떤값들을 준것인지 다 아실겁니다. 하지만 바로 이 레이아웃의 세심하게 봐야할 부분이 바로 middle 과 sidebar, content부분입니다. 보시다시피 sidebar 와 content 에 float 값을 주었습니다. 정렬값이죠. 둘다 float:left 값을 주어도 되지만, float:left; 를 주면, IE에서는 3px 정도의 margin 이 반대편인 오른쪽에 생기게됩니다. 그래서 margin-right: -3px; 을 IE만 볼수 있게 해주어야 합니다.
#sidebar { width: 200px; float:left; margin: 0 -3px 0 0; padding: 0; }
이렇게 말이죠. (이부분에 관해서 더 자세한건 이 포스팅을 참조) 그러다 보니 손작업이 많이 갑니다. 그런 이유로 저는 그냥 곧바로 #content를 float: right; 을 주었습니다. 한쪽은 왼쪽으로, 다른쪽은 오른쪽으로, 문제가 생기지 않죠 ^^
자 헌데, #middle을 보세요. sidebar와 content를 담고 있는 #middle에도 저는 float:left;를 주었습니다 이유는 이렇습니다. #middle은 물론 sidebar와 content를 담고 있다고 하더래도 표준에 의거하면 둘의 사이즈가 #middle보다 늘어날 경우, 그리고 그들이 float값이 정해졌을 시에 삐져 나가도록 되어 있습니다.(이상하죠? 하지만 삐져 나오는것이 그들이 원하는 부분입니다) 그래서 아무 배경이 없을때엔 모르시겠지만 이제 배경을 넣고 하다보면 이상하게 #middle 에적용한 배경이 보이지 않을때가 생기게 되는거죠. 바로 이 부분을 막기위해서 #middle에 float:left;를 줍니다. 그럴시에 #middle이 아무리 #sidebar나 #content가 늘어나더래도 middle은 그 둘을 감싸줍니다. 물론,,,, ㅡㅡ;; IE는 그것에 상관없이 #middle이 늘어나서 감싸주지만요.
특별히,, #middle에 배경을 지정하지 않거나 태두리 말고는 별 쓸모가 없다면, 빼셔도 무관합니다. 어차피 둘은 float 값 때문에 wrap안에서 아주 잘 놀고 있을테니까요.
보통 의미상이나 다른 디자인상 유용한 잇점들이 많기 때문에 사용되고 있습니다.
Margin Padding 값 주기
여기까지는 대충 간단합니다. 자 여기서 margin 값이나 padding 값을 줘보겠습니다. 특히 content 부분은 그럴 경우가 생기겠죠? 이럴시에 아주 불가피한 핵을 써야 합니다. 물론 xhtml 부분으로 다시 거슬러 올라가서 content 안에 또다른 div를 넣어 그부분을 margin을 주면 모르지만, 그러기엔 약간의 소스의 지저분함이 나타나겠네요.
content 에 padding 10px을 주겠습니다. 제가 저번 포스팅에서 말씀드렸듯이 IE와 다른 브라우저들이 인식하는 너비가 padding이나 border값이 들어갔을경우 틀립니다. IE는 padding, border값을 합쳐서 width 값이 나오지만 타 브라우저들은 width 값, padding값 따로 따로이거든요.
600px 너비에 padding이 10px. padding이 좌우로 적용되니 총 20px 입니다. 그럼 IE에서는 그대로 너비가 600px이라고 해야하고, 타 브라우저들은 580px 로 해주어야 합니다.
이렇게 해주세요
#content { padding: 10px; width: 600px; /* 모든브라우저 인식 */ voice-family: ""}""; /* 여기서 부터 핵 */ voice-family: inherit; width: 580px; } html>body #content { width: 580px; }
복잡한가요? ㅎㅎ 네,,, 압니다만 그냥 어디에 적어두세요.
#이름 {
width: IE에서 인식하는값;
voice-family: “”}”";
voice-family:inherit;
width: 올바른 값;
}
html>body #이름 {
width: 올바른 값;
}
이렇게 입니다. 모든 문제를 거의 막아줍니다.
이제 다 됬습니다. 이렇게 한 레이아웃은 끝났네요 ^^; 원하는 곳에 메뉴를 넣고, 배경도 넣고 꾸미면 정말 멋진 페이지가 될것입니다.














daybreaker
July 20th, 2005 at 2:32 pm 인용
음.. width 문제는 XHTML 표준 모드로 그릴 때는 IE에서도 동일하게 인식하는 것 같습니다. padding을 제외한 부분이 width/height가 되던데.. background는 padding을 포함하여 그려지지만, width/height는 padding 영역을 제외하는군요. 하지만 컨테이너(상위 태그)는 padding, border까지 합친 것으로 width/height를 인식하는 것 같구요. (IE나 FF나 비슷한 듯)
[Reply]
일모리
July 20th, 2005 at 2:47 pm 인용
WIDTH 문제가 IE 5.x 버전 때문에 그렇습니다. 말씀하셨듯이 xhtml 표준 모드로 그려질때에는 IE 6 에서는 오케이합니다. 그 가운데에 윈도우 용과는 틀리게 맥용 IE5.x는 잘 인식합니다. 다시 맥용 ie5.x 에 올바른 값을 주면서 ie 6 에게도 올바른 값을 줍니다. 동시에 다른 브라우저들에 바른 값을 정해 줍니다 ㅡㅜ
[Reply]
Hooney
July 20th, 2005 at 3:46 pm 인용
표준(standard) 모드는 IE6에서 가장 먼저 사용하게 됐다고 하더라구요. 즉 IE5.x 이하에서는 표준모드가 존재하지 않으며, 쿽(자기내 브라우저에서 해석하는) 모드만 존재한다고 합니다.
IE 뿐만 아니라, 모질라나 오페라, 심지어 파이어폭스에서도 퀵모드가 있다고 하네요.
이런 퀵모드를 피하는 방법은 역시 문서형식(doctype)을 제대로 작성하는 것이겠죠.
[Reply]
ways
July 20th, 2005 at 4:10 pm 인용
안녕하세요, 유익한 글 재미있게 보고있습니다. 위 내용에서 간단하게 질문이 있어서 글 남깁니다.:grin:
우선, css를 적용하는데 있어 tag를 와 같이 쓰는 건 처음 보는 것 같은데, 잘 안되는 것 같습니다. 아직 브라우저들에서 반영이 안된 것인지….
그리고 header에서 width를 지정해주는 부분에 /*불필요*/라고 달려있는데 이런 width는 어떤 때 꼭 지정해줘야하고, 어떤 때는 저렇게 생략해도 되는지 혹시 알고계시면 한수 알려주시면 감사하겠습니다 =) footer에서는 width=100%를 빼놓으면 배경색을 지정해놓을 경우 내용이 있는 부분까지만 나오더라구요. (즉 100%를 꼭 적어줘야 저 레이아웃이 나오더라구요.. :???:)
그럼 좋은 강좌 계속 부탁드립니다
[Reply]
ways
July 20th, 2005 at 4:11 pm 인용
코멘트에는 < > 가 잘리는군요
두번째 단락에서 <link> tag에 관한 이야기입니다.
[Reply]
daybreaker
July 20th, 2005 at 7:40 pm 인용
음… IE 6 이상에서만 되는 것이군요. orz
IE 5.x 이하는 업그레이드하라고 써버리고 싶군요.
[Reply]
A2
July 20th, 2005 at 8:59 pm 인용
첫번째 강좌 수고하셨습니다.
1.5번째 강좌도 올리시면 좋겠습니다.
위의 html코드는 그대로 둔채 CSS만 바꿔서 모습이 변경되는 강좌는 어떨가요?
저는 조용히 강좌를 응원하며 강좌에 있으면 좋겠다 싶은 일거리를 만들어 드리겠습니다. ㅡㅡ;
[Reply]
Zephyr
July 20th, 2005 at 10:47 pm 인용
강좌 잘 봤습니다.
쌩뚱맞지만 질문 하나 해도 되나요?;
최근에 div 툴을 쓰면서 가진 의문점이 있는데요,
div 속성에 position: absolute; 를 이용해주면
div 툴이 제멋대로 겹치게 배열할수 있더군요.
이 제멋대로 겹쳐진 div 툴의 순서.
그러니까 제일 앞에 오는 툴과 제일 뒤에 오는 툴을 설정해 줄수는 없을까.. 해서요.
끙.. 조언 부탁드립니다.
[Reply]
일모리
July 20th, 2005 at 11:51 pm 인용
후니// ie 6 에서 퀄크 모드에 들어가면 ie 5.5 처럼 작동한다고 하네요. ie 6과 standard, 참 어울리지 않는데 말입니다.
ways// 100% 는 쓰지 않는 경우가 대부분입니다. margin 값으로 오히려 결정이 난다고 보시면 됩니다. 특별히 width 를 정해주는 경우에는 무엇인가를 담고있는 상위태그의 경우가 아니고는 그 안에 들어가는 block 엘레멘트 들은 안하셔도 되겠네요.
헉,, footer 에 clear:both 를 주지 않았군요. 아마도 그 부분일겁니다.
daybreaker// 넴… ㅡㅜ
A2// 그런 강좌들이 꽤나 많이 소개 된듯한데,, 한번 해봐야겠습니다 ^^; 조언 땡큐 해드립니다.
Zephyr// 네, 그렇죠. position: absolute 은 그것을 담고 있는 container가 position:relative 일때 잘 작용합니다. 유념 하시구요. 음,, 앞뒤 오는 순서는 z-index: 4; 이 렇게 써보시면 됩니다. 숫자가 높을수록 앞으로 오게 됩니다.
[Reply]
준호
July 21st, 2005 at 5:03 am 인용
수고하셨습니다. 이쪽에 발을 들여놓으시는 분들께 많은 도움이 될꺼같네요.
한가지 물어볼 것이 있는데… 제가 며칠간 머리를 싸매다싶이 고민하는 사항입니다.
도저히 답이 안보이더군요…
위 예제로 얘기해보자면, content의 세로길이가 늘어남(내용이 늘어남)에 따라 sidebar의 길이도 같이 늘어나게 하는 방법은 없을까요?
content의 내용이 길었다 짧았다 하는 것때문에 그 길이에 맞게 sidebar 꼭대기에 달려잇는 메뉴등과는 별도로 sidebar 맨 아래에 위치한 타 사이트의 배너 등을 정렬해줘야하는데 골치아프군요.
혹시나 방법이 있다면 지도 부탁드립니다..
그리고 참고사항이지만 content의 세로길이를 고정해주었을 때 content의 내용이 세로로 죽 늘어지면 firefox에서 볼때 밑에 있는 footer마저 뚫고 나옵니다. IE는 그냥 늘어나구요. 핵을 써서 해결가능한 문제인듯하네요.
[Reply]
apple440
July 21st, 2005 at 6:05 am 인용
와!
수고하셨네용 ^^*
[Reply]
ssbang
July 21st, 2005 at 8:29 am 인용
레이아웃 시리즈 #1
레이아웃 시리즈를 시작하겠습니다. 레이아웃은 일단
A2
July 21st, 2005 at 9:05 am 인용
준호// min-height 라는 것이 있습니다.
이것을 사용하면 최소 높이가 정해져서 내용이 늘어나서 최소 높이를 넘어버리면 자동으로 늘어납니다.
하지만 IE는 이것을 지원하지 못합니다. ㅡㅡ;
IE에서 자동으로 늘어나는 것은 표준에 어긋난 행위인데 이것을 사용하는 수 밖에 없습니다.
#main{min-height: 400px;} /*표준*/
*html #main{height: 400px;} /*IE전용*/
때문에 이렇게 스타일을 넣으시면 됩니다.
불여우는 표준대로 동작하고 IE는 높이를 고정시켜도 늘어나주는 센스(?)를 이용하는 거죠.
max-height도 있습니다. 최대 높이죠.
당연히 min-width, max-width도 있구요.
IE는 모두 지원 못합니다. ㅡㅡ;
웹발전 저해의 근본원인 IE!
[Reply]
일모리
July 21st, 2005 at 9:14 am 인용
직접 sidebar 가 늘어나진 않지만 그들을 담고 있는 middle 이 늘어나느것을 이용해서 베너 부분을 넣을수 있습니다.
#banner 라는 div 를 #middle 안에 넣으신 후에,
#middle 에 position: relative; 를 주고, #banner 를 이렇게 해줍니다.
#banner {position:absolute; bottom: 10px; left: 0; width: 200px; height: 50px;}
이렇게 absolute 포지션을 주면 #middle 안에서 마음대로 어느곳에나 위치할수 있습니다. 늘어나면서 당연히 맨 밑에서 10px 되는곳에 위치하겠죠.
혹시나 이게 도움이 되셨기를 바랍니다.
그리고 content 의 문제는 핵을 쓰지 않아도 됩니다. min-height: 300px; 로 정해주어 적어도 300px 의 높이가 되게 한 후에 나머지는 계속 길어지게 설정을 해주면 되겠죠. 아예 height 값을 없에던지요. css 에서는 특별한 디자인상의 요구가 아니면 height 의 길이는 특히나 본문 부분에는 정하지 않는것이 좋습니다. ^^
apple440// 아 감사합니다. apple440 님 블로그가 점점 멋져가더군요 ㅎㅎ
[Reply]
김동구
August 5th, 2005 at 1:43 am 인용
감사합니다.
웹표준에 대한 새로운 인식의 기회도 가질 수 있었구요.
많은 도움 받고 있습니다.
지금 운영 중인 몇 개 사이트를 열심히 적용 중이랍니다.
작업 속도가 굼벵이나, 이곳 참고하며 차근히 해나가고 있답니다.
[Reply]
일모리
August 5th, 2005 at 2:46 am 인용
네 계기가 됬다니 힘이나는군요. 김동구님께 좋은 결과 있으셨으면 합니다. ^^ 혹질문 있으시면 서슴치 말구 해주세요. 굼벵이라해도 천리길도 한걸음 부터라고 하지 않나요 화이팅입니다
[Reply]
퍼니러브
August 23rd, 2005 at 3:37 am 인용
잘 보고 있습니다
맨날 랑만 놀았는데 요새는 주로 와 놀고 있어요.
css노가다를 하다보니 한가지 궁금한 것이 생겼는데.. 왜 에서는 valign만 먹이면 그 안에 어떤것이 오든 그냥 정렬이 되잖아요? 안에 텍스트가 2줄이 되었든 3줄이 되었든..
근데 div에서는 line-height을 주고; 내용이 2줄이 넘어가면 line-height만큼 떨어지게 되는데.. 극복할 만한 방법이 없을까해서요.. 1줄이될수도 있고 2줄이 될 수도 있는데 자동으로 middle로 맞춰지게 할 수 있는 방법이 없을까요?
[Reply]
퍼니러브
August 23rd, 2005 at 6:08 am 인용
음.. 태그가 지워져있네요;;
[table][th][tr]이랑 놀다가 이제는 [div]와 주로 놀고있어요.. 입니다 ㅎㅎ
[Reply]
쉼터
August 25th, 2006 at 8:23 am 인용
웹페이지 훔쳐보기……
많은 웹페이지들은 소스공개를 막고자… onContextMenu=”return false” onDragStart=”return false” onSelectStart=”return false” 와 같은 스크립트를 이용한다… 또, 웹페이지의 디렉토리를 포함한 파일명이나 …
(주) 순일땅의 조용한 아지트
June 23rd, 2007 at 1:10 am 인용
사이드바 배경문제 해걸……
1단 레이아웃 구상도…css 스타일을 이것저것 만지면서 사진 블로그용 1단 레이아웃을 구상하고 있었다. 구상중인 레이아웃은, 윗쪽엔 블로그 제목만 있는 헤더, 중간엔 포스트와 다른 페이지…
overflow
April 2nd, 2008 at 8:33 pm 인용
저런 간단한 구조보다 더 복잡한 구조로 작업을 하다보면 머리에서 열불이 나더라구요;
박스모델은 브라우저마다 기본적인 간격이 불규칙하게 존재해서 미세한 간격을 조절하기가 쉽지 않았습니다.
이쪽에 조금 margin 이나 padding 을 주면 다른쪽에서 밀려 내려가거나 하는..
요즘은 어느정도 이골이 나서 대처접에 대해 적응이 되긴 했지만;;
좀더 공부해야겠죠~
[Reply]
일모리
April 3rd, 2008 at 12:36 pm 인용
ㅎㅎ overflow님의 댓글들이 주르르 달려있군요
댓글에서 열정이 느껴집니다. 힘내시기 바랍니다. 화이팅입니다.
[Reply]