xhtml & css - 구조와 연출(2)

자, 지난 번 글에서 html과 CSS가 어떻게 만나고 작동하는지 잠깐 봤습니다.

그럼 오늘부터 본격적으로 '구조'에 관해서 들여다 보죠.

지난번에 써먹었던 test.html과 test.css를 불러와 봅니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
   <link rel="stylesheet" media="screen" type="text/css" href="./test.css" />
   <title>테스트용 html</title>
  
</head>

<body>


</body>
</html>

body    {background-color:green;}

자 그럼 <body>와 </body>사이에 다음 엘리먼트를 집어 넣어 한 구획을 만들어보도록 하죠.

<div id="container">
</div>

<div></div>는 division이죠. 아님 말고요. ㅋㅋ 일단 여기서 중요한 속성인 id는 현재의 division에 '고유명칭'을 부여하는 겁니다. '고유'한 명칭이니까, 한 페이지 당 오직 '하나'만 쓰일 수 있겠죠? 이 외에 한 페이지 내부에서 '동일한 방식'으로 여러 번 등장하는 division은 id 속성외에 class 속성으로 명칭을 부여하면 됩니다.

그러면, 왜 이런 '명칭'을 부여하느냐?

바로 CSS에서 해당 명칭이 사용된 division에 연출을 사용하기 위해서지요. 해당 id나 해당 class에만 독립적으로 연출을 할 수 있거든요.

여기서 오해를 하시면 안되는게 저 id와 class는 <div></div>에만 쓰이는 것이 아니라 꽤 여러 엘리먼트에 쓰이게 됩니다. 뭐 그건 차차 얘기하기로 하고.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
   <link rel="stylesheet" media="screen" type="text/css" href="./test.css" />
   <title>테스트용 html</title>
  
</head>

<body>

<div id="container">
</div>

</body>
</html>

html 파일을 이렇게 저장하시고 브라우저로 열어 보세요. 아마 아무런 변화도 없을 겁니다. 왜냐구요? 일단 'container'라는 이름을 가진 division에 아무런 컨텐츠가 없어서 구역이 나누어져 있어도 보이질 않는 거죠.

그러나 저 <div>와 </div>사이에 - id 속성은 편의상 생략 - 글씨를 넣어보죠. 그리고 저장 후 새로 고침을 하면?


브라우저의 좌측 상단에 여러분이 써 넣은 글이 한 줄로 나타날 겁니다. 위와 같이 두 줄로 나온 이유는 제가 브라우저 창 크기를 줄여서 그런 거죠.

자, 저렇게 '글씨'를 넣은 부분이 바로 division의 컨텐츠 영역입니다. 그럼 지금부터 마진과 보더, 패딩이라는 개념을 알아보도록 하죠.

우선 전체적인 개념은 이렇습니다.

컨텐츠

패딩

보더

마진

가장 내부에 '컨텐츠'가 들어가고, 그 주위를 패딩이 감쌉니다. 택배 상자를 생각해 보면 택배 내용물이 컨텐츠고, 그 안에 충격 흡수 뽁뽁이가 패딩인 셈이죠. 그렇다면 보더는 택배 상자 그 자체가 되겠죠? 보더는 주로 '외곽선'의 개념으로 알려져 있어요. 그리고 마진은 택배 상자와 상자 사이의 '공간'. 즉 division 사이의 여백을 의미해요. 마찬가지로 이 개념은 division뿐만 아니라 여러 '블록 엘리먼트'에서 공히 쓰이는 개념입니다. '블록 엘리먼트'와 '인라인 엘리먼트'라는 개념은 구조와 연출 끝나면 바로 설명 드릴 거예요.

어쨌든, 하나의 '구획'이 가지는 영역의 크기는 위에 이야기 된 4가지 영역의 '총합'과 같아요.

지금부터 그것을 CSS를 통해 설명해 보죠.

CSS의 body 아랫줄에 다음과 같이 입력합니다.

#container    {background-color:yellow;}

저장하시고 새로 고침을 눌러 보세요.


