js導(dǎo)航菜單(自寫(xiě))簡(jiǎn)單大方
更新時(shí)間:2013年03月28日 15:03:28 作者:
一個(gè)簡(jiǎn)單的多級(jí)下拉菜單菜單但是由于業(yè)務(wù)和樣式上的要求,為了簡(jiǎn)潔找了好多都不適合于是自己寫(xiě)了一個(gè),曬出來(lái)與大家分享,感興趣的朋友可以參考下哈,希望可以幫助到你
最近由于項(xiàng)目需要一個(gè)簡(jiǎn)單的多級(jí)下拉菜單菜單但是由于業(yè)務(wù)和樣式上的要求,為了簡(jiǎn)潔,在網(wǎng)上找了很多導(dǎo)航菜單控件都不大適合,所以突發(fā)奇想自己寫(xiě)個(gè)吧~該動(dòng)手就動(dòng)手啊~
HTML部分
<h2>
SuperFish</h2>
<ul class="nav" hid="root">
<li><a href="javascript:void(0)" testid="aa">一級(jí)li 1</a>
<ul>
<li><a href="javascript:void(0)" testid="bb">二級(jí) li 1</a></li>
<li><a href="javascript:void(0)" testid="cc">二級(jí) li 2</a>
<ul>
<li><a href="javascript:void(0)" testid="dd">三級(jí) li 1</a></li>
<li><a href="javascript:void(0)" testid="ee">三級(jí) li 2</a></li>
<li><a href="javascript:void(0)" testid="ff">三級(jí) li 3</a></li>
<li><a href="javascript:void(0)" testid="gg">三級(jí) li 4</a></li>
<li><a href="javascript:void(0)" testid="hh">三級(jí) li 5</a></li>
<li><a href="javascript:void(0)" testid="ii">三級(jí) li 6</a>
<ul>
<li><a href="javascript:void(0)" testid="jj">四級(jí) li 1</a></li>
<li><a href="javascript:void(0)" testid="kk">四級(jí) li 2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="ll">二級(jí) li 3</a>
<ul>
<li><a href="javascript:void(0)" testid="mm">三級(jí) li 6</a></li>
<li><a href="javascript:void(0)" testid="nn">三級(jí) li 7</a></li>
<li><a href="javascript:void(0)" testid="oo">三級(jí) li 8</a></li>
<li><a href="javascript:void(0)" testid="pp">三級(jí) li 9</a></li>
<li><a href="javascript:void(0)" testid="qq">三級(jí) li 10</a></li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="rr">二級(jí) li 4</a>
<ul>
<li><a href="javascript:void(0)" testid="ss">三級(jí) li 11</a></li>
<li><a href="javascript:void(0)" testid="tt">三級(jí) li 12</a></li>
<li><a href="javascript:void(0)" testid="uu">三級(jí) li 13</a></li>
<li><a href="javascript:void(0)" testid="vv">三級(jí) li 14</a></li>
<li><a href="javascript:void(0)" testid="ww">三級(jí) li 15</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="xx">一級(jí)li 2</a>
<ul>
<li><a href="javascript:void(0)" testid="ss">二級(jí) li 11</a></li>
</ul>
</li>
</ul>
Javascript部分
<script language="javascript" type="text/javascript">
var navigationBar = function () {
//使用時(shí)將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");
//遞歸向下查找可展開(kāi)元素并且綁定toggle展開(kāi)事件
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");
//初始裝載的時(shí)候判斷當(dāng)前url是不是和導(dǎo)航欄中的東西匹配
if (currentUrlHref == $(aLink).attr("testid")) {
findInitPosition(aLink);
}
$(aLink).toggle(function () {
$(this).addClass("li_style_a_selected");
$(this).parent().find(">ul").show("fast");
//隱藏非一級(jí)節(jié)點(diǎn)下的所有兄弟元素
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");
}
}
//遞歸向下刪除所有子節(jié)點(diǎn)的選中樣式
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);
})
}
}
//遞歸向上添加第一層節(jié)點(diǎn)樣式
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");
}
}
}
//創(chuàng)建導(dǎo)航
var createNav = function () {
searchChildren(root);
}
createNav();
}
var initNav = new navigationBar();
</script>
不過(guò)暫時(shí)還沒(méi)有封裝成類(lèi)似jquery的寫(xiě)法,其實(shí)還可以繼續(xù)封成一個(gè)控件~
HTML部分
復(fù)制代碼 代碼如下:
<h2>
SuperFish</h2>
<ul class="nav" hid="root">
<li><a href="javascript:void(0)" testid="aa">一級(jí)li 1</a>
<ul>
<li><a href="javascript:void(0)" testid="bb">二級(jí) li 1</a></li>
<li><a href="javascript:void(0)" testid="cc">二級(jí) li 2</a>
<ul>
<li><a href="javascript:void(0)" testid="dd">三級(jí) li 1</a></li>
<li><a href="javascript:void(0)" testid="ee">三級(jí) li 2</a></li>
<li><a href="javascript:void(0)" testid="ff">三級(jí) li 3</a></li>
<li><a href="javascript:void(0)" testid="gg">三級(jí) li 4</a></li>
<li><a href="javascript:void(0)" testid="hh">三級(jí) li 5</a></li>
<li><a href="javascript:void(0)" testid="ii">三級(jí) li 6</a>
<ul>
<li><a href="javascript:void(0)" testid="jj">四級(jí) li 1</a></li>
<li><a href="javascript:void(0)" testid="kk">四級(jí) li 2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="ll">二級(jí) li 3</a>
<ul>
<li><a href="javascript:void(0)" testid="mm">三級(jí) li 6</a></li>
<li><a href="javascript:void(0)" testid="nn">三級(jí) li 7</a></li>
<li><a href="javascript:void(0)" testid="oo">三級(jí) li 8</a></li>
<li><a href="javascript:void(0)" testid="pp">三級(jí) li 9</a></li>
<li><a href="javascript:void(0)" testid="qq">三級(jí) li 10</a></li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="rr">二級(jí) li 4</a>
<ul>
<li><a href="javascript:void(0)" testid="ss">三級(jí) li 11</a></li>
<li><a href="javascript:void(0)" testid="tt">三級(jí) li 12</a></li>
<li><a href="javascript:void(0)" testid="uu">三級(jí) li 13</a></li>
<li><a href="javascript:void(0)" testid="vv">三級(jí) li 14</a></li>
<li><a href="javascript:void(0)" testid="ww">三級(jí) li 15</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="javascript:void(0)" testid="xx">一級(jí)li 2</a>
<ul>
<li><a href="javascript:void(0)" testid="ss">二級(jí) li 11</a></li>
</ul>
</li>
</ul>
Javascript部分
復(fù)制代碼 代碼如下:
<script language="javascript" type="text/javascript">
var navigationBar = function () {
//使用時(shí)將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");
//遞歸向下查找可展開(kāi)元素并且綁定toggle展開(kāi)事件
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");
//初始裝載的時(shí)候判斷當(dāng)前url是不是和導(dǎo)航欄中的東西匹配
if (currentUrlHref == $(aLink).attr("testid")) {
findInitPosition(aLink);
}
$(aLink).toggle(function () {
$(this).addClass("li_style_a_selected");
$(this).parent().find(">ul").show("fast");
//隱藏非一級(jí)節(jié)點(diǎn)下的所有兄弟元素
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");
}
}
//遞歸向下刪除所有子節(jié)點(diǎn)的選中樣式
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);
})
}
}
//遞歸向上添加第一層節(jié)點(diǎn)樣式
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");
}
}
}
//創(chuàng)建導(dǎo)航
var createNav = function () {
searchChildren(root);
}
createNav();
}
var initNav = new navigationBar();
</script>
不過(guò)暫時(shí)還沒(méi)有封裝成類(lèi)似jquery的寫(xiě)法,其實(shí)還可以繼續(xù)封成一個(gè)控件~

