Category Archives: CSS

IE6에서 안되는 CSS Selector, IE7 라이브러리

찬명님의 글에서도 알 수 있듯 IE6에서는 CSS multiple selector도 적용되지 않는데다가 child selector도 적용되지 않습니다.

아래와 같이 a와 b라는 ID를 갖는 디비전이 같은 클래스명을 갖는 하위요소를 포함하고 있다고 칩시다.

<div id="a">
	<div class="content">…</div>
</div>

<div id="b">
	<div class="content">…</div>
</div>

그런데 문제는 각각 다른 사람 – 혹은 같은 사람이더라도… – 이 작업한 a와 b가 부모, 자식간이 되는 경우입니다. (물론 이미 부모, 자식간인 걸 알고 있어도 문제는 있습니다.)

<div id="a">
	<div class="content">…</div>
	<div id="b">
		<div class="content">…</div>
	</div>
</div>

a에 포함된 content에 스타일을 입히려고 쓴 CSS가 b의 그것에도 영향을 미치게 됩니다. 서로에 대해서 염두해두고 작업을 해야만 하는 것이죠. 프로젝트 규모가 커지고 요구사항이 빈번하게 바뀐다면 작업 시간은 그에 비례해서 더 커지게 됩니다.

IE6만 아니었으면 #a div.content라는 선택자 대신 #a > div.content라는 선택자를 썼으면 해결될 일이겠죠. 그래서 저희 팀에서는 아래와 같이 항상 prefix를 달아주기로 결정했답니다.;;

<div id="a">
	<div class="a_content">…</div>
	<div id="b">
		<div class="b_content">…</div>
	</div>
</div>

괜찮은 해결책이라고 생각합니다만 클래스명이 쓸데없이 길어지고 마크업만 놓고 보면 “a_”와 같은 의미없는 접두어가 생겨버렸습니다. 마이크로포맷 같은 걸 적용하려고 할 때도 귀찮은 일이죠. 웹 개발자가 살아나지 못하는 한 울며 겨자먹기로 이 방법을 쓸 것 같습니다.

IE7 자바스크립트 라이브러리

IE7(브라우저가 아닙니다.)이라는 라이브러리는 IE6의 CSS 지원 정도를 IE7처럼 만들어주는 마법같은 라이브러리입니다. 그런데! 열라 느립니다. -_-

IE7 라이브러리의 구동원리는 CSS 파일을 XML HTTP 요청으로 다시 받아 그 텍스트를 자바스크립트로 파싱하여 적용해주는 것입니다. 그 이유는 cssText로 읽을 수 있는 텍스트가 있지만 IE6의 경우 지원하지 않는 선택자 부분이 “UNKNOWN”이라는 문자열로 치환되어 버리기 때문입니다.


UNKNOWN이라는 문자열로 바뀌어버린 Child Selector와 마지막 밖에 인식하지 못하는 Multuple Class Selector

따라서 일단 쓸데없는 요청이 한 번 늘어나는 데다가 안 그래도 굼벵이 자바스크립트 엔진을 가진 IE6에서 그 큰 CSS 파일을 파싱한다는 것 자체가 느릴 수 밖에 없는 원인입니다.

IE7 라이브러리 중 Multiple Selector 부분과 Child Selector 부분만 사용해보고자 하였었는데 XML HTTP 요청이라는 제약(CSS 파일의 도메인을 문서와 항상 같게 해야한다는 제약)과 그래도 부담될 IE6의 굼벵이 자바스크립트 엔진 때문에 포기하였습니다. 혹시 시도해보고자 하는 분이 계시면 연락주세요. 그간 IE7 라이브러리를 뜯어보았던 자세한 소감을 말씀드리지요. -_-;;

오페라10, 웹 폰트 지원

CSS Zen Garden 웹 폰트 적용 버전을 오페라10에서 본 스크린샷!
CSS Zen Garden 웹 폰트 버전, 잘 나와요! ㅋ

오페라10 알파 버전이 공개되었습니다. 다양한 기능과 속도 향상과 더불어 웹 폰트지원하는군요. 파이어폭스 3.1도 웹 폰트를 지원하니 이제 모든 주요 브라우저(IE와 사파리 포함)가 웹 폰트를 지원하게 되었네요.

EOTTTF냐 하는 이슈가 있긴 합니다만, Ajax 등장시절 구글 지도가 그랬던 것처럼 Best Case가 나오면 붐이 일 수도 있지 않을까 싶어요.

관련 읽을거리들

“Humane Interface” 함께 읽기 시작.

우리는 자신의 전자 시종에게 억압당하고 있다.

이 책을 우리의 해방을 위해 바친다.

사내의 동료들(웹 클라이언트 개발자들)과 Humane Interface (인간 중심 인터페이스)를 읽기 시작했습니다. 인간-기계 사이의 인터페이스는 무엇보다 인간이 사용하기 편해야한다.라고 이야기하는 이 책은 우리가 일상적으로 사용하고 있는 기계들에 대하여 알고 있는 불편한 점이나 혹은 익숙해져 불편한지 조차 모르는 것들을 끄집어내고 인간중심으로 바꾸어가는 방법과 그러기 위해 인터페이스를 담당하는 사람들이 해야할 것들에 대해 얘기하고 있습니다.

뭐 아직 1장만 읽었을 뿐이라 더 자세히 설명드리기는 부족하네요. ㅎ 아무튼 매우 재미있는 시간들이 될 것 같습니다. 아, 혹시 다른 분들과 책을 함께 읽어보고 있는 분들은 오픈마루 개발자 권남씨의 스터디하는 법을 참고해보세요. 저희도 비슷하게 진행하고 있습니다.

그리고 첫 시간에 생각나는 게 있어 하나 적어봅니다.

은행 자동 입출금기(ATM)에서 출금이 카드 인식, 비밀번호 입력, 출금 금액의 순서로 진행되잖아요?

그런데 제가 비밀번호를 입력했는데 화면이 그대로여서 비밀번호 끝자리 1자리를 빼먹었나 싶어 마지막 1자리를 누르려는데 누르기 직전에 화면이 바뀌어서 출금 금액 중에 제일 큰 70만원을 선택해버렸어요. 그랬더니 이 기계가 바로 그냥 70만원을 주더라고요.

책 읽기 중 어떤 분의 경험담을 들은 것인데 요는 비밀번호 입력 후 입력이 잘 되었고 다음 단계로 진행중이라는 피드백이 적절하게 제공되지 않은 것이다. 그런데 요즘 웹 사이트들을 돌아다니다 보면 이와 같은 피드백이 상당히 불편하다.

웹에서 표현을 담당하는 CSS에는 사용자의 동작에 대한 여러가지 피드백을 제공할 수 있는 기능이 있다. 바로 동적 가상 클래스(dynamic pseudo class)인데 그 종류에는 link, visited, hover, active, focus가 있다.

active와 같은 경우에는 요즘 인터넷 회선 속도가 너무 빨라져 거의 사용되지 않고 있는지 모르겠지만 누구나 게시판 등의 폼 전송 시 진행이 되지 않는 것 같아 전송 버튼을 여러번 클릭해본 경험이 있을 것이다. 물론 페이지가 이동되면서 브라우저 자체적인 피드백이 제공되기는 하지만 Ajax 등의 RIA라면 또 얘기가 달라진다.

