JQuery를 이용한 겸손한 탭 메뉴 구현

이번에 사이트를 개편하면서, 탭 메뉴로 구성된 추천 글 목록을 추가했습니다. 제 사이트의 방문자 통계를 확인하니, 방문자들의 이동 경로가 1개의 글만 읽고 사이트를 떠나거나, 홈페이지로 이동하는 등 무척 기초적인 수준의 이용만 하고 있다는 것을 확인했기 때문입니다. 블로그의 글이 360개임에도 불구하고 1~2개 글만 보고 떠나는 걸 방치할 수 없었기에 추가한 콘텐츠입니다.

웹 사이트에서 탭 메뉴를 구현하기 위한 일반적인 방법은 Javascript의 onClick 이벤트를 이용하여, style의 display 속성을 조정하는 것입니다. 이때 보통은 HTML a 태그에 Javascript를 직접 사용하는 방식을 이용합니다. 때문에 이 방법은 구조적인 HTML 마크업과 거리가 멀이질 수 밖에 없죠. 즉, 웹 표준에 어긋난는 방법입니다. 또한 마우스를 사용하지 못하기 때문에 onClick 이벤트를 발생시킬 수 없는 시각장애인의 경우 해당 컨텐츠에 접근하기도 어렵습니다.

제 사이트는 Javascript library로 JQuery를 사용하고 있습니다. JQuery는 파이어폭스나 워드프레스와 비슷한 점이 많습니다 . 예전에 몇몇 글에서 밝혔듯이, 무척 작고 효율적이며, 다양한 기능 외에도 플러그인이 많은 라이브러리죠. 특히 JQuery의 $(document).readyDOM의 고질적인 문제인 브라우저의 늦은 랜더링을 해결할 수 있답니다.

탭 메뉴에 해당하는 콘텐츠 구성

저는 사이트 방문객이 좀 더 머무르면서 다양한 콘텐츠에 접근할 수 있는 기회를 제공하기 위해서, 탭 메뉴로 구성된 콘텐츠를 제공하고 싶었습니다.

겸손한 탭 메뉴 구현

HTML로 콘텐츠 구조화

탭 메뉴를 책의 목차(Table Of Contents) 형식으로 구성했습니다. 현재의 HTMLXHTML 스펙에서 가장 구조적인 방법이죠. 물론 앞으로 HTML 5가 채택되어 nav 요소를 사용할 수 있기 전까지 입니다.

<div id="readMore02">
	<h2>또 다른 읽을거리</h2>
	<ul class="tabs-nav">
		<li class="tabs-selected"><a href="#relatedPost">Related Post</a></li>
		<li><a href="#randomPost">Random Post</a></li>
		<li><a href="#recentPost">Lasted Post</a></li>
	</ul>
	<div id="relatedPost" class="tabs-selected ">
		<h3>Related Post</h3>
		<ol>
			<li><a href="#">웹표준의 득과 실</a></li>
			<li><a href="#">브라우저 업그레이드 캠페인</a></li>
			<li><a href="#">Hooney.net 리뉴얼 계획-1</a></li>
			<li><a href="#">올블로그의 플래시 네비게이션</a></li>
			<li><a href="#">아직 메인시안도 미완성이네..</a></li>
		</ol>
	</div>
	<div id="randomPost">
		<h3>Random Post</h3>
		<ol>
			<li><a href="#">세계 비보이 대회 한국 개최, 그리고 잡담</a></li>
			<li><a href="#">KWAG 7회 워크샵</a></li>
			<li><a href="#">CSS, 웹표준 실무 적용 워크샵 2006</a></li>
			<li><a href="#">Global Web Expert 실무 워크샵</a></li>
			<li><a href="#">변경된 구글 코리아의 첫 화면을 뜯어 보자.</a></li>
		</ol>
	</div>
	<div id="recentPost">
		<h3>Recent Post</h3>
		<ol>
			<li><a href="#">블로그 4번째 리뉴얼</a></li>
			<li><a href="#">Fujitsu ColorSelector 사용기</a></li>
			<li><a href="#">W3C의 마크업 유효성 검사 서비스 디자인 개편</a></li>
			<li><a href="#">Fujitsu 웹 접근성 보조도구</a></li>
			<li><a href="#">구글 페이지 랭크 7점 획득</a></li>
		</ol>
	</div>
