CSS3 Background Image Layering

CSS3 에서 가장 환영할 만한 것이 하나의 element 에 여러개의 background 를 넣을 수 있다는 것이다. 이것이 가능하면 불필요한 markup 을 넣을 필요가 없어지기 때문에 보다 구조적인 문서를 만들기 쉽다. CSS3 의 기능을 완전히 구현한 것은 아니지만 테스트 결과 상당히 유용할 것으로 생각 된다. IE6, Firefox 1.0, Opera7.54 에서 테스트 했음

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>CSS3 Background Property</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
/* css3 background property implement
 * Author : http://hyeonseok.com
 * Update : http://hyeonseok.com/home/archive_javascript.php#Css3BackgroundImageLayering
 * version : alpha (20050227)
 */
function css3Background(targetElement, backgroundString) {
	if (!targetElement) {
		return false;
	}
	// getStyle script form http://www.quirksmode.org/dom/getstyles.html
	if (window.getComputedStyle) {
		padding = window.getComputedStyle(targetElement,null).getPropertyValue("padding-top");
		padding += " " + window.getComputedStyle(targetElement,null).getPropertyValue("padding-right");
		padding += " " + window.getComputedStyle(targetElement,null).getPropertyValue("padding-bottom");
		padding += " " + window.getComputedStyle(targetElement,null).getPropertyValue("padding-left");
	} else if (targetElement.currentStyle) {
		padding = eval('targetElement.currentStyle.' + "paddingTop");
		padding += " " + eval('targetElement.currentStyle.' + "paddingRight");
		padding += " " + eval('targetElement.currentStyle.' + "paddingBottom");
		padding += " " + eval('targetElement.currentStyle.' + "paddingLeft");
	}

	// save content
	originalHTML = targetElement.innerHTML;
	targetElement.innerHTML = "";

	// create div element and layering
	backgroundEach = backgroundString.split(",");
	for (i=0; i<backgroundEach.length; i++) {
		backgroundProperty = backgroundEach[i].replace("background:", "");

		el = document.createElement("div");
		if (i==0) {
			targetElement.style.padding = "0";
		}
		el.style.background = backgroundProperty;
		targetElement.appendChild(el);
		targetElement = el;
	}

	targetElement.style.padding = padding;
	targetElement.innerHTML = originalHTML;
	return true;
}
</script>
<style type="text/css">
ul {
	padding: 1em;
	margin: 0.5em;
	padding: 1em 1.5em;
	list-style: none;
	width: 50%;
}
ul li {
	margin: 0.3em 0 0;
	padding: 0.3em 0 0;
	line-height: 1.2em;
	border-top: 1px solid #ddd;
}
ul li:first-child {
	border: none;
}
</style>
</head>

<body>
<h1>CSS3 Background Image Layering 구현</h1>
<h2>사용법</h2>
<ul id="usage">
	<li>함수에 element 와 css3 module 의 background layering 문법을 넘겨주면 됨</li>
	<li>background 속성은 다른 것은 안되고 background short hand 를 콤마로 나열한 방법만 지원됨 (다른 방법은 앞으로도 지원할 생각 없음)</li>
</ul>
<h2>Known defect</h2>
<ul id="defect">
	<li>IE 에서는 p element 에 적용할 경우 "알 수 없는 런타임 에러" 발생. (p 안에 div 가 들어가는 것이 DTD 상에서 오류이기 때문 인 것 같음, 그럼 ul 은? -o-)</li>
	<li>element 의 style 이 유지가 안되기 때문에 element 의 style 을 css 에서 하위 div 까지 중복 선언을 해 주어야 함</li>
	<li>element 안에 div 를 중첩하는 방식이기 때문에 ul, table 등에 사용할 경우는 분명히 문법적으로 오류임. 하지만 markup 이 보존 될 수 있기 때문에 잘 보이기만 하면 별 문제 없을 듯. 이게 싫은 사람은 div, li, td 등과 같이 하위에 div element 를 가질 수 있는 경우에만 사용하면 됨</li>
	<li>IE 에서는 Table element 에 적용했을 경우 정상적으로 나오지 않음 (table 에는 사용하지 마세요.) Firefox 에서는 bg 는 나오지만 어짜피 padding 을 control 할 수 없기 때문에 사용 할 수 없음</li>
	<li>IE 에서는 필수적으로 block model hack 을 사용해야 함 (block 에 dimension 을 주는 방법: width 나 height 둘중의 하나는 block 에 부여를 해야하고 그럴 수 없을 경우 css hack 사용)</li>
	<li>padding 이 이미지에 비해 충분하지 않을 경우 라인이 깨져서 나옴 (당연한 거잖아!)</li>
</ul>
<script type="text/javascript">
css3Background(document.getElementById("usage"), "background: url(bgV.gif) repeat-y top left, background: url(bgV.gif) repeat-y top right, background: url(bgH.gif) repeat-x top left, background: url(bgH.gif) repeat-x bottom left, background: url(bgTL.gif) no-repeat top left, background: url(bgTR.gif) no-repeat top right, background: url(bgBL.gif) no-repeat bottom left, background: url(bgBR.gif) no-repeat bottom right");
css3Background(document.getElementById("defect"), "background: url(bgV.gif) repeat-y top left, background: url(bgV.gif) repeat-y top right, background: url(bgH.gif) repeat-x top left, background: url(bgH.gif) repeat-x bottom left, background: url(bgTL.gif) no-repeat top left, background: url(bgTR.gif) no-repeat top right, background: url(bgBL.gif) no-repeat bottom left, background: url(bgBR.gif) no-repeat bottom right");
</script>
</body>
</html>