나머지 경우들에 대해서도 상당히 간과되거나 미적 요소 정도로 치부되는 경향이 있는 듯 하다. 심지어 focus 되었을 때 브라우저에서 기본적으로 제공되는 테두리 점선이 이쁘지 않다는 이유만으로 없애버리는 경우도 있고…

얘기가 딴데로 새고 반말, 존대말 섞어가며 저부터 이 글을 읽는 분들께 혼란을 드린 듯 합니다. 죄송합니다. (__)

여하튼 책 읽기 들어가는 마당에 많은 것을 느꼈는데 중요한 건 최소한 직접 인간이 사용하게 될 무언가를 만드는 사람으로써 이 분야에 대한 공부는 생각보다 훨씬 중요하다는 겁니다. :)

IE6의 종말, CSS3의 등장

2008년 7월 5일 하드코딩을 하는 사람들 웹 표준 스터디 소모임간의 연합 스터디 시 발표한 자료입니다.

IE6의 역사

  • Windows와 함께 버전 업.
  • Windows 98과 함께 IE5가 거의 쓰이지 않게 됨.
  • Windows XP가 쓰이지 않게 되는 시점에 IE6에 대한 지원을 없애게 될 것
  • Windows 7의 기본 탑재 브라우저에 귀추가 주목됨

웹 표준의 현재

  • 최신 브라우저들에 비해 IE6은 웹 표준의 구현 정도가 상당히 뒤쳐짐.
    • CSS 2.1 지원 부족
    • CSS 3 지원 거의 없음
    • DOM 2, 3 지원 부족
    • HTML 4.01 일부 지원하지 못함(abbr 등)

산 넘어 산, IE7

  • 최신 브라우저들에 비해 부족하지만 IE6보다는 나은 IE7
  • IE6이 거의 쓰이지 않았을 때 지원해야 할 최고(最古) 브라우저
  • Windows Vista에 기본 탑재

우아한 성능저하

  • 최신 웹 표준 기술은 현재 자바스크립트로 구현 가능한 것들을 더 짧은 코드로 가볍게 지원할 수 있다.
  • 이런 기술들을 지원하지 않는 구 브라우저(IE6, 7 등)는 정보를 얻는데는 불편함이 없지만 디자인은 일부 요소가 표현되지 않는 우아한 성능저하를 도입할 수 있다.
  • 전체 사용자들의 사이트 이용비용을 계산했을 때 최소가 되도록 고려.
  • IE6 사용자가 과반수인 현재는 아직 무리
  • 우리나라 웹 업계의 인식 전환 필요

끊임없는 웹 표준 기술의 발전

  • IE6, IE7은 지원하지 않는
    SVG,
    CSS3,
    HTML5
  • 웹 제작자들은 현재 실제로 적용하는 웹 표준 기술 이외에 새로운 기술들을 미리 익혀 시장 변화에 대비해야 한다.

웹 표현 기술의 다음, CSS3

  • Firefox, Opera, Safari 등이 점점 지원의 폭을 넓혀가고 있는 CSS3
  • 모듈이 세부화되어 W3C에서 표준화를 계속하여 진행중이다.
  • IE8은 아직 지원 부족

CSS3, 뭐가 좋을까?

  • 표현을 위한 마크업을 걷어낼 수 있다.
  • 자바스크립트 등의 외부기술에 의존하지 않은 자체 표현(Native expression) 가능
  • RIA의 무분별한 이용 감소

IE6은 아직 살아있지만…

  • 곧 시장에서 사라지게 될 것
  • IE6에서 사용할 수 없었지만 IE7 등의 브라우저에서는 사용할 수 있는 기술들에 대한 선학습 필요

파이어폭스 3.1의 CSS 지원 향상

파이어폭스 3의 공개가 6월 17일로 확정되고 다운로드 수 기네스에 도전하고 있다.
주소 표시줄 자동완성 기능, 페이지 줌 기능 등 막강한 사용자 편의 기능으로 무장하고 있는
파이어폭스 3이지만, CSS 지원 향상은 사파리,
오페라와 비교해보았을 때 조금 부족한 느낌이 강하게 들었다.
그런데 파이어폭스 3.1은 그런 실망감을 꽤 삭혀줄 것 같다.

파이어폭스 3.1의 CSS 지원

2008년 안에 출시될 것으로 알려진 파이어폭스 3.1
앞서 언급한 CSS 지원의 아쉬움을 많이 해결해줄 것임을 약속하고 있다.
모질라의 Platform/Post1.9Planning 문서를 보면
파이어폭스 3.1에서 새로 지원할 웹 표준 기술들 – 문서 내 1.9.next – 에 대해 정리되어 있는데 아쉬웠던 것들 중 상당수에 대해 지원할 것임을 명시하고 있다.

Downloadable Web Fonts
(@font-face)

드디어 파이어폭스에도 웹 폰트를 사용할 수 있게 된다. 웹 폰트 지원을 제일 먼저 주장했던 오페라는 아직도 소식이 없는 게 이상하지만, 10에는 추가되지 않을까?
드디어 IE에는 EOT,
나머지에는 TTF로 쓸 데 없는 img 요소를 제거할 날이 온 걸까?
IE의 알리아싱 관련 문제가 걸림돌이겠지만…

text-shadow

text-shadow는 웹 폰트 없이 우리나라의 웹 사이트들에는 별로 유용한 속성은 아니지만…
지금은 사용할 수 없겠지만… – IE, IE, IE…!! 아무튼 IE만 남게 되었다. – 난 이게 큰 의미를 가진다고 생각한다.

@media queries

자바스크립트 없이 CSS가 사용자들을 조금 더 구체적으로 파악할 수 있게 해주는
@media queries도 이제 IE만 남았다.

그 다음, 파이어폭스 4는?

파이어폭스 4 – 모질라 2 – 에는 Webkit이 제안한
CSS Animations and Transition,
calculated values가 예고되고 있다. 현재 자바스크립트와 DOM이 복잡하게 지지고 볶고 있는
RIA 어플리케이션이 좀 더 간단해지고 완성도 높아지고 고품격이 될 수 있다는 것이다!!

그 밖에…


HTML5
audiovideo 요소,
SVG fonts -
background-image에 사용될 수 있어야 크게 와닿을 것이라고 생각되는데 그게 빠졌다! – 등
많은 유용한 향상이 예고되고 있다. Multiple Backgrounds의 언급이 없는 것은 꽤나 아쉬운 부분이지만…

참고 문서

정보로서가 아닌 정보를 꾸며주기 위해 사용하는 <img> 태그, 그리고 이미지 대치법(Image Replacement)

현 시대의 CSS로는 마크업의 무결성을 보장하면서 원하는 표현을 충분히 할 수 없다. 그 대표적인 예가 폰트배경이미지이다. 그 중에서도 폰트와 같은 경우는 기본 텍스트만으로는 원하는 결과물을 얻기가 힘들다. 이럴 때 우리가 가장 많이 사용하는 방식이 <img> 태그 혹은 이미지 대치법(Image Replacement)이다.

정보를 꾸며주기 위한 <img> 태그