</div>

CSS로 콘텐츠 시각화

CSS를 이용하여 콘텐츠를 시각적으로 표현했습니다. float 속성을 사용하여 탭 메뉴를 가로로 배치한 점 외에는 특별히 고급 기술을 사용하지 않았습니다. IE가 비순차적 목록(ol)의 상단 마진를 다르게 출력하는 버그 때문에, 2줄의 CSS가 추가됐습니다.

body {
	margin:0; padding:0;
	font: .75em/1.5 "AppleGothic", "Malgun Gothic", dotum, sans-serif;
}
a { color:#369; font-weight:bold;}
#readMore02 {
	position:absolute; top:50%; left:50%;
	width:350px;
	margin:-120px 0 0 -180px;
	border:1px solid #ccc;
}
#readMore02 h2,
#readMore02 h3 { display:none; }
#readMore02 ul {
	margin:0; padding:5px 0 0 2px;
	height:26px;
	border-bottom:1px solid #ccc;
	background:#eee;
}
#readMore02 ul li {
	list-style:none;
	float:left;
	margin:0 0 0 3px; padding:0;
	position:relative; top:1px;
}
#readMore02 ul li a {
	display:block;
	padding:.25em .75em;
	border:1px solid #ccc;
	line-height:1.5; text-decoration:none;
	background:#aaa; color:#fff;
}
#readMore02 ul li a:hover,
#readMore02 ul li a:focus,
#readMore02 ul li.tabs-selected a {
	border-bottom:1px solid #fff;
	background:#fff; color:#f60;
}
#readMore02 div {clear:left;padding-top:1em;} /* IE6 마진 버그 */
#readMore02 div.tabs-selected { display:block; }
#readMore02 div.tabs-hide { display:none; }
#readMore02 ol { margin-top:0; } /* IE6 마진 버그 */
#readMore02 ol li { line-height:2; }

JQuery로 콘텐츠 동적 구현

JQuery와 tabs 플러그인을 이용하여 탭 메뉴를 동적으로 구현했습니다. 플러그인에서 지원하는 페이드 효과를 이용하니 훨씬 보기 좋은 탭 메뉴가 구현됐습니다.

<script src="/theme/v4/js/jquery.js" type="text/javascript"></script>
<script src="/theme/v4/js/jquery.tabs.pack.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function()	{
$('#readMore02').tabs({ fxSlide: true, fxFade: true, fxSpeed: 'normal' });
});
</script>

이 글이 저처럼 블로그에 많은 글을 작성했음에도 불구하고, 예전에 작성한 글이 방문객에게 좀처럼 노출되지 않는 문제로 고민하던 분들에게 도움이 됐으면 좋겠니다. :)

변경된 구글 코리아의 첫 화면을 뜯어 보자.

구글 코리아의 첫 화면이 변경됐다. 기존에는 로고에만 1개의 이미지를 제공할 정도의 텍스트 기반 페이지였는데(현재 google.com처럼), 이번에 여러가지 아기자기한 아이콘이 추가됐다. 특히 검색 영역 아래쪽에 위치한 구글 서비스로 바로 갈 수 있는 링크들을 제공하는 점이 눈에 뛴다.

구글 한국

내 경우에는 구글을 검색 뿐만 아니라, GMail, Gtalk, Gcalendar, Gnote, Gdesktop, Ggroup 등 다양한 서비스 등을 이용하고 있기에 Google My Account를 시작 페이지로 구정해서 사용해오고 있었다. 하지만, 이번에 구글 코리아의 첫 화면이 변경됐기에, 시작 페이지 주소를 변경해야겠다.

추가된 바로가기 링크에 마우스를 오버할 때, 아이콘이 변경되는 것을 확인할 수 있다. 플래시를 이용하면 쉽고 빠르게 표현할 수 있는 기법이지만, CSS와 JavaScript만으로 플래시 못지 않게 부드럽게 표현한 점이 놀랍다. 플래시가 설치되지 않은 브라우저, 또는 플래시를 사용할 수 없는 텍스트 브라우저에서도 해당 텍스트와 링크를 이용할 수 있도록 배려한 점이 맘에 든다.

구글 코리아의 서비스 바로가기 아이콘에 사용된 이미지 1개

구글 코리아에서 부가 서비스 바로가기 아이콘에 사용된 이미지

