3단메뉴?
본문
답변 6
제홈에 쓸것을 날림으로 만든거라
소스가 많이 지저분하지만 리스트 (UL, LI )만 제대로 쓴다면
하부메뉴는 원하는 만큼 쓸수 있습니다
다만 자바스크립트와 CSS 쪽이 말그대로 임시로 막 만든거라 추후에 손을 볼 것이며
그때 개발자 팁란(자바스크립트 쪽이나 그누보드 팁란)에 올릴것이니 그후 변경하시면 될것입니다
function memuCALL(){
sublist("topMenuDIV")
}
위의 함수중 사용하고자 하는 메뉴의 아이디를 기입하시면 됩니다
메뉴의 하부 구조는 리스트 안에서 자식 UL을 통한 리스트로 2차 메뉴가 생성되고
그 리스트의 원하는 부분에 다시 UL을 통한 리스트로 3차로 이어집니다
<style>
ul{
margin : 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
list-style:none;
}
ol{
margin : 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
list-style:none;
}
li{
margin : 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
list-style:none;
}
#topMenuDIV a:link{
text-decoration:none;
}
#topMenuDIV{/* 상단 주메뉴 자리 */
float :left;
margin : 0px 0px 0px 0px;
padding : 0px 0px 0px 0px;
width:auto;
min-height:30px;
font-family:굴림,돋움,verdana,tahoma, Arial,Helvetica,Sans-Serif;
font-size:9pt;
letter-spacing:-1px;
text-decoration:none;
color:#F4F4F4;
line-height:120%;
font-weight:bold;
}
.btLEFT{
border-left : 2px solid #8D8989;
margin : 0px 0px 0px 0px;
padding : 0px 0px 0px 0px;
width:1px;
min-height:36px;
}
.btRIGHT{
border-right : 2px solid #8D8989;
margin : 0px 0px 0px 0px;
padding : 0px 0px 0px 0px;
width:1px;
min-height:36px;
}
/* 팝업 메뉴 디자인 */
.topMenu{/* 1차 메뉴 총 높이 */
width:auto;
min-height:30px;
margin : 4px 4px 0px 4px;
padding : 0px 0px 0px 0px;
border : 2px solid #342e2e;
background-color: #261b1b;
box-shadow: 2px 2px 10px #888888;
display : inline-block;
}
#topMenuDIV .topMenu li{
width:90px;/* 1차 메뉴 간격 넓이 */
float: left;
margin : 11px 0px 0px 0px;
padding : 0px 5px 0px 5px;
height:12px;
text-align:center;
border-right : 2px solid #fff;
}
#topMenuDIV .topMenu ul{ /* */
box-shadow: 3px 3px 15px #888888;
}
#topMenuDIV .topMenu li ul{ /* 하부 메뉴를 ul에 담는다 넓이 폰트 */
display:none;
position:relative;
left:0px;
top: 10px;
z-index:auto;
width:200px;
height:auto;
margin : 0px;
padding : 0px;
background-color: #ddd;
border-top : 1px solid #ccc;
font-family:NanumGothic, 나눔고딕,새굴림,돋움,verdana,tahoma, Arial,Helvetica,Sans-Serif;
font-size:9pt;
text-decoration:none;
color:#F4F4F4;
line-height:120%;
font-weight:normal;
letter-spacing:1px;
box-shadow: 3px 3px 15px #888888;
}
#topMenuDIV .topMenu li ul li{/* 하부 메뉴 개당 높이 넓이 폰트 */
margin : 0px 0px 0px 0px;
padding : 0px 0px 5px 0px;
width:198px;
height:25px;
line-height:250%;
background-color: #4B4242;
border-right : 1px solid #ccc;
border-left : 1px solid #ccc;
border-bottom : 1px solid #ccc;
float: left;
}
#topMenuDIV a:link { color: #fff; }/* 링크가 걸린 방문하지 않은 상태*/
#topMenuDIV a:visited { color: #fff; }/*링크 걸린 방문한 상태 */
#topMenuDIV a:active { text-decoration: none; color: #fff; }
#topMenuDIV a:hover { text-decoration: none; color: #E5D85C;}/*마우스 올렸을 때 상태 */
#topMenuDIV li ul li a:hover { text-decoration: none; color: #000;font-weight:bold; background-color: #ccc; }/*마우스 올렸을 때 상태 */
.topMenu li ul a,.topMenu li ul li a{/* a링크에 넓이를 줄려면 인라인 블럭 처리를 해야함 */
margin : 0px 0px 0px 0px;
padding : 5px 0px 0px 0px;
display:inline-block;
width:198px;
height:25px;
text-align:center;
line-height:25px;
font-size:12px;
}
.adminEDIT{
float: left;
width:100px !important;
height:12px !important;
margin : 0px !important;
padding : 10px 10px 5px 10px !important;
border-right : 0px solid #8D8989 !important;
}
</style>
<script>
/******************************************************
* 엘레먼트 아이디를 간략하게 *
******************************************************/
function $ID(obj){
var element="";
if(obj==""){
return false;
}
else{
element= document.getElementById(obj);
return element;
}
}
/* 온로드후 실행 함수 자주쓰기에 구분을 주기 위해 이벤트 함수를 똑 같이 하나 더 만듬*/
function onLoad_Event(fucName){
if(window.addEventListener){ // firefox
window.addEventListener("load",fucName,false);
} //end firefox
else{ // IE
window.attachEvent("onload",fucName);
} //end IE
}
/* 메뉴 */
/*주의 사항 : 구분자를 이용해서 메뉴 팝업을 만들기에 메뉴의 아이디, 클라스에 언더바가 있으면 안됨 */
var ofenMenuSUBJECT="";
var ofenMENU_DIV="";
function sublist(subID){
if(!$ID(subID)){
alert("지정한 "+subID+"의 아이디를 가진 객체를 찾을수 없습니다");
return false;
}
var tags = "";
tags = $ID(subID).childNodes;
var tag_len = tags.length;
var s=1;
var onmenu="true";
for(var i=0; i<tag_len; i++) {
menu=tags[i];
if(menu.nodeType==1){
if(menu.nodeName=="UL"||menu.nodeName=="A"){
if(menu.nodeName=="UL"){
menu.id=subID+"_"+s;
coverID=menu.id;
}
else
if(menu.nodeName=="A"){
menu.id=subID+"_"+"A";
coverID=menu.id;
//아래 부분은 따로 함수로 빼서 재 사용하는데 지장 없도록 할것
$ID(menu.id).onmouseover=function(event){
linkID=this.id; //현재 마우스가 놓여진 링크 걸린 제목의 아이디 [ 노드검사를 링크(A) 로 검사해서 들어왔기 때문 ]
mouseonLIST = this.id.split("_A")[0];// 마우스가 놓여진 곳의 리스트 아이디
mouseonLIST_len= mouseonLIST.split("_").length;
var nowMenuDEP_number=parseInt(mouseonLIST_len/2); // 메뉴의 깊이 1차,2차,3차 메뉴
split_len= this.id.split("_").length;
linkID_targetUL = this.id.split("_A")[0]+"_1";
now_ofen_subMenu = ofenMenuSUBJECT.split("_A")[0]+"_1";
//열려진 서브 메뉴가 있는지 검사해서 현재 있는 곳의 링크와 같다면 (같은 그룹이면 )그대로 두고 그렇지 않으면 닫는다
if(ofenMenuSUBJECT!="" && ( $ID(now_ofen_subMenu) && $ID(now_ofen_subMenu).style.display=="inline-block")){
ofenMENU_DIV_len = ofenMENU_DIV.split("|").length;
var ofenMENU_DIV2 = ofenMENU_DIV.split("|");
var rename="";// 닫을 메뉴명을 빼기 위한 장치
for(i=0;i<ofenMENU_DIV_len;i++){
if($ID(ofenMENU_DIV2[i])){
mouseonLIST_len1= ofenMENU_DIV2[i];
mouseonLIST_len2= mouseonLIST_len1.split("_").length;
var nowMenuDEP_number2=parseInt(mouseonLIST_len2/2);
// 닫을 메뉴명을 빼기 위한 장치
if(i>0){
rename+=ofenMENU_DIV2[i-1]+"|";
}
if(nowMenuDEP_number<nowMenuDEP_number2){
//현재 선택한 곳이 상위 그룹이라면 연관되지 않은 하위 그룹을 닫는다
if($ID(ofenMENU_DIV2[i])){
$ID(ofenMENU_DIV2[i]).style.display="none";
//그룹을 닫고 해당 네임을 지운다
// 닫을 메뉴명을 빼기 위한 장치
ofenMENU_DIV=rename;
}
}
}//$ID(ofenMENU2[i])
}//end for
if(nowMenuDEP_number==1){ // 다른 메뉴로 넘어갔기에 1차 메뉴에 귀속된 모든 메뉴를 닫는다
ofenMENU_DIV="";
}
}//열려진 서브 메뉴가 있는지 검사해서 현재 있는 곳의 링크와 같다면 (같은 그룹이면 )그대로 두고 그렇지 않으면 닫는다
//서브 메뉴가 있다면 연다
if($ID(linkID_targetUL)){
//마우스 오버된 곳의 서브 메뉴를 열고 기록한다
$ID(linkID_targetUL).style.display="inline-block";
ofenMENU_DIV+=linkID_targetUL+"|";//현재 열려진 서브메뉴 팝업창의 아이디를 배열로 저장
}
/**************************************
* 팝업의 스타일을 지정 *
**************************************/
if($ID(linkID_targetUL)){
//첫번째 1차 메뉴라면
if(nowMenuDEP_number==1){
ofenMenuSUBJECT=linkID;
// 익스7에서 포지션 위치 계산이 틀림
//elementLeft=parseInt($ID(this.id.split("_A")[0]).offsetLeft);
//elementTop= parseInt($ID(this.id.split("_A")[0]).offsetTop)+parseInt($ID(this.id.split("_A")[0]).offsetHeight)+10;//리스트를 10으로 잡아놔서 바로 밑에 달라붙어서 여유를 줌
var cssName=$ID(linkID_targetUL).className;
//alert(document.getElementsByClassName(cssName)[0].style.margin);
$ID(linkID_targetUL).style.margin="-5px 0px 0px -5px"; // 분기 아래에 뒀던걸 위로 올림
//$ID(linkID_targetUL).style.margin= $ID(this.id.split("_A")[0]).style.margin;
}
else{ // 숨겨진 2차메뉴들의 위치
elementLeft=parseInt($ID(this.id.split("_A")[0]).offsetLeft)+parseInt($ID(this.id.split("_A")[0]).offsetWidth)-10;//+45;
elementTop= parseInt($ID(this.id.split("_A")[0]).offsetTop)-1;
$ID(linkID_targetUL).style.position="absolute"; // 분기 아래에 뒀던걸 위로 올림
$ID(linkID_targetUL).style.left=elementLeft+"px";
$ID(linkID_targetUL).style.top=elementTop+"px";
}
}
return false;
}//end $ID(menu.id).onmouseover;
$ID(menu.id).onmouseout=function(event){
linkID=this.id;
linkID_targetUL=this.id.split("_A")[0]+"_1";
if($ID(linkID_targetUL)){
//
}
return false;
}
/**************************************
* 클릭으로 닫기 *
**************************************/
document.onclick=function(){
ofenMENU_DIV_len = ofenMENU_DIV.split("|").length;
var ofenMENU_DIV2 = ofenMENU_DIV.split("|");
for(i=0;i<ofenMENU_DIV_len;i++){
if($ID(ofenMENU_DIV2[i])){
$ID(ofenMENU_DIV2[i]).style.display="none";
}
}//end for
ofenMENU_DIV="";
// return false; //링크가 있으므로 사용할때는 닫아줄것
}
//윗 부분은 따로 함수로 빼서 재 사용하는데 지장 없도록 할것
}//menu.nodeName=="A"
//자식 노드가 있을 경우만 불러들이도록 할것 스택 오류날수 있음
sublist2(coverID);
}
else
if(menu.nodeName=="LI"){//이곳 호출 안됨
if(!menu.id)menu.id="LIsub"+i;
coverID=menu.id;
sublist2(coverID);
}
else{
// continue;
}
}
}
}
function sublist2(subID){
var tags = "";
tags = $ID(subID).childNodes;
var tag_len = tags.length;
var s=1;
for(var i=0; i<tag_len; i++) {
menu=tags[i];
if(menu.nodeType==1){
if(menu.nodeName=="UL"){
menu.id=subID+i;
coverID=menu.id;
//자식 노드가 있을 경우만 불러들이도록 할것 스택 오류날수 있음
sublist(coverID);
}
else
if(menu.nodeName=="LI"){//써브 없는 리스트
if(!menu.id)menu.id=subID+"_"+s;
s++;
coverID=menu.id;
/*****************************************
* 서브 메뉴가 있으면 화살표 표시 *
*****************************************/
//자식 노드 중에 ul이 폼함 되어 있으면
tagUL = $ID(coverID).childNodes[2];
if(tagUL){
if(tagUL.nodeName=="UL" ){
split_len= coverID.split("_").length;
//첫번째 1차 메뉴라면
if(split_len>4){
//해당 리스트에 입혀짐
var arrowGIF = document.createElement("SPAN");
//arrowGIF.id = rollinOneNewsID+num;
arrowGIF.innerHTML = "▶";//<img src=\"reading.gif\">
arrowGIF.style.margin = "0px 0px 0px 0px";
arrowGIF.style.padding = "0px 0px 0px 0px";
// arrowGIF.style.width = "100%";
arrowGIF.style.height = "23px";//15pxlistH+"px";//
// arrowGIF.style.fontFamily = "굴림,돋움";
// arrowGIF.style.fontSize = "9pt";
// arrowGIF.style.lineHeight = "100%";//120%
arrowGIF.style.position = "absolute";//120%
arrowGIF.style.right = "15px";//120%
//arrowGIF.style.top = "5px";//120%
arrowGIF.style.color = "#787474";
$ID(coverID).appendChild(arrowGIF); //만들어진 ul에 자식 노드로 넣는다
}
}
}
/*****************************************
* 서브 메뉴가 있으면 화살표 표시 *
******************************************/
sublist(coverID);
}
else{
// continue;
}
}
}
}
/* 메뉴 */
//메뉴가 들얼간 div의 명칭만 안에 넣으면 됨
function memuCALL(){
sublist("topMenuDIV")
}
// 문서 로드후 메뉴 띄우기
onLoad_Event(memuCALL);
</script>
--------------------------- 메뉴 ------------------
<div id="mainMENU_containner">
<link rel="stylesheet" href="menu_style.css" title="style" media="all" />
<div id="topMenuDIV">
<h2 style="display:none;"></h2>
<UL class="topMenu">
<li class="topMenu_LI"><a href="/">홈</a></li>
<li class="topMenu_LI"><a href="/community/">커뮤니티</a>
<ul class="topMenu_UL">
<li class="topMenu_LI"><a href="/notice/">공지사항</a></li>
<li class="topMenu_LI"><a href="/free/">자유게시판</a></li>
<li class="topMenu_LI"><a href="/qanda/">질문 게시판</a></li>
<li class="topMenu_LI"><a href="/study/">스터디</a>
<ul class="topMenu_UL">
<li class="topMenu_LI"><a href="/js_study/">자바스크립트</a></li>
<li class="topMenu_LI"><a href="/php_study/">html 기초</a></li>
<li class="topMenu_LI"><a href="/html_study/">php 기초</a></li>
<li class="topMenu_LI"><a href="/html_study2/">5차메뉴</a>
<ul class="topMenu_UL">
<li class="topMenu_LI"><a href="/php_study2/">php 기초2</a></li>
</ul>
</li>
</ul>
</li>
<li class="topMenu_LI"><a href="/test_board/">테스트 게시판</a></li>
</ul>
</li>
<li class="topMenu_LI"><a href="/marihome/">마리홈</a>
<ul class="topMenu_UL">
<li class="topMenu_LI"><a href="/mari_history/">마리홈 개발</a></li>
</ul>
</li>
<li class="topMenu_LI"><a href="/guest/">방명록</a></li>
<li class="topMenu_LI"><a href="/community2/">다운로드</a></li>
<li class="topMenu_LI"><a href="/portfolio/">메뉴</a></li>
<li class="adminEDIT">관리자</li>
</UL>
</div>
</div>
정적인 메뉴는 그냥 작업하면 되겠고
그누보드하고 동적연동하시려면 php단에서 작업을 좀 해주셔야 할거예요.
지원 안하면 답이 없어요. 바트빌더에는 그렇게 되도록 만들었었는데 그누보드메뉴생성기가 생기는바람에 빌더개발 때려치움 ㅜㅜ
잘되신다니 다행이네요
제가 사용하는 프로그램에 맞춰서 급하게 만들어 놓은거라 고쳐야 할곳이 있긴하지만
표현하는데 크게 문제는 없어 보이더라구요
그누보드5용으로 3단이상 지원되는 메뉴 구조를 파악중에 있습니다
필드를 서너개 추가해야하지만 표현은 되더라구요
좀 볼만하다 싶으면 자료 올리고 쪽지 드릴께요 :)
g5를 사용하시는 거라면 문제없이 사용하실수 있을거 같고
수정된 사항이 어떠한 상황인지는 몰라도 구조라는게 비슷 비슷하거든요
게시판에서 원보글 밑에 답글 달리고 그아래에 계속 답글 달리지만
글번호가 틀어지지 않듯이
메뉴 깊이 구조도 게시판 글 구조마냥 불러서 정렬하는 것이라
아주 특이하게 메뉴를 불러다 쓰는 형식이 아닌 수정본이라면 가능할겁니다
다만 소스 g5 밖에 제가 설치한게 없어서 거기에 준해서 만드는거니 수정본을 사용하신다면
거기에 맞게 튜닝만 하면 될거예요 :)
일단 만들고 내어 놓아서 이상 없으면 일산사랑님 홈에 맞게 튜닝해 드리겠습니다