<img> 태그는 사전적으로는 정보를 지닌 – 의미 있는 – 시각 요소를 문서에 삽입하기 위한 태그이지만, 앞서 언급한 표현의 제약으로 인해 폰트 등을 원하는 대로 표현하기 위한 용도로 사용하기도 하다. 예전부터 – 대다수의 웹 제작자들이 마크업을 표현을 위한 용도로 사용하던 시절부터 – 국내의 거의 모든 사이트들이 사용하는 방법이기도 하다.

문제점

우선 <img> 태그의 남용이 마크업의 의미를 떨어뜨린다. 단순 텍스트와 <img> 태그는 기본적으로 의미하는 바가 다르다. 이미지 검색엔진의 결과물로 나타나는 수많은 텍스트 꾸밈용 이미지들을 보면 <img> 태그의 남용이 잘못된 마크업이라는 생각을 할 수 있다.

또, 남용된 <img> 태그는 구조와 표현의 분리라는 CSS의 목적을 달성하는 데 장애물이 된다. 마크업에 박혀있는 특정 시각 디자인 결과물을 위한 <img> 태그들은 다양한 표현의 걸림돌이다. <img> 태그가 남용된 사이트에서 프린트를 위한 CSS를 제작한다면 그 결과물은 어쩔 수 없이 스크린의 그것에서 크게 달라질 수 없을 것이다. 스크린 디자인을 위해 사용된 <img> 태그의 모양새는 바꾸기가 어렵기 때문이다.

CSS를 이용한 이미지 대치법(Image Replacement)

문제점

앞서 언급한것처럼 <img> 태그는 많은 문제점이 있지만 CSS를 이용한 이미지 대치법 역시 많은 문제를 가지고 있다. 가장 대표적으로 대다수의 이미지 대치법이 텍스트를 숨기거나(display: none;) 화면 밖으로 위치시키는 방법(text-indent: -999em;)을 사용하기 때문에 CSS 활성화·이미지 비활성화 상태에서 화면 상에 아무것도 출력하지 못하며 이 방법을 프린트용 CSS에 동일하게 적용하였을 때 보통의 웹 브라우저들이 기본적으로 배경 이미지를 출력하지 않기 때문에 백지 상태의 인쇄물을 보게되는 경우가 생긴다. (<img> 태그 사용시에는 사용자가 의도하지 않은 사이에 프린터의 잉크나 토너가 낭비된다!)

약간의 해결책

CSS 활성화·이미지 비활성화 상태의 경우 Gilder/Levin의 방법이나 Gilder Levin Ryznar Jacoubsen의 방법을 통해 해결할 수 있다. 하지만 이 방법은 이미지 뒤에 가려진 텍스트가 표시될 수 있는 충분한 공간이 확보되지 않으면 무용지물이 될 수 있다. z-index를 이용한 이미지 대치법도 하나의 방법인데 대치할 요소의 부모 요소에 배경색이 들어가있거나 한 경우에 문제가 생길 수 있다. 그리고 앞의 방법들과 마찬가지로 텍스트의 공간에 대한 문제가 있다. 그리고 이 모든 방법들은 의미없는 추가적인 마크업을 필요로 한다.

프린트 시의 문제는? 프린트용 CSS를 별도로 제작하면 바로 해결된다. 설마 로고와 메뉴가 덕지덕지 붙은 화면을 사용자에게 그대로 출력시키게 하는 것을 그냥 지켜보고 있다면 바로 당신이 관리하는 사이트에 프린트용 CSS를 추가하라.

어떤 것을 선택하느냐?

<img> 태그, 이미지 대치법(Image Replace). 이 방법들 중 어떤 것도 완벽하지 않다. 다만 각 방법들이 서로 다른 문제를 가지고 있고 어떤 것을 선택하느냐에 앞서 이 방법들의 문제점들에 대해 이해한 후에 선택하는 것이 필요하다.

최신 브라우저들의 CSS Multiple Backgrounds & Web Fonts 지원, 어떻게 되고 있나? – 2/2

지난 번에 Multiple Backgrounds에 대해 알아보았는데 이에 이어 오늘은 Web Fonts에 대해 써보겠습니다.

Web Fonts

간략한 배경

웹 폰트는 상당히 오래된 기술입니다. 브라우저 전쟁 시절 IE와 넷스케이프가 각자의 독자적인 기술로 사용했고 IE에는 그 때의 웹 폰트가 아직도 남아있습니다. 그런 과정에서 MS는 웹 폰트에 대한 표준 제정을 제안했고 현재 CSS3의 한 부분이 되었습니다.

진행상황

오페라의 CTOHåkon Wium LieA List Apart에 기고한 CSS @ Ten: The Next Big Thing이 웹 브라우저에서의 웹 폰트 지원과 그 필요성에 대해 설명하였고 현재 사파리 3.1 버전이 이를 지원하고 있습니다. 오페라는 아직 지원하지 않습니다만, 정황 상 곧 지원하겠죠?

파이어폭스의 경우 버그질라의 글을 통해 지켜보고 있습니다만, 파이어폭스3의 일정에는 웹 폰트의 지원이 빠져있습니다. 그러나 브레인 스토밍에 언급된 것은 고무적인 일이고 곧 추가될 것이라는 기대를 갖게 하는군요.

IE의 경우 현재 출시된 IE8 베타에서도 Embedded OpenType만을 지원하고 있습니다. 늘 그렇듯 앞으로의 판도를 예상할 수 있는 정보를 찾을 수 없었죠.

몇 개의 테스트

CSS @ Ten: The Next Big Thing에서 쓰인 예제 중 한 개를 사파리 3.1을 통해 보았습니다. 트루타입 폰트를 사용한 예제입니다. 그리고 해당 트루타입 폰트들을 Embedded OpenType으로 변환 후 IE에서 실험해보았습니다.

사파리 3.1에서의 스크린샷
IE7에서의 스크린샷

제법 비슷합니다. 하지만 다릅니다.

다음으로 HY견명조라는 한글 폰트를 본 블로그에 포함시켜서 테스트 해보았습니다. IE에서는 위와 마찬가지로 변환 후 테스트 하였습니다.

MS 윈도우 XP 서비스팩 2의 사파리 3.1에서의 HY견명조 스크린샷 MS 윈도우 XP 서비스팩 2의 IE7에서의 HY견명조 스크린샷 MS 윈도우 비스타의 IE7에서의 HY견명조 스크린샷

XP와 비스타의 윈도우의 폰트 렌더링 기술인 클리어 타입을 적용한 결과입니다. IE에서 사용할 수 없을만큼 투박하게 표시됩니다. 운영체제의 문제라고 생각됩니다만 결론은 비스타의 IE에서도 웹 폰트용으로 특수하게 가공되지 않은 폰트들은 사용할 수 없다는 것입니다. 그다지 좋은 결과는 아니군요. 제가 폰트에 관한 지식이 부족한 관계로 테스트를 잘못 수행한 것은 아닌지 약간은 염려됩니다. 혹시 그런 부분이 있으면 지적 부탁드립니다.

결론

애석하게도 CSS3의 웹 폰트 모듈은 마지막 업데이트가 6년전(2002년)이었고 아직도 Working Draft 상태입니다. 또한 IE는 Embedded OpenType만을 지원하고 있으며, 폰트의 렌더링 또한 우리가 원하는 모양새가 아닙니다.