자, 어떤가요? 글씨가 들어간 컨텐츠의 배경색이 '노랑'으로 바뀌었죠? 재미난 것은 컨텐츠의 좌측과 상단은 여백이 없는데 하단에는 여백이 생겼죠? 그것은 사실 여백이 아니라 줄 간격입니다. line-height라는 값을 CSS에서 조정해주지 않으면 저렇게 기본 값으로 여백처럼 보이죠.

그럼 여기서 약간의 수정을 해 봅시다.

컨텐츠의 '가로 크기'인 width 값을 줘 보죠. CSS로 갑니다.

#container    {background-color:yellow; width:200px;}

파란색 부분을 추가해 줍니다. width 앞의 한 칸 여백은 있거나 말거나 상관없습니다. 아예 엔터를 쳐서 다음 줄로 내려도 상관없습니다. 중괄호 - { } - 안에만 있으면 됩니다.


저장하고 새로고침하면 위와 같은 가로 200px의 노란색 컨텐츠 영역이 생깁니다. 창의 크기를 늘여도 200px에서 딱 끊기고 글씨가 다음 줄로 내려갑니다.

그럼 여기서 잠깐.

px란 무엇인가? 군대 내부의 충성클럽이 아닙니다.

pixel의 축약형인데, 픽셀은 화소죠. 디카 얘기할 때, '몇 만 화소야?' 하는 개념과 크게 다르지 않습니다. 일반적으로 컴퓨터 모니터는 1인치 - 2.54cm - 당 72픽셀을 가지고 있습니다. 1인치 길이 안에 - 그것이 가로든 세로든 - 72개의 화소, 즉 점이 박혀있다는 얘기죠.

위에서 가로인 width를 200px 이라 지정해 주었기 때문에 저 컨텐츠는 가로로 200개의 점이 군집되어 이루어진 영역입니다. 저 노란색은 200개의 점이 가로로 모이고, 세로로는 늘어난 길이만큼 다시 점이 찍힌 거죠.

픽셀은 여러분 모니터의 '해상도'에서도 나옵니다. 자주 접하게 되는 1024*768 해상도니  800*600 해상도니 하는 얘기는 가로 1024픽셀, 세로 768픽셀의 점들로 구성된 - 곱하기 해 보면 전체 점의 개수가 나오겠죠? - 해상도란 이야기지요. 생각보다 '점'이 적죠?

어쨌든 다시 돌아가보죠.

자 이젠 패딩을 줘 봅시다.

다시 CSS에 추가를 합니다.

#container    {background-color:yellow; width:200px; padding:10px;}

이젠 자동으로 저장하고 새로 고침이 되시죠?


자, 어떻습니까? 노란색 영역이 더욱 커졌죠? 왜일까요?

자 width 값은 '컨텐츠 영역'만 해당됩니다. 그리고 위에서 밝힌 바와 같이, 하나의 구획 - 여기서는 division - 은 "컨텐츠 영역 + 패딩 영역 + 보더 영역 + 마진 영역"으로 이루어진다고 했죠. 그럼 width 값에, 패딩 값을 더해주었으니 영역이 커지는 것은 당연하겠죠?

그럼 여기서 픽셀 값을 어떻게 주느냐를 잠깐 알아보죠. 위와 같이

padding:10px;

이라고 주게 되면 위, 오른쪽, 아래, 왼쪽. 4방향 모두 10픽셀씩 '패딩'을 주게 됩니다. 자 제가 '위, 오른쪽, 아래, 왼쪽'이라고 순서를 준 이유는 패딩 값을 각각 따로 주고 싶을 때의 방법이 저런 '시계방향' 순이기 때문이에요.

예를 들어

padding:3px 7px 12px 64px;

이렇게 4개 값을 주면 '위=3픽셀', '오른쪽=7픽셀', '아래=12픽셀', '왼쪽=64픽셀'로 주어지게 되는 겁니다. 이건 띄어쓰기 하셔야 해요.

사실 위에 보여드린 예는 '축약형'에 들어가죠.

축약형의 또 다른 예로

padding:12px 42px;