1개의 배경이미지만으로 마우스가 오버될 때, Javascript로 CSS의 위치지정(position)을 바꿔주는 방법을 사용하여 부드러운 온오프 효과를 보여주고 있다. 정지된 GIF 이미지와 CSS + Javascript로도 플래시의 모션 그래픽 못지 않게 부드러운 효과를 나타낼 수 있는 것을 보여준 좋은 사례로 꼽을 수 있다. 다만, 키보드로 이동할 때를 고려하지 않은 점이 아쉽다. ㅎㅎ

이번 구글 코리아의 첫 화면 개편은 국내 웹 디자이너에게 많은 자기개발과 고민을 할 수 있는 동기를 부여했다. 시각 장애인과 같은 사람은 물론이고, 검색엔진과 같은 기계에게도 접근성 높은 사이트를 디자인하는 것이 결코 1990년대식의 초라한 웹 디자인으로 돌아가지 않아도 된다는 것을 보여줬기 때문이다.

CSS와 Javascript를 이용한 다양한 네비게이션 효과 몇개

꼬릿말1) 많은 사람들이 구글 코리아 첫 화면에 많은 이미지를 사용했다고 하는데, 시각적으로만 그럴뿐이며 실제는 3개만 사용됐다. “구글 로고, 검색 아이콘 세트, 서비스 아이콘 세트” 이렇게 3개의 이미지를 CSS의 배경 위치 변경 기법을 이용하여 여러개 처럼 보이게 한 것이다.

꼬릿말2) 사용자들은 방문한 웹 사이트가 어떻게 만들어졌는지 전혀 고민하지 않는다. 하지만 웹 개발자와 디자이너는 수많은 고민과 노력을 통해서 보다 나은 웹 사이트를 만들어가고 있다. 로딩 속도를 0.00001초라도 빠르게 하기 위해서, 시각 장애인도 접근하고 이용할 수 있도록 하기 위해서, 최고의 웹 사이트를 만들기 위해서 노력하는 그들이 진정한 챔피언이다.

플래시 네비게이션과 군용짚차

나는 군대에서 1년 동안 국방부 만화병으로, 나머지 1년 동안 연대장 당번병으로 지냈다. 국방부 파견을 마치고 연대에 돌아온 후, 1호차 운전병과 많은 시간을 함께 할 수 밖에 없었다. 일명 부대 최고 까리병사 1, 2호라 불리웠던 기억이 난다.

1호차 운전병은 작은 부대에서 1.5톤 덤프트럭을 몰던 넘인데 Back이 좋았던지 연대로 오게됐고, 이후 소형 짚차를 운전하게 되면서 불평을 많이 했다. 겨울철에 운전하면서 소형짚차가 자꾸 헛발질은 한다는 불평이었는데, 스노우체인을 열심히 감아도 산간 언덕길을 주행할땐 겁나는 일이 많다고 했다. 그러면서 하는 말이 “1.5톤 트럭은 든든한데, 짚차는 별로 믿음이 안가.” “1.5톤 트럭은 내가 운전하는 데로 움직이는데, 짚차는 조금만 핸들을 틀어도 들쑥날쑥 움직이며, 가끔 예상 범위를 넘는 행동을 한단 말야”

플래시 네비게이션에 대해서 서로 다른 많은 의견들이 있지만, 군용 소형 짚차와 같은 존재임에 분명하다. 덤프트럭을 운전하는 병사들은 날쌔고 새련된 1호차를 부러워 하지만, 막상 1호차 운전병은 덤프트럭을 그리워한다. 인식 가능한 범위를 넘는 행동(일명 톡톡 튀는 액션)으로 사용자들의 시선을 사로잡을 수 있는 플래시 네비게이션이지만, 이런 행동들은 오히려 사용자들의 경험을 거부하고 새로운 학습을 요구하는, 결론적으로 사용자 재방문율을 낮추게할 원인을 제공하기도 한다.

A라는 사이트는 화려한 플래시 네비게이션이 컨텐츠 집중도를 떨어뜨리고, B라는 사이트는 플래시 애니메이션(마우스 오버시) 네비게이션이 컨텐츠 탐색시간을 증가시킨다. 똑같은 컨텐츠를 제공하는 사이트라면, C라는 단순 텍스트 또는 이미지로 네비게이션이 구성된 사이트의 사용자 수가 많을 수 밖에 없을 것이다.