오페라 진영의 제안과 사파리의 지원이 있었지만 IE와 파이어폭스에서 매끄럽게 사용할 수 있기 전까지는 마냥 기다릴 수 밖에 없을 것 같습니다.

대안을 통한 조금 나은 결론

True Font Family에서는 웹 폰트 속성을 대체하는 자바스크립트 라이브러리를 제공하고 있습니다. 자세히 살펴보지는 않았지만 웹 폰트가 점점 정착되어 가는 동안 하위 호환성을 보장할 수 있는 대안이 될 수 있을 것 같습니다. 국내에서는 우리글닷컴이 확대·축소 가능한 웹 폰트를 제공하고 있습니다. 윈도우에서 깨져보이지 않도록 가공된 폰트이죠. (싸이월드나 네이버 등에서 사용하는 가독성 떨어지는 고정 사이즈의 비트맵 웹 폰트랑은 많이 다릅니다.)

조만간 마크업에서 텍스트를 미려하게 표현하기 위한 <img> 태그를 곧 거둬낼 수 있지 않을까 하는 기대를 해봅니다.

CSS만으로 간단하게 세로 중앙정렬하기

CSS의 세로 중앙 정렬은
display: table-cell;이라는 간단한 방법으로 해결할 수 있습니다만,
글을 쓰는 현재 가장 많이 사용되는 브라우저인 IE가 이것을 지원하지 않기 때문에 항상 까다로운 문제였습니다.
(IE8 – 베타 (8.0.6001) 버전 – 은 지원하는 것 같지만 아직 버그가 있는 듯 합니다.)
많은 꼼수가 있지만 사용에 많은 제약이 있었죠.
그런데 yomotsu라는
일본인이 간단하면서도 명쾌한 아이디어를 내놓았습니다.

IE6, 7에 대해서는 display:inline-block; 과 같은 효과를 내게 합니다.
( inline-block 이 지정된 요소에도
vertical-align 이 유효하게 됩니다.)

div.sample1 div{
    display:table-cell;
    width:100px;
    vertical-align:middle;
}

* html div.sample1 div{ /* IE 6 */
    display:inline;
    zoom:1;
}

*:first-child+html div.sample1 div{ /* IE 7 */
    display:inline;
    zoom:1;
}

IE에 display: inline; 부여 후
zoom 속성을 통해 레이아웃 요소로 만듦으로서
inline-block 의 효과를 만드는 것이 핵심입니다.
display: table-cell; 이 적용되지 않은 블럭 요소는 세로 중앙 정렬이 되지 않고
inline 이 적용된 요소는 세로 중앙 정렬이 되는 차이를 미묘하게 이용한 것이지요.

지원 브라우저

yomotsu님의 글에서 발췌한 내용입니다.

  • 파이어폭스 1, 2
  • 넷스케이프 6, 7.1
  • 사파리 2, 3
  • 오페라 9.2 이상
  • IE 5.01, 5.5, 6, 7 ( inline-block 으로 구현 )

제약사항

이 방법의 제약사항은 인라인 요소의 세로 중앙 정렬은 다른 인라인 요소의 최대값에 영향을 받는다는 것입니다.
이것은 가로 너비를 갖지 않는 – 공간을 차지하지 않는 것처럼 보이는 – 마크업을 삽입하여 해결할 수 있습니다.
당신이 시맨틱 마크업 신봉자라면 IE Conditional Comments 필터링이나
자바스크립트와 DOM을 통해 의미없는 마크업을 삽입할 수 있겠습니다.
이마저도 싫다면… 글쎄요. ㅠㅠ

또 한가지가 IE를 위해 사용하는 핵입니다. IE7 구분을 위해 사용되어 온 핵
*:first-child+html이 현재의 IE8 – 베타 (8.0.6001) 버전 – 에도 적용되고
있고 IE8은 display: table-cell;을 지원하고 이전 버전과 달리
레이아웃(hasLayout)이 사라졌기 때문에
yomotsu님이 사용한 IE용 핵과는 다른 방법
- 예를 들어 IE Conditional Comments 필터링 – 으로 적용하기를 추천합니다.
아래 예제에는 IE Conditional Comments 필터링을 사용하였습니다.

IE7 이하에서 세로 중앙 정렬할 요소가 차지하는 영역이 다른 최신 브라우저들과 다를 수 있습니다.

이미지와 텍스트가 나란히 출력되는 예제에서
텍스트에 배경색이 부여된 영역을 비교해보세요.

몇가지 예제

참고 URL

최신 브라우저들의 CSS Multiple Backgrounds & Web Fonts 지원, 어떻게 되고 있나? – 1/2

웹 퍼블리셔 일을 하면서 가장 짜증나고 마음 아픈 작업이 디자인을 위해 의미 없는 마크업을 넣는 것과 텍스트를 대체한 이미지를 자르고 <img> 태그를 붙이는 일입니다. 어느 웹 퍼블리셔든지 시맨틱한 마크업을 만들고 싶은 마음이 간절하지만 앞서 언급한 문제들로 인해 마크업은 복잡해지고 지저분해집니다. 이미 W3C는 이 문제를 해결할 표준을 만들었는데 그것이 Multiple BackgroundsWeb Fonts입니다.

Multiple Backgrounds

라운딩된 가로와 세로 길이가 유동적인 박스 제작해보신 경험이 있으신가요? 이 박스를 CSS2의 Background 속성만으로 제작하려면 많은 고통이 따릅니다. 예를 들어 어떤 <div> 태그로 마크업한 박스를 앞에 쓴 것과 같이 만들려면 추가로 의미없는 마크업을 잔뜩 집어넣거나 자바스크립트를 사용해야 합니다. – 이 경우에도 자바스크립트가 의미없는 마크업을 집어넣는 것은 마찬가지입니다. 대체로 다음과 같은 형식의 마크업이 필요합니다.

<style type="text/css">
div { background: url("left-top.png") no-repeat left top; }
div div { background: url("right-top.png") no-repeat right top; }
div div div { background: url("left-bottom.png") no-repeat left bottom; }
div div div div { background: url("right-bottom.png") no-repeat right bottom; }
</style>

<div>
    <div>
        <div>
            <div>내용</div>
        </div>
    </div>
</div>

이게 뭡니까? (ㅠㅠ)

Multiple Backgrounds가 지원되면 하나의 <div> 태그만으로도 이것을 지원할 수 있습니다. 아무리 복잡한 박스라도 말이죠. 배경 이미지를 몇 십개도 깔 수 있으니까요(실제로 몇 십개를 만들면 안되겠지만요.;;).

<style type="text/css">
div {
    background:
        url("left-top.png") no-repeat left top,
        url("right-top.png") no-repeat right top,
        url("left-bottom.png") no-repeat left bottom,
        url("right-bottom.png") no-repeat right bottom;
}
</style>

<div>내용</div>

아, 얼마나 간결하고 아름다운 코드입니까?

그럼 현재 브라우저들의 Multiple Backgrounds 지원 현황을 알아볼까요?

