자바스크립트로 작성한 움직이는 내비게이션
콩바구니(이)가 2009년 February 2일에 작성함. 분류: XHTML, 창작.이번에 만든것은 , 자바스크립트로 만든 움직이는 내비게이션 입니다.
보통 내비게이션을 움직이게 하기 위해서 플래시를 사용하곤 하는데, 플래시를 사용할 경우 접근성에 문제가 생기기때문에 저는 그방법이 별로 좋지않은 방법이라고 생각합니다. 키보드만으로 접근이 불가능 하다거나, 특정 OS 에서 제대로 작동하지 않거나, 특정 브라우저(익스플로러)에서만 정상 작동하거나. 그런 문제가 생깁니다.
HTML
우선 HTML 파일에서, 움직이게 하고자 하는 메뉴의 마크업에 id 와 class 를 정해서 적어줍니다. id와 class는 임의로 정합니다. 예문에는 id를 navigation 이라고 적었는데, mainMenu 도 좋고, menu 도 상관없습니다. 무었이든 좋습니다. (id와 class는 대소문자 구별 하고, 첫글자는 반드시 영문자 알파뱃이여야 한다는 것만 알면 됩니다. 특수문자나 숫자는 class 나 id 의 첫글자가 될수 없습니다.)
- <!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”>
- <head>
- <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
- <title>움직이는 내비게이션</title>
- </head>
- <body>
- <div id=”navigation”>
- <ul>
- <li class=”link1″><a href=”#”>link 1</a></li>
- <li class=”link2″><a href=”#”>link 2 </a></li>
- <li class=”link3″><a href=”#”>link 3</a> </li>
- <li class=”link4″><a href=”#”>link 4 </a></li>
- </ul>
- </div>
- <ul>
- </body>
- <div id=”navigation”>
- </html>
- <head>
메뉴부분의 마크업은, class 와 ID 를 적어주는것만으로 족합니다. 인라인스크립트(<li onclick = “함수이름;”> 같은것) , 인라인스타일(<li style=”color:#f00;”>같은것)은 전혀 필요 업습니다. 제가 작성하는 웹문서는 구조(html)와 표현(CSS), 동작(javascript)을 완전히 분리하거든요.
이파일을 사파리에서 열어보면 다음과 같이 나옵니다.

Stylesheet
HTML 파일에서 정한 id와 class를 이용하여 CSS를 작성합니다. CSS 를 HTML 안에 넣기도 합니다만, 따로 작성하여 그파일을 링크거는것이 좋습니다.
- <head>
- <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
- <title>움직이는 내비게이션</title>
- <link rel=”stylesheet” href=”style.css” media=”all” type=”text/css”/>
- </head>
HTML 파일의 <head>부분에 작성할 CSS 파일의 링크를 걸어두고, CSS파일을 작성합니다.
- @charset “utf-8″;
- /* CSS Document */
- #navigation ul{
- list-style:none;
- padding:0;
- border:1px solid #ccc;
- overflow:hidden;
- }
- #navigation li{
- float:left;
- width:50px;
- overflow:hidden;
- height:100px;
- background:#eee;
- }
- #navigation li:hover {
- width:100px;
- }
- #navigation a{
- display:block;
- width:100%;
- height:100%;
- padding:5px;
- }
- #navigation a:hover {
- background:#000;
- color:#fff;
- }
CSS 적용결과는 다음과 같습니다.

이 메뉴에 마우스가 올라가면,

이렇게 변합니다.
조금 썰렁한가요? CSS를 이용하면 좀더 화려하게 꾸밀수 있습니다. 하지만 여기서는 여기까지만 하렵니다.
Javascript
자바스크립트를 작성하기에 앞서, HTML 의 HEAD 부분에 다음을 추가합니다.
- <head>
- <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
- <title>움직이는 내비게이션</title>
- <script type=”text/javascript” src=”java.js” ></script>
- <link rel=”stylesheet” href=”style.css” media=”all” type=”text/css”/>
- </head>
그리고 java.js 를 작성합니다.
- // JavaScript Document
- function addLoadEvent(func) {
- var oldonLoad = window.onload;
- if (typeof window.onload != ‘function’) {
- window.onload = func;
- } else {
- window.onload = function(){
- oldonLoad();
- func();
- }
- }
- }
- addLoadEvent(animationLoad);
- function animationLoad(){
- animationNavigation(“navigation”,60,150,100);
- }
- function animationNavigation(id,minW,maxW,speed){
- if (!speed) speed = 100;
- if (!document.getElementById(id))return false;
- var top_el = document.getElementById(id);
- var li_el = top_el.getElementsByTagName(“li”);
- for (var i=0;i<li_el.length;i++){
- if (minW) {li_el[i].width = minW;} else {li_el[i].width = 17;}
- li_el[i].status = “normal”;
- li_el[i].minWidth = li_el[i].width;
- if (maxW) {li_el[i].maxWidth =maxW} else {li_el[i].maxWidth = 100;}
- li_el[i].style.width = li_el[i].width+”px”;
- li_el[i].id = id+”_”+i;
- li_el[i].onmouseover = function (){
- this.status = “up”;
- animationNavigation_widthPlus(this.id,speed)
- }
- li_el[i].onmouseout = function (){
- this.status = “down”;
- animationNavigation_widthMinus(this.id,speed)
- }
- }
- }
- function animationNavigation_widthPlus(id,speed){
- if (!document.getElementById(id))return false;
- var item_el = document.getElementById(id);
- if (item_el.status!=”up”) return false;
- item_el.width = item_el.width + Math.ceil((item_el.maxWidth-item_el.width)/2);
- item_el.style.width = item_el.width + “px”;
- if (item_el.width < item_el.maxWidth) {
- this.timeout = setTimeout(‘animationNavigation_widthPlus(“‘+id+’”);’,speed);
- }
- }
- function animationNavigation_widthMinus(id,speed){
- if (!document.getElementById(id))return false;
- var item_el = document.getElementById(id);
- if (item_el.status!=”down”) return false;
- item_el.width = item_el.width – Math.ceil((item_el.width-item_el.minWidth)/2);
- item_el.style.width = item_el.width + “px”;
- if (item_el.width > item_el.minWidth) {
- this.timeout = setTimeout(‘animationNavigation_widthMinus(“‘+id+’”);’,speed);
- }
- }

이제 내비게이션이 움직입니다.