올블로그의 플래시 네비게이션

오전에 방문한 올블로그가 예전과 미묘한 차이점이 있는 것을 발견하고, 확인해보니 상단 네비게이션이 사라졌다. 흡사 구글과 같은 느낌이었는데, 어떤 이유 때문인지 올블로그 개발자가 잠시 네비게이션을 숨겨놓은 줄 알았다.

올블로그 메인 페이지

나의 상상력에 개연성이 부족한 것 같아서 다시 확인해보니, 사용중인 파이어폭스 브라우저의 웹디벨로퍼 툴바에서 자바스크립트가 꺼져 있는 것을 알 수 있었다.

파이어폭스 사용자들이 가장 많이 다운받는 플러그인 중 하나가 NO-Scipt일 정도로, 최근 웹사이트들의 극심한 자바스크립트 사용에 불만을 갖는 사람들이 많다. 나 역시도 Ajax로 도배된 사이트를 방문할 땐 자바스크립트를 끄는 편이다.

이때문에 플래시 네비게이션이 제대로 작동하지 않는 것은 단순히 사용자들의 잘못이 아니라 개발자들의 잘못이다.

  • 플래시를 사용하여 네비게이션을 제작한 문제 – object 태그 안에서 ul, li 등으로 별도의 네비게이션을 제공할 수 있다.
  • 자바스크립트를 네비게이션에 사용한 문제 – nopscript를 이용하여 ul, li 등으로 별도의 네비게이션을 제공할 수 있다.

결국, IE의 설계 변경에 따른 플래시 네비게이션을 자바스크립트 꽁수로 대처하는 방법에 문제가 있음을 알 수 있다. noscript 태그의 사용법과 대체 네비게이션 제공이라는 웹 접근성의 기본을 명시하지 않은 점이다.

우리가 명심해야 할 것은 장애인만이 웹 접근성의 수혜자는 아니라는 사실이다.

독특한 구성의 웹사이트

2페이지에 여러 단으로 구성된 출판만화들은 웹브라우저로 보는데 불편하다. 오히려 마린블루스강풀의 순정만화처럼 1라인/1단 구성의 만화들이 보는데 편하다.

morellc

레이아웃의 전형적인 틀을 깬 웹사이트가 있다. 기존에 이와 비슷한 실험적인 시도를 한 사이트들을 몇 군데 봤었지만, 이곳은 실험적이다라는 생각이 전혀 들지 않는다. 오히려 벤치마킹 대상이 되기에 부족함이 없어 보인다.

http://www.morellc.com/ 이라는 사이트인데, 메뉴항목을 클릭하면 다음페이지로 넘어가는 방식이 독특하다. 몇년전에 엄청 유행했다가, 이제는 플래시 네비게이션의 한 분류로 자리잡은 바니네비게이션을 보는 것 같다.

자바스크립트 네비게이션

CSS를 주로 다루는 사이트는 웹페이지의 네비게이션를 제작할 때, 당연히 CSS로 표현하라고 권한다. 어쩔 수 없는 경우에는 자바스크립트를 사용하라고 한다. 플래시에 대한 언급은 거의 없다.

CSS Reboot에 소개되어 있는 사이트들을 구경하던 중, 심플한 디자인의 Monolinea이 눈에 들어왔다. 다이나믹한 네비게이션을 플래시가 아닌 자바스크립트를 이용하여 표현하고 있었다.

국내 사이트들의 경우에는 대부분의 사이트들이 플래시로 네비게이션으로 표현한다. 이 사이트를 보기 전까지만 해도, 다이나믹한 네비게이션은 플래시로만 만드는 줄 알았다. 물론 자바스크립트 콘솔로 확인해보니 몇몇 에러와 1개의 경고가 나오긴 하지만, 자바스크립트로 흔히 볼 수 있는 플래시 네비게이션과 흡사하게 표현할 수 있다는 점이 놀라울 뿐이다.

사이트를 둘러보면, 비단 네비게이션 뿐만 아니라 이미지 블러/알파 등 여러 부분에서 자바스크립트 만으로 다양한 효과를 나타내고 있다.

자바스크립트와 같은 프로그래밍에 개념이 부족한 나만 이렇게 신기한 걸까? 어쨓든 놀랍고 신기한 건 사실이다.


Be Friend~! Be Friend~!