요렇게 두 개만 주게 되면 첫 번째 값은 '위와 아래', 두 번째 값은 '오른쪽과 왼쪽'이 됩니다.

반면, 아예 한쪽 값만 주는 방법도 있어요.

padding-left:38px;

이러면 왼쪽 패딩값만 주게 되죠.

이런 방식은 '마진'에서도 동일하게 적용된답니다.

자, 그럼 보더로 넘어가보죠.

또 다시 CSS를 엽니다.

#container    {background-color:yellow; width:200px; padding:10px; border:4px solid blue;}

뭔가 복잡해 보이죠? 사실 4px만 주셔도 보더는 생기는데, 좀더 쉽게 알아보려고 나머지 옵션도 준 겁니다. 결과를 볼까요?


자, 보시다시피 '파란색 - blue', '실선 - solid'가 굵기 4픽셀 짜리로 생겼죠. 컨텐츠와 패딩의 바깥에 저렇게 자리 잡습니다. 실선 외에도 점선, 두 줄 등등의 속성이 있죠. 컬러도 마음대로 바꾸셔도 되고, 안 하시면 각 브라우저 별 기본 값이 잡히죠.

자, 마지막으로 마진을 잡아 볼까요?

#container    {background-color:yellow; width:200px; padding:10px; border:4px solid blue; margin:20px;}

마진을 좌우상하 모두 20픽셀을 줬습니다.

결과는?


오우 좌측과 상단에 공간이 확 생겼죠? 그런데 왼쪽 마진과 상단의 마진이 크기가 다르죠? 분명 마진 값을 20픽셀로 동일하게 줬는데 말이죠.

자 그럼 여기서 문제.

위로 두 번째 그림을 보면 굳이 마진 값을 주지 않았는데도 보더 왼쪽과 상단에 약간의 여백이 있습니다. 이건 뭘까요? 그리고 '마진'에는 왜 배경색인 '노랑'이 안 나타날까요?

우선 첫 번째 질문에 대한 답은, 브라우저의 '마진 기본값'이 <body></body>영역에 할당되어 그렇게 나타나는 겁니다. 마진 값을 직접 지정하지 않으면 브라우저가 기본으로 정합니다. 그런데 우린 CSS에서 body 영역에 대한 연출에서 '마진값'을 정하지 않았거든요.

더불어 양쪽 - 오른쪽과 왼쪽 - 의 마진은 서로 겹치지 않지만, 상하의 마진은 만나게 될 경우 서로 '포개집니다'. 그러니 body의 기본 마진과 container의 마진값이 창의 왼쪽과 상단에서 각각 다른 결과로 나타나게 되는 거죠.

그리고 두 번째로 마진에는 배경색인 '노랑'이 나타나지 않아요. 이는 아까 택배 상자를 예로 설명 드렸는데 박스 자체 - 보더죠? - 의 외부에 있는 '마진'에게, 한마디로 '바깥'여백인 마진에게 배경색이 그대로 적용되면 말이 안 되죠? 택배 박스 외부로 내용물의 아우라가 나오면 그건 그때부터 택배 박스가 아니라 인디아나 존스에 나오는 성물이 되죠.

자 그럼 CSS를 수정해 봅시다.

body    {background-color:green; margin:0px;}
#container    {background-color:yellow; width:200px; padding:10px; border:4px solid blue; margin:20px;}

body 영역에 마진값 0px을 추가했네요.

결과를 보면?


자 좌측과 상단의 여백이 맞죠?

그럼 또,

body    {background-color:green; margin:0px;}
#container    {background-color:yellow; width:200px; padding:10px; border:4px solid blue; margin:0px;}

컨테이너의 마진을 0px로 바꾸면?


마진이 사라졌으니까 왼쪽과 상단에 짝 달라 붙죠.

좌상단에 붙는 이유는 다름이 아니라 브라우저가 문서를 읽어나가면서 보여주는 순서가 좌상단에서 우하단으로 흘러가기 때문이에요.

자 그럼 여기서 재미난 것을 붙여보죠.