IE (인터넷 익스플로러)
IE8의 CSS3 지원은 다른 최신 브라우저들에 비해 상당히 열악합니다. CSS Improvements in Internet Explorer 8에서도, IEBlog에서도 언제 지원하겠다는 내용은 찾을 수 없었습니다.
파이어폭스

파이어폭스 개발의 핵심 인물 중 하나인 David BaronMultiple Backgrounds에 관해 다른 견해를 가지고 있는 것 같습니다. 좀 난감하지요.

처음 글 쓸 때에서 상당히 많은 변화가 있었습니다. 결국 David BaronMultiple Backgrounds를 지원하기로 결정하였고 현재의 Nightly Build인 3.2pre1에서는 실제로 동작합니다.

오페라
오페라는 아마 곧 Multiple Backgrounds를 지원하리라 생각합니다. 오페라의 개발자 David Storey의 글 Selectors complete, what next?에서 짐작해볼 수 있었습니다.
사파리
이미 지원합니다. 2005년부터요. :D

슬픈 얘기지만 아마도 IE8에 추가되지는 못할 것 같습니다. 파이어폭스의 경우 David Baron의 결정이 나면 바로 추가되지 않을까 하고요. 결국 IE9일까요? IE9라면 4~5년 정도만 삽질하면 되는 걸까요? 하하하;; 그래도 IE9에서라도 추가된다면 3년쯤 후에는 기본적으로 Multiple Backgrounds를 사용하여 마크업을 구성하고 IE8 같은 하위 브라우저를 위해 자바스크립트로 의미없는 마크업을 추가하는 라이브러리를 사용할 수 있겠네요. 이거 뭐 기뻐해야 하는건지 슬퍼해야 하는건지 모르겠습니다.

다음 글에 Web Fonts에 관한 내용이 이어집니다. 기대해주세요. :D

계속되는 파이어폭스3 베타의 노력

우연히 Acid Test Results on Popular Browsers라는 글을 보게 되었는데 최신 브라우저들의 Acid3 테스트의 점수를 볼 수 있었다. 놀라운 것은 파이어폭스3 베타의 점수였다. 베타 2는 55점, 베타 3는 59점을 기록한 것이다. 호기심에 베타 4를 테스트 해보니 무려 67점을 기록하였다.

파이어폭스3 베타 4의 Acid3 테스트: 67점

파이어폭스3 베타 3의 Acid3 테스트: 59점

파이어폭스3 베타 2의 Acid3 테스트: 55점

IE8은 Acid2 테스트를 통과하였다. 그러나 Acid3 테스트에서는 겨우 17점이라는 초라한 성적표를 보여주었다. 파이어폭스3 베타가 각 버전마다 4점, 8점의 향상을 보여준 것과 대조적으로 IE8은 IE7에서 겨우 3점 오른 것이 전부였다. MS 제품군이 그러하듯 IE8도 파이어폭스3 베타와 같은 계속적인 향상을 보여주기는 힘들지 않을까 생각된다.

IE8 베타의 Acid3 테스트: 17점

파이어폭스3 베타 4의 Acid3 테스트 점수 67점은 오페라 9.50 베타 1의 점수 60점을 뛰어넘었다. 흐뭇한 마음으로 파이어폭스3 베타의 웹 표준 지원 노력이 어디까지 계속될지 지켜보아야겠다. 마음 속으로나마 열렬히 응원한다!

Some CSS3 Idea.

Conditional selector depends on child nodes

ul(a:hover) {property:value;}

Code means select ul element that contains a element with hover statement.

Example

<style type="text/css">
	ul { background-color: #999; }
	ul a:link { color: blue; }
	ul a:hover { color: red; }
	</style>
	
	<ul>
		<li><a href="/products">products</a>
		<li><a href="/store">store</a>
		<li><a href="/products">blog</a>
		<li><a href="/support">support</a>
		<li><a href="/community">community</a>
	</ul>

This code may render like following image.

And I want to change background color of ul element. So how? With javascript? See next code.

<style type="text/css">
	ul { background-color: #999; }
	ul(a:hover) { background-color: yellow; }
	ul a:link { color: blue; }
	ul a:hover { color: red; }
	</style>
	
	<ul>
		<li><a href="/products">products</a>
		<li><a href="/store">store</a>
		<li><a href="/products">blog</a>
		<li><a href="/support">support</a>
		<li><a href="/community">community</a>
	</ul>

This code may render like following image.

Mask (foreground)

Mask is properties like Background property. Background stands behind of contents, but Mask stands front of contents. Mask has 6 properties like Background’s and opacity property.

Mask must not influence on handling of contents. For Example, drag, right click on mouse, and so on.

Mask Properties

mask-color
same with background-color property.
mask-image
same with background-image property.
mask-repeat
same with background-repeat property.
mask-attachment
same with background-attachment property.
mask-position
same with background-position property.
mask
same with background property. But mask property can have mask-opacity property additionally.
mask-opacity
Like opacity property, mask-opacity property set opacity of mask. This doesn’t influence except mask, like contents, child nodes, and so on.

Example

There are one picture and one image for mask.


With the mask image, make decoration for the picture!

<style type="text/css">
	#miya {
	    mask-image: url(mask.gif);
	    mask-attachment: repeat;
	}
	</style>
	
	<img src="picture.jpg" id="miya" />

This code may render like following image.

Finally, make it better with mask-opacity property.

<style type="text/css">
	#miya {
	    mask-image: url(mask.gif);
	    mask-attachment: repeat;
	    mask-opacity: .3;
	}
	</style>
	
	<img src="picture.jpg" id="miya" />

Follwing image is the final result.

hsize (horizontal size), vsize (vertical size)

New size mechanism of CSS Box Model. width means space except padding, border, margin. But hsize means space except margin but include padding, border.

See the next image.

If I want to set this 2 box with 100% width of browser, hsize property will useful!

<style type="text/css">
	#box1 {
		float: left;
		hsize: 80%;
		padding: 1em;
		border: 1px solid red;
		background-color: gray;
	}
	#box2 {
		float: right;
		hsize: 20%;
		padding: .5em;
		border: 1px solid black;
	}
	</style>
	
	<div id="box1">
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat</p>
	</div>
	<div id="box2">
		<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna</p>
	</div>

rotation

rotation sample.

#test { rotation: 15; margin: 10px; border: solid #000 1px; padding: 10px; }

rotation property rotate element clockwise with given angle (number). margin must not influence on rotation, but padding, border must calculate with rotated element. child nodes of rotated element must positioned depend on rotated statement of parent element.

If rotation property is given, width and height cannot declare with percent.

CSS margin 속성의 중앙 정렬 문제

CSS Working Group의 블로그에 CSS의 박스 모델의 중앙 정렬 문제라는 글이 올랐습니다.

Unfortunately, when we revised CSS level 2, we discovered that many browsers imposed a limit on what could be centered. In particular, centering something that was wider than its containing block didn’t work. The reason, probably, was that the browsers’ scrollbars were programmed to grow to the right, but never to the left.

요약하자면, 현재 많은 브라우저들이 블럭 요소를 중앙정렬 하는데 제한이 있다는 것입니다. 예를 들어, 어떤 블럭 요소가 그 상위(부모) 블럭 요소보다 넓으면 margin: auto; 는 아무런 동작을 하지 않게 됩니다. 마찬가지로 스크롤바가 오른쪽으로만 늘어나는 브라우저의 특성 상 정확히 사용자의 화면에서 중앙 정렬되어 보이지 않는다는 것입니다. (이런 경우 넓은 자식 요소는 부모 요소와 같은 좌측점을 갖게 됩니다.)