您可能感興趣的文章:
- 一個(gè)js控制的導(dǎo)航菜單實(shí)例代碼
- JS實(shí)現(xiàn)選中當(dāng)前菜單后高亮顯示的導(dǎo)航條效果
- 可以媲美Flash的JS導(dǎo)航菜單
- 原生js做的手風(fēng)琴效果的導(dǎo)航菜單
- 用js實(shí)現(xiàn)的比較經(jīng)典實(shí)用的觸發(fā)型導(dǎo)航菜單
- JS中用三種方式實(shí)現(xiàn)導(dǎo)航菜單中的二級(jí)下拉菜單
- js實(shí)現(xiàn)多選項(xiàng)切換導(dǎo)航菜單的方法
- js左側(cè)三級(jí)菜單導(dǎo)航實(shí)例代碼
- 非常酷的js圖形漸隱導(dǎo)航菜單欄
- js實(shí)現(xiàn)水平滾動(dòng)菜單導(dǎo)航
相關(guān)文章
JavaScript中instanceof運(yùn)算符的使用示例
這篇文章主要介紹了JavaScript中instanceof運(yùn)算符的使用示例,instanceof的使用是JavaScript入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-06-06document.open() 與 document.write()
document.open() 與 document.write()...2006-10-10Javascript 實(shí)現(xiàn)簡(jiǎn)單計(jì)算器實(shí)例代碼
這篇文章主要介紹了Javascript 實(shí)現(xiàn)簡(jiǎn)單計(jì)算器實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10張孝祥JavaScript學(xué)習(xí)階段性總結(jié)(2)--(X)HTML學(xué)習(xí)
張孝祥JavaScript學(xué)習(xí)階段性總結(jié)(2)--(X)HTML學(xué)習(xí)...2007-02-02javascript下for循環(huán)用法小結(jié)
javascript下for循環(huán)用法小結(jié)...2007-07-07javascript學(xué)習(xí)筆記(二) 鼠標(biāo)經(jīng)過(guò)時(shí),改變div塊的背景色的代碼
javascript學(xué)習(xí)筆記(二) 鼠標(biāo)經(jīng)過(guò)時(shí),改變div塊的背景色的實(shí)現(xiàn)代碼,當(dāng)然也可以用css實(shí)現(xiàn)。2011-04-04