body    {background-color:green; margin:0px;}
#container    {background-color:yellow; width:200px; padding:10px; border:4px solid blue; margin:0px auto;}

위에서 설명했듯이, 마진 속성의 값을 2개로 넣을 경우 앞 부분은 '위와 아래', 뒷 부분은 '오른쪽과 왼쪽'입니다. 그럼 저렇게 오토로 주면?


브라우저의 '중앙'에 들어가게 됩니다. 좀 더 정확한 개념으로 말하자면 해당 division이 속한 가로축의 중앙에 놓이는 거죠. center의 개념이 아니라 양쪽의 마진이 '자동'으로 잡혀서 중앙에 놓이는 겁니다.

그럼 위 아래도 오토로 줄 수 있을까요? 아니요. 그건 안 되네요^^

자 그럼 오늘은 여기까지 이야기하고 '구조와 연출'에 대한 기본 개념을 마칩니다.

다음 글에서는 '블록 엘리먼트'와 '인라인 엘리먼트'에 대해서 다뤄보죠.

정말.

갈길이 멀군요 -0-
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 함장

2006/12/04 23:43 2006/12/04 23:43
, ,
Response
No Trackback , 18 Comments
RSS :
http://harmjang.com/rss/response/2630597

xhtml & css - 구조와 연출(1)

지난 번 글에서 html과 CSS가 분리된다는 얘기를 했었죠.

html은 문서의 ‘구조(Structure)’ 에 해당하고, CSS를 통해서 그 문서의 ‘연출(Presentation)’을 담당하게 된다는 얘기입니다.

그럼 본격적으로 html의 ‘body’ 영역에 들어가는 구조들과, 그 구조들이 어떻게 ‘연출’되는지 살펴보도록 하죠.

자, 우선 기본적인 xhtml 형식을 갖춘 html을 만들어봅시다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

   <title>테스트용 html</title>
  
</head>

<body>


</body>
</html>

이런 html 파일을 메모장을 통해 작성해 test.html로 저장해 보죠. 그냥 아무데나 저장하지 말고 ‘test’라는 폴더를 만든 뒤 그 안에 저장합시다.

그리고 인터넷 익스플로러로 test.html 파일을 열어보면


‘허연’ 모습만 덩그러니 놓여있는 빈 창이 뜹니다. 그래도 상단 제목 표시줄에는 당당히 ‘테스트용 html’이라고 나와 있죠.

그럼 여기서 CSS가 ‘활동’하는 영역은 저 <body>와 </body> 사이의 영역입니다. 웹브라우저의 창 내부에서 이루어지는 모습을 ‘연출’하는 거죠.

자 그럼 또 다시 메모장을 열어서 CSS 파일을 맹글어 봅시다.

body    {background-color:green;}

요렇게만 적고 파일명을 ‘test’ 확장자 ‘css’로 해서 - 한 마디로 test.css - 저장합니다. 마찬가지로 아까 만든 test 폴더 안에 html 파일과 같은 위치에 저장합니다.

자 윈도우 사용자 중에서 중요한 점. 시작 -> 설정 -> 제어판으로 가셔서 좌측에 ‘클래식 보기로 전환’을 누르시면 우측에 ‘폴더 옵션’이라는 것이 뜰 겁니다. 더블 클릭 하셔서 ‘보기’탭을 선택하시고 ‘알려진 파일 형식의 파일 확장명 숨기기’라는 항목을 언체크 하셔야 메모장에서 자동으로 저장되는 텍스트 파일의 확장자 ‘txt’가 눈에 띕니다. html 파일이든 CSS 파일이든 txt로 저장되어서는 안 됩니다.

그럼 여기서 우리가 CSS 파일에 무엇을 적었는지 살펴보죠

맨 앞의 body는 <body>와 </body> 사이를 의미합니다. 후에 ‘#머시기’ 라던가 ‘.머시기’등이 등장할 겁니다만 그건 그 때 설명하도록 하고. 어쨌든, 저 body 영역에 대해 ‘연출’을 지정하는 내용입니다. 그 내용은 반드시 중괄호 - { } - 사이에 들어가야 하죠.