가로 스크롤바가 생겼을 때 margin: auto;를 사용하여 정확히 중앙에 표시되지 않는 예제를 한 번 보세요.

위와 같은 문제를 해결하는 3가지 방안이 제시되었습니다.

  • center, auto라는 키워드를 갖는 alignment 속성의 추가
  • center, auto, left, right 키워드를 갖는 위와 같은 alignment 속성의 추가
  • auto 속성과 비슷하지만 중앙 정렬 문제를 해결하는 any 키워드를 margin 속성에 추가

alignment 속성은 위에 언급한 문제를 해결한 것 – center 키워드 – 으로 기존의 margin: auto; 의 기능과 별도로 구현되며, 2번째 방안인 left, right 키워드는 직관적이지 않았던 margin-left: auto; – 블럭 요소를 우측으로 정렬 – 과 같은 블럭 요소의 정렬도 alignment: left;와 같은 식으로 처리할 수 있도록 하는 속성입니다.

아마도 이 셋 중 하나가 CSS3의 박스 모델에 추가될 것으로 보입니다. 여러분은 셋 중에 어떤 게 나아보이시나요? 저는 2번째 방안이 좋아보이네요. 위의 어떤 방안이든 하위 호환성을 위해 두 개의 중앙정렬 속성을 해결해야 하는데 기왕이면 말끔하게 margin 속성의 정렬 기능을 alignment 속성으로 분리했으면 좋겠네요.

새로운 웹 표준 테스트, Acid3

최근 IE8이 Acid2 테스트를 통과했다고 해서 웹 표준 진영이 크게 고무된 바 있다. 그런데 HTML5의 리더인 이안 힉슨(Ian Hickson)이 또 웹 브라우저 제작자에게 또 시련을 주려나 보다. 바로 Acid3 테스트이다.


Acid3을 100% 통과한 웹 브라우저의 화면 스크린샷

Ian Hickson has been working hard on the acid3 test. The new test will focus mostly on ECMAScript and Dom through Selectors Level3, Media queries and data URIs. The new acid3 test isn’t quite ready yet but it should become ready within the coming months.

dustin brewerDevelopers are working on ACID3 test이라는 글에 따르면 새로운 Acid3 테스트는 ECMAScriptDOM3, CSS3의 Media Queries, data URIs에 초점을 둔 것이라고 한다. Acid2 테스트가 나온지 3년 가까이 지난만큼 그 동안 나온 새로운 웹 표준 기술들에 대한 검증의 필요성이 대두되어 Acid3 테스트가 작성중인 듯 하다.

글을 쓰며 IE8의 Acid2 테스트 통과에 환호하는 현실이 조금 씁쓸한 기분이 든다. 하지만 IE 역시 웹 표준을 적극 수용하려는 자세를 보이고 있는 만큼 Acid3 테스트는 Acid2의 그것보다 훨씬 빠르게 웹 브라우저에 반영될 것으로 기대한다.

아래는 재미로 최신 웹 브라우저들의 Acid3 테스트를 해본 결과이다. IE8의 점수가 궁금해진다. Acid3 테스트는 아직 완료된 테스트가 아니므로 참고만 하자.

웹 브라우저 테스트 점수
Internet Explorer 6 0%
Internet Explorer 7 0%
Firefox 2.0.0.11 60%
Firefox 3.0b2 63%
Safari 3.0.4 50%
Opera 9.25 56%

다음(daum)의 CSS 지원 향상

지난 수요일 시작된 email standard project과 관련하여 국내 유명 웹메일 CSS 지원 테스트를 올렸었는데 그새 다음(daum)CSS 지원의 향상이 있었다. 지금 막 확인한 사항이지만 테스트 시 지원하지 않거나 불완전하였던 background-image와 list-type-image의 지원이 추가되었다.

2007년 12월 3일 다음(daum) 웹메일 CSS 지원 테스트 결과

메일 컨텐츠 중 어떤 태크나 ID 값에 “x-” 라는 prefix를 붙였었는데 그 대상을 크게 줄인 결과인 것 같다(확인한 바로는 meta 태그에만 붙이는 것으로 변경되었다). ESP의 효과인지는 알 수 없지만 다음(daum)의 이번 변화는 훌륭한 것이라고 생각된다. 이제 모든 화살을 네이버에게…ㅋㅋ

다음(daum)은 이제 default CSS에 의해 덮어씌여진 font-family 속성을 사용할 수 있도록 수정하면 ESP의 추천사항을 전부 충족할 수 있다. cheer up!

국내 유명 웹메일 CSS 지원 테스트

email standard project의 시작을 보고 생각난김에 우리나라 웹메일 업체들의 CSS 지원 정도를 저 곳과 같이 테스트 해보았다. 테스트는 Firefox 3 Beta 1에서 실시하였는데 야후 코리아의 웹메일은 이용 상 장애가 있어 Firefox 2.0.0.10을 사용하였다. 일단 스크린샷을 공개하고 테스트 결과에 대하여 정리하여 추후에 공개토록 하겠다. 관심 있는 이들과 함께 email standard project의 한국 분점을 만들어 보았으면 좋겠다는 생각이다.

테스트는 email standard project의 acid test code를 사용하였고, 다음·네이버·야후·엠파스·드림위즈·하나포스를 대상으로 실시하였다. (혹시 제가 빼먹은 많이 쓰이는 웹메일이 있다면 피드백 주세요.)

테스트 결과 (스크린샷)

다음 (daum.net)
다음 웹메일에서의 스크린샷
네이버 (naver.com)
네이버 웹메일에서의 스크린샷
야후 코리아 (kr.yahoo.com)
야후 코리아 웹메일에서의 스크린샷
엠파스 (empal.com)
엠파스 웹메일에서의 스크린샷
드림위즈 (dreamwiz.com)
드림위즈 웹메일에서의 스크린샷
하나포스 (hanafos.com)
하나포스 웹메일에서의 스크린샷

div+CSS 레이아웃 공략..4

자 이제 CSS를 입혀보자.

일단 전역설정이다. 이 작업은 브라우저마다의 차이를 극소화하고, 사용할 tag의 기본적인 속성을 부여하는 작업이다. 갖가지 태그의 padding과 margin을 0으로 지정! tag마다 기본적으로 padding과 margin값이 틀리다. 쉬운 디자인 작업을 위한 설정이기도 하다. 가로줄(hr tag)은 디자인에서 (대개) 불필요하므로 보이지 않도록 처리한다. hr tag를 생략할수도 있겠지만, 디자인이 배제된 페이지에서의 head, body, foot의 구분을 위한 용도로 유용하므로 사용을 권한다!

html,body,img,form,div,span,h1,h2,h3,h4,hr,ul,li,table,tr,th,td {
    padding: 0;
    margin: 0;
}

hr {
    display: none;
}

위의 작업 외에도 기본적인 링크(a tag) 설정, 링크걸린 이미지를 위한 border 설정 등 작업내용에 맞는 기본설정을 한다!

