以前在网上搜到很多js写的菜单,但是都是在静态页面中写死了。最近写了一个通过json数组来生成的菜单(兼容ie6,7,8;ff);代码如下:
//菜单内容json数组
//数据结构【fatherid:当前节点的父节点】【name:要显示的名字】【link:当前菜单的链接地址】【id:当前节点的id】
var menu_ary = [
{'fatherid':'0','name':'湖南','link':'http://www.a.com','id':'1'},
{'fatherid':'0','name':'湖南','link':'http://www.a.com','id':'2'},
{'fatherid':'0','name':'湖南','link':'http://www.a.com','id':'3'},
{'fatherid':'2','name':'湖南','link':'http://www.a.com','id':'4'},
{'fatherid':'2','name':'湖南','link':'http://www.a.com','id':'5'},
{'fatherid':'2','name':'湖南','link':'http://www.a.com','id':'6'},
{'fatherid':'3','name':'湖南','link':'http://www.a.com','id':'7'},
{'fatherid':'5','name':'湖南','link':'http://www.a.com','id':'8'},
{'fatherid':'5','name':'湖南','link':'http://www.a.com','id':'9'},
{'fatherid':'6','name':'湖南','link':'http://www.a.com','id':'10'},
{'fatherid':'6','name':'湖南','link':'http://www.a.com','id':'11'},
{'fatherid':'8','name':'湖南','link':'http://www.a.com','id':'12'},
{'fatherid':'8','name':'湖南','link':'http://www.a.com','id':'13'},
{'fatherid':'10','name':'湖南','link':'http://www.a.com','id':'14'},
{'fatherid':'11','name':'湖南','link':'http://www.a.com','id':'15'}
];
//判断是否为IE6,77
var ie_version = "class";
if(navigator.appName == "Microsoft Internet Explorer") {
if(navigator.appVersion.match(/7./i)=='7.' || navigator.appVersion.match(/6./i)=='6.')ie_version = "className";else ie_version = "class";
}
//隐显记录器
var p = new Array();
p[0]=0;p[1]=0;p[2]=0;
var n = new Array();
n[0]=0;n[1]=0;n[2]=0;
//移出触发器
var key_all=0;
//创建根节点
function create_root_node(){
var menu_area = document.createElement('div');
menu_area.setAttribute(ie_version, 'menu_root_area');
menu_area.style.position = 'absolute';
menu_area.style.left = 20 + 'px';
menu_area.style.top = 20 + 'px';
menu_area.setAttribute('id','f0');
for(var i=0;i<menu_ary.length;i++){ //遍历数组
if(menu_ary[i].fatherid=='0'){
var menuItems = document.createElement('div');
var t=0;
for(var j=0;j<menu_ary.length;j++){ if (menu_ary[j].fatherid==menu_ary[i].id) {t=1; break;}}
if (t==1) menuItems.setAttribute(ie_version, 'menu_root_info_child'); else menuItems.setAttribute(ie_version, 'menu_root_info_no_child');
menuItems.setAttribute('id','c'+menu_ary[i].id);
menuItems.onmouseover = function(){ on_mouse_over(this);}
menuItems.onmouseout = function(){ on_mouse_out();}
var menuLink = document.createElement('a');
menuLink.setAttribute(ie_version, 'menu_link_text');
menuLink.href = menu_ary[i].link;
menuLink.innerHTML = menu_ary[i].name;
menuItems.appendChild(menuLink);
menu_area.appendChild(menuItems);
}
}
document.getElementById("left_menu").appendChild(menu_area);
pf=-1;
pc=0;
}
//创建子节点
function create_child_node(id){
if (id==null) return false;
for(var j=0;j<menu_ary.length;j++){ if (menu_ary[j].fatherid==id) {nf=menu_ary[j].fatherid; break;}}
if (j==menu_ary.length) return false; else p_child=1;
var father_id = 'c'+id;
var father_obj = document.getElementById(father_id);
var father_left = father_obj.parentNode.offsetLeft;
var father_top =father_obj.parentNode.offsetTop + father_obj.offsetTop;
var father_width = father_obj.offsetWidth;
var child_area = document.createElement('div'); //创建一列的div
child_area.setAttribute(ie_version, 'menu_child_area');
child_area.style.position = 'absolute';
child_area.style.left = father_left + father_width + 1 + 'px';
child_area.style.top = (father_top) - 1 + 'px';
child_area.setAttribute('id','f' + id);
child_area.onmouseout = function(){ on_mouse_out();}
for (var i = 0; i < menu_ary.length; i++) {
if (id == menu_ary[i].fatherid) { //他就是当前鼠标经过的孩子
var childMenuItems = document.createElement('div'); // 创建每个菜单div
var t=0;
for(var j=0;j<menu_ary.length;j++){ if (menu_ary[j].fatherid==menu_ary[i].id) {t=1; break;}}
if (t==1) childMenuItems.setAttribute(ie_version, 'menu_child_info_child'); else childMenuItems.setAttribute(ie_version, 'menu_child_info_no_child');
childMenuItems.setAttribute('id', 'c' + menu_ary[i].id);
childMenuItems.onmouseover = function(){ on_mouse_over(this);}
child_area.onmouseout = function(){ on_mouse_out(this); }
var a = document.createElement('a');
a.setAttribute(ie_version, 'menu_link_text');
a.href = menu_ary[i].link;
a.innerHTML = menu_ary[i].name;
childMenuItems.appendChild(a);
child_area.appendChild(childMenuItems);
document.body.appendChild(child_area);
}
}
}
//销毁全部次级菜单
function hide_node_all() {if (key_all==1) {$('.menu_child_area').remove(); p[0]=0;p[1]=0;p[2]=0; n[0]=0;n[1]=0;n[2]=0; } }
//隐藏结点
function hide_node(id){var node_area = document.getElementById('f'+id);document.body.removeChild(node_area);}
//鼠标置上
function on_mouse_over(obj){
key_all=0;
id = obj.id.substring(1);
n[1] =id;
//找到公用父节点
for(var i=0;i<menu_ary.length;i++){ if (menu_ary[i].id==id) {n[0]=menu_ary[i].fatherid; break;}}
//找到有误子节点
for(var j=0;j<menu_ary.length;j++){ if (menu_ary[j].fatherid==n[1]) break;}
if (j==menu_ary.length) n[2]=0; else n[2]=1;
//自移
if (n[0]==p[0] && n[1]==p[1] && n[2]==p[2]) return false;
//平移操作
if (n[0]==p[0] && n[1]!=p[1]) { if (p[2]==1) hide_node(p[1]); create_child_node(n[1]); p[0]=n[0]; p[1]=n[1]; p[2]=n[2]; return false;}
//下移操作
if (n[0]==p[1]) { create_child_node(n[1]); p[0]=n[0]; p[1]=n[1]; p[2]=n[2]; return false;}
//自回移操作
if (n[1]==p[0]) { if (p[2]==1) hide_node(p[1]); p[0]=n[0]; p[1]=n[1]; p[2]=n[2]; return false;}
//跨回移操作
if (n[1]!=p[0]) { if (p[2]==1) {hide_node(p[1]);} hide_node(p[0]); create_child_node(n[1]); p[0]=n[0]; p[1]=n[1]; p[2]=n[2]; return false;}
}
//鼠标移开
function on_mouse_out(){//hide_node_all();
key_all=1;
setTimeout("hide_node_all()",500);
}
Html页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无限级菜单</title>
<style type='text/css'>
.menu_root_area { width:192px; border:1px solid #33a466; border-bottom:none;}
.menu_root_info_child { width:100%; height:42px; line-height:42px; background-image:url(images/menu_bg_01.jpg); background-repeat:no-repeat; text-align:center; border-bottom:1px solid #47bd9a; cursor:hand;}
.menu_root_info_no_child { width:100%; height:42px; line-height:42px; background-image:url(images/menu_bg_02.jpg); text-align:center; border-bottom:1px solid #47bd9a; cursor:hand;}
.menu_root_info_on_mouse { width:100%; height:42px; line-height:26px; background-color:#DDFBB5; text-align:center; border-bottom:1px solid #47bd9a; cursor:hand;}
.menu_child_area { width:160px; border:1px solid #33a466; border-bottom:none;}
.menu_child_info_child { width:100%; height:30px; line-height:30px; background-color:#E7FED8; background-image:url(images/have_child_02.gif); background-repeat:no-repeat; background-position:left; text-align:center; border-bottom:1px solid #47bd9a; cursor:hand;}
.menu_child_info_no_child { width:100%; height:30px; line-height:30px; text-align:center; border-bottom:1px solid #47bd9a; background-color:#E7FED8; cursor:hand;}
.menu_child_info_link_on_mouse { width:100%; height:30px; line-height:30px; background-color:#FFFF66; text-align:center; border-bottom:1px solid #47bd9a; cursor:hand;}
.menu_link_text { font-size:14px; font-weight:bold; color:#138271; text-decoration:none; display:block;}
</style>
<script src="js/jquery.js"></script>
<script src='js/menu.js'></script>
<script type="text/javascript">
//自动执行,根据数据创建菜单
window.onload = function (){create_root_node();}
</script>
</head>
<body>
<!--包含的菜单的div-->
<div id="left_menu"></div>
</body>
</html>
分享到:
相关推荐
本项目“JS左侧无限级菜单导航”就是针对这一需求而设计的,它采用JavaScript语言实现,兼容各大浏览器,确保了在各种环境下都能提供稳定且流畅的用户体验。 1. **无限级导航**: 无限级菜单指的是菜单项可以...
无限级菜单的展开与折叠效果可以通过CSS的`display`属性控制,通过JavaScript动态改变`display`值来实现展开和收起。 3. JavaScript交互: layui的核心库`layui.js`包含了丰富的组件和API,其中的`layui.nav`就是...
在了解左侧无限级菜单实现之前,需要了解一些基础知识点,包括但不限于: 1. Vue.js框架基础知识,例如数据绑定、组件化开发、计算属性(computed)等。 2. Element UI组件库的使用,特别是其el-menu和el-submenu...
接下来是"menuExt.js",这是一个JavaScript文件,负责实现无限级菜单的动态加载和交互功能。在layui框架中,菜单通常是通过JSON数据结构来定义的,这个文件可能会包含解析和渲染菜单的方法,以及处理点击事件、展开/...
"jQuery版无限下拉菜单栏,CSS无限级导航,JavaScript特效"就是一种提升网站导航效率和吸引力的技术应用。下面将详细介绍这三个核心概念及其相互关系。 首先,jQuery是一个轻量级、高性能的JavaScript库,它简化了...
CSS js抽右展开的无限级菜单,相信这款CSS和JavaScript共同实现的折叠展开式菜单会满足你的需求,因为它可以增加无限级子菜单,有多少分类都可以加进去,即使我们用不了那么多分类,不过学习研究下制作思路也是值得...
在实际应用中,为了实现无限级菜单,我们需要使用递归的概念。即,如果某个菜单项还有子菜单,那么它的子菜单项也可以包含子菜单,以此类推。这可以通过JavaScript或服务器端动态生成HTML来实现,但基础的样式布局仍...
标题中的“纯ajax 无限级 树形 菜单 源码”指的是一个使用纯JavaScript(通过AJAX技术)实现的无限级树形菜单的源代码。这个菜单允许用户在不刷新整个页面的情况下,动态加载和展示层级结构的数据,提供了一种高效的...
本文实例讲述了JS实现无限级网页折叠菜单(类似树形菜单)效果代码。分享给大家供大家参考。具体如下: 这是一款超不错的网页折叠菜单,采用JavaScript实现。折叠菜单是大家比较常见到的一种菜单形式,可广泛应用于...
在实际开发中,要使用这个插件,你需要首先在HTML中引入Bootstrap和Bootstrap Treeview的相关CSS和JS文件,然后创建一个包含数据的HTML元素,最后通过JavaScript初始化并操作树视图。例如,你可以这样设置: ```...
为了实现无限级菜单,我们需要设计一个数据库模型,它能够存储菜单的层级关系。这可能是一个包含`parent_id`字段的表,用于链接父菜单项和子菜单项。 接下来,我们需要编写一个后端视图函数,该函数使用递归方法从...
《使用jQuery Superfish插件构建无限级导航菜单》 在网页设计中,导航菜单是至关重要的组成部分,它帮助用户在网站中快速定位并浏览所需内容。jQuery Superfish插件是一款强大的、可扩展的导航菜单解决方案,尤其...
此外,为了实现无限级菜单,我们需要处理递归情况,即当检测到一个菜单项下还有子菜单时,继续创建新的`<ul>`和`<li>`。这可能涉及到递归函数的编写,确保能够正确地处理任意深度的菜单结构。 在实际开发中,还可以...
文字从左边移动到右边,JS循环控制 JavaScript使用indexOf搜索字符串并返回位置 Javascript文字左右反弹的效果代码 CSS最简单的阴影文字特效 JavaScript隐藏显示文字 JavaScript控制字符大小写转换 JS逐字变化文字...
JSON文件通常包含键值对,可以用来表示复杂的数据结构,如树形结构,这正是实现无限级菜单所需要的。 无限极下拉菜单的实现原理在于递归。当用户点击某个菜单项时,jQuery会检查该菜单项是否具有子菜单。如果有,它...
例如,可以为二级子菜单添加更宽的左边距。 ```css .menu ul ul { left: 100%; margin-left: 10px; } ``` 5. **过渡效果**:为显示和隐藏子菜单添加过渡效果,提升用户体验。 ```css .menu ul { transition: ...
【标题】"树形asp.net模板"涉及到的关键技术与知识点主要集中在构建无限级菜单、JavaScript脚本、数据库操作以及ASP.NET框架的版本升级上。以下将详细阐述这些方面: 1. **无限级菜单**:在网页设计中,无限级菜单...
3. **动态加载树形菜单实现原理**: - **数据结构**:菜单数据通常以树状结构存储,在后台数据库中,每个菜单项都有对应的父节点ID。 - **数据获取**:通过Struts处理服务器端逻辑,从数据库中获取树形结构的数据...
总结来说,layui实现三级导航菜单的关键在于正确使用layui的CSS类和JS接口,以及理解layui的布局结构。通过组合使用`layui-nav`、`layui-nav-item`、`layui-nav-child`等类,配合JavaScript事件处理,可以创建出功能...
1. **顶级菜单**:这是菜单结构的第一层,通常显示在最上方或左侧,包含主要类别或功能。用户点击这些顶级菜单项后,会触发二级或三级菜单的展开。 2. **二级菜单**:当用户选择一个顶级菜单项时,二级菜单会出现,...