body와 중괄호 사이의 여백은 그냥 키보드의 tab 키를 눌러서 띄운 공간일 뿐입니다. 구별하기 편하라고 띄운 공간일 뿐 신경쓰실 필요는 없습니다. 더 많이 띄우셔도 되고, 공간 없이 붙이셔도 됩니다.

그리고 중괄호 안은 ‘background-color’라는 속성 - 배경색이죠 - 대한 정의로 콜론 - : - 을 써서 정의합니다. 속성값은 ‘green’으로 줬죠. 색 이름을 써도 되고, 아니면 ‘#222222’ 같은 hex코드로 이루어진 색상 번호를 입력해도 됩니다. 색상 번호는 웹에서 ‘색상표’로 검색하면 즐비하게 나오니 이용하시길 바래요.

그리고 맨 마지막. 괄호를 닫기 전에 ‘세미콜론’ - ; - 을 사용하여 지정을 완료해 주어야 합니다.

아니 괄호를 닫아주면 완료지 왜 세미콜론으로 닫냐고요?

프로그램 언어에 활용되는 것에 대한 설명을 드리기엔 머리가 아플 것 같으니 이렇게 이해하도록 하죠.

우리가 하나의 ‘영역’에 ‘하나’의 속성만 주면서 ‘연출’을 시도하진 않을 겁니다. 그렇다면 하나의 ‘영역’에 복수의 속성을 주기 위해서 ‘구분할 수 있는 도구’가 필요하겠죠. 그게 바로 ‘콜론’입니다.

그렇다면 지금은 한 줄이니, 세미콜론이 필요없지 않느냐고요?

아닙니다. 세미콜론은 일종의 마침표 역할도 하는 겁니다. background-color로 시작된 선언의 마침표는 세미콜론이 되는 거죠. 그럼 괄호는 무엇이냐고요? 괄호는 ‘영역’에 대한 연출 지정의 ‘마침표’가 되는 셈인 거죠.

자 그렇다면 이제 CSS 파일을 저장하고. 지난 글에서 배운 ‘link’를 통해 html 파일과 CSS 파일을 연결해 줍시다.

아까 저장한 test.html을 메모장에서 열어, <head>와 </head> 사이에 이 구문을 추가해 주죠.

<link rel="stylesheet" media="screen" type="text/css" href="./test.css" />

무슨 뜻인지 아시겠죠? 어제 보여준 ‘screen’에 나타나는 CSS 파일 연결 구문에서 href 속성의 값만 파일명이 test.css로 바뀌었죠? 그리고 같은 test 폴더 안에 위치했으니까 주소도 "./"으로 시작하죠?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  
<link rel="stylesheet" media="screen" type="text/css" href="./test.css" />

   <title>테스트용 html</title>
  
</head>

<body>


</body>
</html>

자, 저는 메타 엘리먼트와, 타이틀 엘리먼트 사이에 넣었어요. 그리고 저장을 하고. 새로 test.html 파일을 인터넷 익스플로러로 열어 봅니다.


자, 어찌 됐나요? 배경이 녹색으로 가득해졌죠?

이 상태에서 text.css 파일의 파일명만 text1.css로 바꾸시고, 인터넷 익스플로러 창을 새로 고침 해보세요.

녹색이 사라지죠?

이게 ‘구조’와 ‘연출’이 분리된. 그러니까 html로 구조를 짜고, CSS로 ‘연출’을 하게 되면 나타나는 현상에 대한 기본 원리입니다. 링크된 text.css 파일을 찾을 수 없으니까 '연출'을 나타낼 수 없는 거죠.

그러면 다음 글부터 좀 더 확장된 개념을 알아나가 봅시다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 함장

2006/12/01 00:25 2006/12/01 00:25
, ,
Response
No Trackback , 10 Comments
RSS :
http://harmjang.com/rss/response/2630596


블로그 이미지

수정 자본주의자의 삶

- 함장

Archives

Authors

  1. 함장

Calendar

«   2006/12   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Site Stats

Total hits:
1770792
Today:
173
Yesterday:
239