자, 이제 페이지에 디자인을 입히는 작업 시작! 첫번째, 전체적인 레이아웃을 보자. 검은 테두리가 모든 정보를 덮고 있고, 그 안에 배경색이 있고, 중앙으로 정렬이 되어 있고, 위로부터 10px 떨어져 있다.

여기서 전체를 담당하는 container와 body tag의 선언을 하자. 브라우저 틀에 해당하는 body tag, 다음과 같이 선언해보자.

body {
    margin-top: 10px; /* 상단의 마진을 10px로 설정 */
    background-color: #fff; /* 배경색을 흰색으로 설정(=#ffffff) */
}

검은 테두리와 그에 해당하는 부분은 container에 선언한다.

#container {
    margin: auto; /* 중앙정렬! 상하 마진에는 관여되지 않는다. */
    width: 700px;
    border: 1px solid #000; /* 테두리를 1px 검은색으로 설정 */
    background-color: #f9f9fe;
}

이제 전체적인 틀을 만들었다. 다음으로는 실제 내용 하나하나에 디자인을 입혀보겠다. 로고, 상, 하, 좌에 각각 20px의 마진, font의 크기는 h1의 그것으로 결정하기로 했다고 하자. 또 로고의 폰트를 두껍게, 2차 로고(div 레이아웃 첫번째 페이지)는 표시하지 않기로 하자. (이미지에서 로고가 두껍게 나오지 않는건 내 컴의 문제 -_-+)

#logo {
    padding: 20px;
    border-bottom: 1px solid #000; /* 로고 아래의 검은줄 */
}

#logo h1 { /* 폰트에 대한 내용이므로 해당 tag에 직접 써준다 */
    font-weight: bold;
}

#logo span { /* 2차 로고를 숨긴다 */
    display: none; /* visible 속성은 보이지 않지만, 레이아웃에 해당영역을 차지 한다. */
}

좌측 메뉴, 다음으로 나올 뉴스 내용이 오른쪽에, 좌측 메뉴가 왼쪽에 배치되어 있다. top과 left의 border는 있으니, right, bottom에만 border를 적용시켜주면 되겠다. 배경색이 다르다. text가 중앙정렬이며, 상하도 중앙정렬이다 – 이럴 땐, 높이를 지정하지 않은 padding 옵션이 적당하다.

#menu { /* 메뉴 전체의 틀을 지정 */
    width: 150px;
    float: left; /* 왼쪽으로 정렬시킨다. 뿐만 아니라, 다음의 나올 컨텐츠의 위치를 이것도 동일선상(?)으로 위치시키는 기능도 있다. 자세한 내용은 http://www.w3.org/TR/CSS21/visuren.html#floats를 보도록 하자. */
    text-align: center; /* 좌우 중앙정렬 */
    background-color: #e0e0ef;
}

#menu li {
    list-style-type: none; /* 앞 딴의 미려하지 않은 동그랑땡을 제거! */
    padding: 8px; /* 중앙정렬을 위해. */
    border-right: 1px solid #000;
    border-bottom: 1px solid #000;
}

자, 이제 내용을 메뉴의 오른쪽으로 위치시킬 차례이다. 전체의 가로 size에서 메뉴의 가로 size를 제외한만큼의 영역을 차지한다. 행의 높이를 20px로 한다.

#contents { /* 내용 전체의 틀 */
    float: right; /* 오른쪽으로 띄운다. */
    width: 550px;
}
.news { /* 여러개의 뉴스가 한 페이지에서 보일 개연성을 부여한다(?) */
    padding: 10px;
}

.news-body p { /* 행의 높이는 전역설정을 하지 않는다!! */
    line-height: 20px;
}

행의 높이는 레이아웃에 뜻하지 않은 악영향을 끼치는 경우가 많다. 필요한 경우에만 사용한다. 여러군데에서 같은 행의 높이가 사용된다면, 따로 class를 부여하여 사용하면 좋다.

자, 이제 copyright를 만들고 전체적인 레이아웃을 마무리한다! float 상태를 취소하고 아랫쪽으로 배치! 좌우 중앙, 상하 중앙(padding 사용!), 상단에 1px의 border!

#copyright {
    clear: both; /* float 상태를 취소 (both = left + right) */
    text-align: center;
    border-top: 1px solid #000;
    padding: 20px;
}

페이지가 완성되었다. 결과물을 눈으로 확인하자! 예제 – divcss2.html

다음 공략에서는 좀더 실제상황가 가깝게 이미지, 링크 등이 들어간 디자인을 입혀보겠다!

덧) 모자란 실력으로 공략같은걸 씁니다. ^^ 많이 부족한 부분이 있고, 간혹 틀린 부분이 있을 수도 있습니다. 이런 부분에 대해선 미리 죄송하다는 말씀 드립니다! 많은 정보 얻고있는 forums.mozilla.or.kr에게는 언제나 감사하다는 말씀.. 덧붙입니다!

div+CSS 레이아웃 공략..3

자! 지난 글에서도 언급했듯 실제로 사이트에 있을만한 페이지를 한번 작성해보자! 일단 첫번째로는! 페이지의 재료가 필요하다. 로고라든지, 메뉴, 페이지의 내용, 카피라이트 등.

타이틀
    멋져부러 뉴스
서브타이틀
    div 레이아웃 첫번째 페이지!
----
메뉴
    home
    뉴스
    방명록
    링크
----
뉴스
    박지성, 에인트호벤과 계약연장 합의

네덜란드 프로축구에서 활약하는 박지성(24.에인트호벤)이 소속팀에 3년 더 남을 전망이다.

PSV 에인트호벤은 내년 시즌을 끝으로 계약이 만료되는 박지성과 3년 재계약을 맺기로
원칙적으로 합의했다고 현지 신문 알게메네 다흐 블라드가 12일(한국시간) 보도했다.

구단 웹사이트(www.psv.nl)도 "PSV는 박지성이 오랫동안 에인트호벤에 남아주기를
바라고 있고 그와 협상을 시작했다"고 밝혔다.

이번 계약 연장은 구단 측이 적극적으로 요구한 것으로 이에 따라 박지성은 오는
2008년까지 에인트호벤 유니폼을 입게 된다.

거스 히딩크 에인트호벤 감독은 "박지성도 이곳에 남기를 바라고 있다. 2002년
한일월드컵 이후 많은 한국 선수들이 유럽에 진출했지만 박지성과 이영표가 유일하게
성공한 예"라면서 "두 선수는 우리팀의 엔진과도 같다. 나머지 구체적인 사항도
잘 성사될 것으로 믿는다"고 기대를 나타냈다.
----
copyright
    2005 blahblah.com. All rights reserved.[/code]

자, 위의 재료로 div 레이아웃 페이지를 만들어보자! 일단 디자인이 배제된 html 페이지를 구성하는 단계이다. 내 생각엔 이 단계가 div 레이아웃 공략에서 제일 중요한 단계가 아닐까 생각한다. 그만큼 중요하다는 말씀!!!

<!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>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>박지성, 에인트호벤과 계약연장 합의 - 멋져부려 뉴스</title>
    <style type="text/css">
    </style>
