最近由於項目需要一個簡單的多級下拉菜單菜單但是由於業務和樣式上的要求,為了簡潔,在網上找了很多導航菜單控件都不大適合,所以突發奇想自己寫個吧~該動手就動手啊~
HTML部分
復制代碼 代碼如下:
<h2>
SuperFish</h2>
<ul class="nav" hid="root">
<li><a href="javascript:void(0)" testid="aa">一級li 1</a>
<ul>
<li><a href="javascript:void(0)" testid="bb">二級 li 1</a></li>
<li><a href="javascript:void(0)" testid="cc">二級 li 2</a>
<ul>
<li><a href="javascript:void(0)" testid="dd">三級 li 1</a></li>
<li><a href="javascript:void(0)" testid="ee">三級 li 2</a></li>
<li><a href="javascript:void(0)" testid="ff">三級 li 3</a></li>
<li><a href="javascript:void(0)" testid="gg">三級 li 4</a></li>
<li><a href="javascript:void(0)" testid="hh">三級 li 5</a></li>
<li><a href="javascript:void(0)" testid="ii">三級 li 6</a>
<ul>
<li><a href="javascript:void(0)" testid="jj">四級 li 1</a></li>
<li><a href="javascript:void(0)" testid="kk">四級 li 2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="ll">二級 li 3</a>
<ul>
<li><a href="javascript:void(0)" testid="mm">三級 li 6</a></li>
<li><a href="javascript:void(0)" testid="nn">三級 li 7</a></li>
<li><a href="javascript:void(0)" testid="oo">三級 li 8</a></li>
<li><a href="javascript:void(0)" testid="pp">三級 li 9</a></li>
<li><a href="javascript:void(0)" testid="qq">三級 li 10</a></li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="rr">二級 li 4</a>
<ul>
<li><a href="javascript:void(0)" testid="ss">三級 li 11</a></li>
<li><a href="javascript:void(0)" testid="tt">三級 li 12</a></li>
<li><a href="javascript:void(0)" testid="uu">三級 li 13</a></li>
<li><a href="javascript:void(0)" testid="vv">三級 li 14</a></li>
<li><a href="javascript:void(0)" testid="ww">三級 li 15</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="xx">一級li 2</a>
<ul>
<li><a href="javascript:void(0)" testid="ss">二級 li 11</a></li>
</ul>
</li>
</ul>
Javascript部分
復制代碼 代碼如下:
<script language="javascript" type="text/javascript">
var navigationBar = function () {
//使用時將testid屬性換成href屬性即可
var currentUrlHref = "jj";
var root = $("ul[hid='root']");
$(root).find(">li").attr("first_level", true);
$(root).find(">li>a").addClass("nav_first_style");
//遞歸向下查找可展開元素並且綁定toggle展開事件
var searchChildren = function (root) {
if (root.find(">li").length > 0) {
$(root).addClass("ul_style");
var liChildren = root.find(">li");
$(liChildren).each(function (idx, item) {
searchChildren($(item));
})
} else if (root.find(">ul").length > 0) {
$(root).addClass("li_style");
if ($(root).attr("first_level") != true.toString()) {
$(root).find(">a").addClass("li_style_a");
}
var aLink = $(root).find(">a");
//初始裝載的時候判斷當前url是不是和導航欄中的東西匹配
if (currentUrlHref == $(aLink).attr("testid")) {
findInitPosition(aLink);
}
$(aLink).toggle(function () {
$(this).addClass("li_style_a_selected");
$(this).parent().find(">ul").show("fast");
//隱藏非一級節點下的所有兄弟元素
if ($(this).parent().attr("first_level") != true.toString()) {
$(this).parent().siblings().find(">a").removeClass("li_style_a_selected");
$(this).parent().siblings().each(function (idx, item) {
removeClassAndHide(item);
})
} else {
$(this).addClass("nav_first_style_selected");
$(this).removeClass("li_style_a_selected");
$(this).parent().siblings().find(">a").removeClass("nav_first_style_selected");
$(this).parent().siblings().each(function (idx, item) {
removeClassAndHide(item);
})
}
}, function () {
if ($(this).parent().attr("first_level") == true.toString()) {
$(this).addClass("nav_first_style_selected");
$(this).parent().siblings().find(">a").removeClass("nav_first_style_selected");
}
removeClassAndHide($(this).parent());
})
var ulChildren = root.find(">ul");
$(ulChildren).each(function (idx, item) {
$(item).hide();
searchChildren($(item));
});
} else {
if ($(root).attr("first_level") != true.toString()) {
$(root).find(">a").addClass("li_style_a");
}
$(root).addClass("li_style");
$(root).click(function () {
if ($(root).attr("first_level") != true.toString()) {
$(this).find(">a").addClass("li_style_a_selected");
$(this).siblings().find(">a").removeClass("li_style_a_selected");
$(this).siblings().each(function (idx, item) {
removeClassAndHide(item);
addFirstLevelClass(item);
})
} else {
$(this).find(">a").addClass("nav_first_style_selected");
$(this).find(">a").removeClass("li_style_a_selected");
$(this).siblings().find(">a").removeClass("nav_first_style_selected");
removeClassAndHide(this);
}
})
if (currentUrlHref == $(root).find(">a").attr("testid")) {
findInitPosition($(root).find(">a"));
}
}
}
//遞歸查找初始位置
var findInitPosition = function (aLink) {
var currentLi = $(aLink).parent();
if ($(currentLi).parent().parent().find(">a").length > 0) {
findInitPosition($(currentLi).parent().parent().find(">a"));
}
if ($(currentLi).find(">ul").length > 0) {
$(currentLi).find(">ul").show("fast");
}
if ($(currentLi).attr("first_level") != true.toString()) {
$(currentLi).find(">a").addClass("li_style_a_selected");
} else {
$(currentLi).find(">a").addClass("nav_first_style_selected");
}
}
//遞歸向下刪除所有子節點的選中樣式
var removeClassAndHide = function (li) {
if ($(li).attr("first_level") != true.toString()) {
$(li).find(">a").removeClass("li_style_a_selected");
$(li).find(">ul").hide("fast");
if ($(li).find(">ul").length > 0) {
$(li).find(">ul>li").each(function (idx, item) {
removeClassAndHide(item);
});
}
} else if ($(li).attr("first_level") == true.toString()) {
$(li).find(">ul").hide("fast");
$(li).find(">ul>li").each(function (idx, item) {
removeClassAndHide(item);
})
} else {
$(li).find(">ul").show("fast");
$(li).find(">ul>li").each(function (idx, item) {
removeClassAndHide(item);
})
}
}
//遞歸向上添加第一層節點樣式
var addFirstLevelClass = function (li) {
if ($(li).attr("first_level") != true.toString()) {
addFirstLevelClass($(li).parent().parent());
} else {
if (!$(li).find(">a").hasClass("nav_first_style_selected")) {
$(li).find(">a").addClass("nav_first_style_selected");
$(li).siblings().find(">a").removeClass("nav_first_style_selected");
}
}
}
//創建導航
var createNav = function () {
searchChildren(root);
}
createNav();
}
var initNav = new navigationBar();
</script>
不過暫時還沒有封裝成類似jquery的寫法,其實還可以繼續封成一個控件~