GNB
Aug14 0 Filed under: html/css, script Author: leeyunhan기본적인 글로벌 네비게이션
javascript
var _d = document;
function getClass(classname, tagname, tarID) {}
function addClass(element,value) {}
function removeClass(element,value) {}
var gnbNavi = function(gnbID, currentNum, subCurrentNum, noscript){
var wrapper = _d.getElementById(gnbID);
if (noscript) removeClass(wrapper,noscript); // 스크립트가 로딩되면 wrapper의 class중 'noscript'를 삭제합니다.
var menu = getClass('depth1','li',wrapper);
var menuLink = []; // 이벤트를 발생시킬 대메뉴의 a들
var submenu = []; // 대메뉴의 하위에 위치한 ul들
var submenuLink = []; // 서브메뉴의 a들
var initialize = function(){
for (var i=0; i<menu.length; i++){
menuLink[i] = menu[i].getElementsByTagName('a')[0];
submenu[i] = menu[i].getElementsByTagName('ul')[0];
if(submenu[i] == undefined){
submenu[i] = null;
}
if(submenu[i]) submenu[i].style.visibility = 'hidden'; // 서브메뉴 'hidden'초기화
showSubmenu(i); // 마우스 이벤트에 서브메뉴 show / hide
}
if (currentNum) menuLink[currentNum-1].onmouseover(); // 대메뉴 활성화
};
var showSubmenu = function(num){
menuLink[num].onmouseover = menuLink[num].onfocus = function(){
for(var i=0; i<menu.length; i++){
var imgEl = menuLink[i].getElementsByTagName('img')[0];
if(i == num){
if (menu[i].className.indexOf('visible') == -1) addClass(menu[i],'visible'); // 활성화 된 메뉴에 class추가
if (imgEl && imgEl.src.indexOf('_on.gif') == -1) imgEl.src = imgEl.src.replace('.gif', '_on.gif'); // 대메뉴 이미지 오버
if(submenu[i]) {
submenu[i].style.visibility = 'visible';
subImgOver(i); // 보여지는 서브메뉴의 메뉴들에게 이벤트를 지정
}
} else {
removeClass(menu[i],'visible');
if (imgEl) imgEl.src = imgEl.src.replace('_on.gif', '.gif');
if(submenu[i]) {
submenu[i].style.visibility = 'hidden';
}
}
}
}
};
var subImgOver = function(num){
submenuLink = submenu[num].getElementsByTagName('a');
for(var i=0; i<submenuLink.length; i++){
submenuLink[i].onmouseover = function(){
var imgEl = this.getElementsByTagName('img')[0];
if (this.className.indexOf('on') == -1) addClass(this,' on');
if (imgEl && imgEl.src.indexOf('_on.gif') == -1) imgEl.src = imgEl.src.replace('.gif', '_on.gif');
}
submenuLink[i].onmouseout = function(){
var imgEl = this.getElementsByTagName('img')[0];
removeClass(this,'on');
if (imgEl) imgEl.src = imgEl.src.replace('_on.gif', '.gif');
}
if (subCurrentNum && num == (currentNum - 1)) { // 서브메뉴 활성화가 지정된 경우 && 현재 보여지는 서브메뉴가 활성화된 대메뉴 일 경우
var subCurrentMenu = submenuLink[subCurrentNum - 1];
if(!subCurrentMenu) return;
var subCurrentImage = subCurrentMenu.getElementsByTagName('img')[0];
if(subCurrentMenu.className.indexOf('on') == -1) addClass(subCurrentMenu,' on');
if (subCurrentImage && subCurrentImage.src.indexOf('_on.gif') == -1) subCurrentImage.src = subCurrentImage.src.replace('.gif', '_on.gif');
subCurrentMenu.onmouseout = function(){
return false;
}
}
}
}
initialize();
}
hml
<div id="gnbmenu" class="noscript">
<ul>
<li class="depth1">
<a href="#">menu01</a>
<ul class="depth2"><li><a href="#">menu0101</a></li></ul>
</li>
<li class="depth1">
<a href="#">menu02</a>
<ul class="depth2"><li><a href="#">menu0201</a></li></ul>
</li>
<li class="depth1">
<a href="#">menu03</a>
</li>
<li class="depth1">
<a href="#">menu04</a>
<ul class="depth2">
<li><a href="#">menu0401</a></li>
</ul>
</li>
<li class="depth1">
<a href="#">menu05</a>
<ul class="depth2">
<li><a href="#">menu0501</a></li>
</ul>
</li>
<li class="depth1">
<a href="#">menu06</a>
</li>
</ul>
</div>
<script type="text/javascript">
//<![CDATA[
// gnbNavi(대메뉴ID명, 대메뉴 활성화, 서브메뉴 활성화, js로딩시 제거할 class명);
gnbNavi('gnbmenu',1,2,'noscript');
//]]>
</script>
- 활성화 된 대메뉴에 ‘visible’ class 추가
- 대메뉴, 서브메뉴에 이미지인 경우 “~.gif”, “~on.gif”로 이미지 변환
- 활성화 된 대메뉴, 서브메뉴 지원 (currentNum, subCurrentNum)
- getClass(), addClass(), removeClass(); 함수 사용
- 서브메뉴 각각의 위치는 css등 이용 권장
- js로딩시 gnbID의 class값 제거 : js없을경우 별도의 디자인 view 가능

Leave a reply