</head>
<body>
<div id="container">
    <div id="logo">
        <h1>멋져부러 뉴스</h1>
        <span>div 레이아웃 첫번째 페이지</span>
    </div>
    <hr />
    <div id="menu">
        <ul>
            <li>home</li>
            <li>뉴스</li>
            <li>방명록</li>
            <li>링크</li>
        </ul>
    </div>
    <hr />
    <div id="contents">
        <div class="news">
            <h3>박지성, 에인트호벤과 계약연장 합의</h3>
            <div class="news-body">
                <p>네덜란드 프로축구에서 활약하는 박지성(24.에인트호벤)이 소속팀에 3년 더 남을 전망이다.</p>
                <p>PSV 에인트호벤은 내년 시즌을 끝으로 계약이 만료되는 박지성과 3년 재계약을 맺기로 원칙적으로 합의했다고 현지 신문 알게메네 다흐 블라드가 12일(한국시간) 보도했다.</p>
                <p>구단 웹사이트(www.psv.nl)도 "PSV는 박지성이 오랫동안 에인트호벤에 남아주기를 바라고 있고 그와 협상을 시작했다"고 밝혔다.</p>
                <p>이번 계약 연장은 구단 측이 적극적으로 요구한 것으로 이에 따라 박지성은 오는 2008년까지 에인트호벤 유니폼을 입게 된다.</p>
                <p>거스 히딩크 에인트호벤 감독은 "박지성도 이곳에 남기를 바라고 있다. 2002년 한일월드컵 이후 많은 한국 선수들이 유럽에 진출했지만 박지성과 이영표가 유일하게 성공한 예"라면서 "두 선수는 우리팀의 엔진과도 같다. 나머지 구체적인 사항도 잘 성사될 것으로 믿는다"고 기대를 나타냈다.</p>
            </div>
        </div>
    </div>
    <hr />
    <div id="copyright">
        2005 blahblah.com All rights reserved.
    </div>
</div>
</body>
</html>

예제 - divcss.html

간단히 html 페이지를 구성해보았다. 이제 이 html 페이지를 뜯어가며 살펴보자!

일단 body 안쪽에 전체를 포괄하는 div tag( id="container" )를 선언한다. 이는 디자인을 입힐 때의 전체적인 레이아웃(가로길이, background 등..) 지정을 담당하는 역할을 주로 한다.

이제 재료의 구분(타이틀, 메뉴, 뉴스..)별로 다시 div tag를 감싸준다. 타이틀이나 메뉴처럼 한번만 나오는 녀석은 id로, 뉴스처럼 중복된 내용이 나올 수 있을만한 녀석은 class로 css를 위한 선언을 하여준다.

다음으로는, 타이틀의 로고나 뉴스의 제목 등 다른 내용들보다 중요한 text는 headings(<h1> ~ <h6>)로 강조됨을 표시한다. 로고 같은 제일 중요한 녀석은 h1 tag로, 본문(뉴스)의 제목은 h2나 h3 tag 정도로 배정해주면 적당하겠다.

메뉴와 같은 몇 개의 간단한 text의 묶음은.. lists( <ul>, <ol>, <li> )로 묶어주기를 추천한다. 그 외 문단나눔(p tag), 표(table tag) 등은 용도에 맞게 쓰자!

이 정도면 기본적인 html 코딩의 기초를 다 적지 않았나 싶다. 부족한 부분이 있겠지만 그런 것들은 이런 저런 상황들을 통해 내공을 쌓을 수 있을 것이다! 원래 이번 공략에서 CSS까지 입혀보기로 했으나, 이미 긴 작문에 기력을 소진한 상태라..-_-; 다음 시간에 CSS를 입혀보기로 하겠다!!

div+CSS 레이아웃 공략..2

자! 이제 본격적인 공략…에 앞서 한가지만 더 짚고 넘어가자. 바로 html 문서의 형식을 결정하여 주는 DTD(Document Type Definitions)라는 녀석!

W3C(World Wide Web Consortium)에서는 여러가지 버전별 html 표준 규약을 제공하고 있는데, DTD는 그 여러가지 버전중에 한가지 규약을 사용하겠다 하는 선언이다.

우리의 공략의 표준 규약으로 사용할 html의 버전은 XHTML 1.0으로 해당 DTD들은 XHTML1 DTDs에서 볼 수 있다.

보면 3가지 DTD가 있는데, 엄격한 규약(strict), strict보다 약간 느슨한 규약(transitional), frameset 페이지에서의 규약(frameset)이 있다. 앞으로 예제에서는 엄격한 녀석(strict)을 쓰겠다.

아래는 strict DTD를 적용한 XHTML 1.0 페이지의 기본이다. 우리의 공략은 이 페이지를 바탕으로 출발하겠다!

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello, tenshi!</title>
</head>
<body>
<p>
  contents...
</p>
</body>
</html>

기본적으로 DOCTYPE(Document Type)을 최상단에 선언하고, html tag(이하 html)가 처음과 끝에 나오고, html안에 head tag(이하 head), body tag(이하 body)가 반드시 포함, head안에 title tag, 문서의 encoding( , [url=http://www.w3.org/TR/xhtml1/#C_9]다른 방법[/url]도 있지만 여기선 다루지 않겠음!)을 반드시 선언…

암튼, XHTML 1.0의 규약을 지키기 위해서는 여러가지 제약조건들이 있다. 처음부터 힘들게 외우기 보다는 손 가는대로 페이지를 만들고 유효성 검사를 하면서 고치면 훨씬 쉽게 코딩할 수 있다~ 유효성 검사에 대해서는 추후에 다시 설명하도록 하겠다.

이제 XHTML 1.0 strict 규약을 적용한 기본 페이지도 만들어봤고, 다음엔 실제로 예제 페이지를 하나 맹글어보자~ 또, CSS로 디자인을 입히는 요령에 대해서도 하나하나 배워보자!

div+CSS 레이아웃 공략..1

HTML 코딩, 우리는 여지껏 열심히 table tag(이하 table) 안에 또 table을, 또 table을 넣어가며 코딩을 해왔다.

"td tag(이하 td)를 하나 안닫았다!"

"table 10단 콤보에 들여쓰기를 하려니 온통 공백밖에 없다 OTL"

그렇게 table 중첩 코딩을 하면서 위와같은 문제를 많이 겪었으리라 싶다.

이제 저런 문제들을 좀 벗어나보자, 바로 div+css 레이아웃(이하 div 레이아웃)으로! 그냥 위와 같은 문제들만이라면 div 레이아웃을 뭐 굳이 배우겠냐 싶지 않은가? 그렇다! 궁극적으로 div 레이아웃을 공략해야만 하는 이유는 따로 있는 것이다.

  • "컨텐츠에 html, 디자인에 css! 전달하고자 하는 정보와 그 정보를 꾸며주는 디자인의 완벽한 분리!"
  • "위에 따른 동일한 컨텐츠(html)에 여러 디자인의 구성!"
  • "가벼워진 페이지, 날아다니는 서버! (좀 과장이 심하죠? -ㅛ-)"

그 외에도 많은 장점들이 있다! 굳이 알고 싶다면 한글 모질라 포럼 – Web Standard Evangelism을 한번 둘러보시라!

자 이제 div 레이아웃으로 옮겨갈 마음이 생겼다면 본격적으로 공략을 시작해보자!