【原创】CSS+JavaScript 实现菜单功能--改进版

简介:

在上一篇《CSS+JavaScript 实现菜单功能》通过一个HTML页面简单的实现了菜单功能。但是实际开发当中,如果菜单栏有很多项,频繁的修改HTML,会很繁琐,也容易出错。

改进版本优化了这个问题,通过简单的Javascript代码就可以增加菜单。同时使得HTML页面非常简洁,只需要写2行代码即可!O(∩_∩)O

1.使用前提,在HTML页面中引入一个CSS文件,和一个JavaScript文件。如下:

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >  
< HTML >  
    
< HEAD >  
        
< TITLE > Menu </ TITLE >  
        
< link  type ="text/css"  rel ="stylesheet"  href ="menu.css" >    
    
</ HEAD >  
    
< BODY >  
        
< div >< script  src ="menu.js" ></ script ></ div >  
    
</ BODY >  
</ HTML >


引入CSS文件:<link type="text/css" rel="stylesheet" href="menu.css">  ,menu.css代码见后

引入JavaScript文件:<script src="menu.js"></script>

 

2.定义菜单代码如下:

if (document.getElementById)
    var root = new Root();   
     
    var m1 = new Menu("File","alert(this.innerText);"); 
    root.add(m1); 
    var m11 = new MenuItem("New"); 
    m1.add(m11); 
    m1.add(new MenuItem("Open","alert('open file');")); 
    var m12 = new MenuItem("Save"); 
    m1.add(m12); 
    m1.add(new MenuItem("Save As")); 
    m1.add(new MenuItem("Close")); 
    m1.add(new MenuItem("")); 
     
    var m2 = new Menu("Edit"); 
    root.add(m2); 
     
    root.toString();     
}

 

说明:

1) var root = new Root();      

        root.toString();  

        固定格式

2)声明菜单:

        var m1 = new Menu("File","alert(this.innerText);");

        菜单显示的名称为“File”,onclick事件为alert(this.innerText);

        root.add(m1);

        第一级菜单(即页面初始显示的菜单)放到root之下,通过add()方法

        var m11 = new MenuItem("New"");

        m1.add(m11);

        声明“File”的子菜单“New”

        m1.add(new MenuItem("Open","alert('open file');"));

        声明“File”的子菜单“Open”

通过上面的代码即可完成菜单的添加功能。

 

 

代码文件:

<1> menu.cs

#menubar  {  
    font-family
:verdana;  
    font-size
:12px;               
    margin
:1px;  
}
  
#menubar li 
{  
    float
:left;  
    position
:relative;                
    text-align
:left;  
}
         
/* each menu item style */   
#menubar li a 
{  
    border-style
:none;  
    color
:black;  
    display
:block;                            
    width
:150px;  
    height
:20px;  
    line-height
:20px;  
    padding-left
:10px;  
    text-decoration
:none;     
}
  
/* the first level menu which displays default */   
#menubar .menuMain
{  
    border-color
:#C0C0C0;  
    border-width
:1px;  
    border-style
:solid;  
}
  
/* the first leve style when mouse on it */   
#menubar li a:hover
{  
    background-color
:#efefef;   
    text-decoration
:underline;  
}
  
/* the second level menu block style */   
#menubar li ul
{  
    background-color
:#efefef;  
    border-style
:none;  
    display
:none;  
    position
:absolute;  
    top
:20px;  
    left
:-40px;  
    margin-top
:2px;  
    width
:150px;              
}
  
/* the sub menu item style when mouse on it */   
#menubar li ul li a:hover 
{  
    text-decoration
:underline;   
    padding-left
:20px;   
}
  
/* the third or more level menu block style */   
#menubar li ul li ul 
{  
    display
:none;  
    position
:absolute;  
    top
:0px;  
    left
:150px;   
    margin-top
:0;  
    margin-left
:0;  
    width
:150px;  
}
  


<2>menu.js

var  MenuConfig  =  
    defaultText : 
"Menu Item"
    defaultAction : 
"javascript:void(0);"   , 
    defaultMenuCssStyle : 
"menuMain" 
}


var  MenuHandler  =  
    idCounter : 
0
    idPrefix : 
"menu-"
    getId : 
function()return this.idPrefix + this.idCounter++ ;}
    insertHTMLBeforeEnd : 
function(node, sHTML)
        
if(node.insertAdjacentHTML != null)
            node.insertAdjacentHTML('BeforeEnd',sHTML); 
            
return
        }
 
        
var df; // DocumentFragment 
        var r = node.ownerDocument.createRange(); 
        r.selectNodeContents(node); 
        r.collapse(
false); 
        df 
= r.createContextualFragment(sHTML); 
        node.appendChild(df); 
    }
 
}
 

function  displaySubMenu(li) {  
    
var subMenu = li.getElementsByTagName('ul')[0];  
    
if(subMenu) 
        subMenu.style.display 
= 'block';  
}
  

function  hideSubMenu(li) {  
    
var subMenu = li.getElementsByTagName('ul')[0];    
    
if(subMenu) 
        subMenu.style.display 
= 'none';  
}
   


/****************************************** 
 * Funciont Name:   MenuAbstractNode 
 * Description: MenuAbstractNode class 
 * @param {String} pText  
 * @param {String} pAction  
 * @Return: 
 ******************************************
*/
  
function  MenuAbstractNode(pText, pAction)
    
this.text = pText || MenuConfig.defaultText;     
    
this.action = pAction || MenuConfig.defaultAction; 
    
this.id = MenuHandler.getId(); 
     
    
this.childNodes = []; 
}
 

MenuAbstractNode.prototype.add 
=   function (node)
    
this.childNodes[this.childNodes.length] = node; 
}
 

/****************************************** 
 * Funciont Name:   toString 
 * Description: generate HTML code 
 * @param   
 * @param  
 * @Return: 
 ******************************************
*/
 
MenuAbstractNode.prototype.toString 
=   function () {    
    
var str = "<li id=\"" + this.id + "\" onmouseover=\"displaySubMenu(this)\" onmouseout=\"hideSubMenu(this)\"><a href=\"#\""

    
if(this.type=="Menu")
        str 
= str + " class=\"" + this.cssStyle + "\""
    }
 
    str 
= str + " onclick=\""+this.action+"\">"+this.text+"</a>"
     
    
var sb = []; 

    
for (var i = 0; i < this.childNodes.length; i++
        sb[i] 
= this.childNodes[i].toString(); 
    }
 
    
if(sb.length>0)
        str 
= str + "<ul>" + sb.join(""+ "</ul>" 
    }
 

    
return str + "</li>" ; 
}
 

/****************************************** 
 * Funciont Name:   Menu 
 * Description: Menu class 
 * @param {String} pText  
 * @param {String} pAction  
 * @param {String} pCssStyle  
 * @Return: 
 ******************************************
*/
  
function  Menu(pText, pAction,pCssStyle)
    
this.base = MenuAbstractNode; 
    
this.base(pText,pAction); 
     
    
this.type = "Menu"
    
this.cssStyle = pCssStyle || MenuConfig.defaultMenuCssStyle; 
}
 

Menu.prototype 
=   new  MenuAbstractNode; 

/****************************************** 
 * Funciont Name:   MenuItem 
 * Description: MenuItem class 
 * @param {String} pText  
 * @param {String} pAction  
 * @Return: 
 ******************************************
*/
 
function  MenuItem(pText, pAction)
    
this.base = MenuAbstractNode; 
    
this.base(pText,pAction); 
    
this.type = "MenuItem"
}
 

MenuItem.prototype 
=   new  MenuAbstractNode; 


/****************************************** 
 * Funciont Name:   Root 
 * Description: Root class 
 * @Return: 
 ******************************************
*/
 
function  Root()
    
this.id = "menubar"
    
this.childNodes=[];  
}
 

Root.prototype 
=   new  MenuAbstractNode; 

Root.prototype.toString 
=   function ()
    document.write(
"<div id='menu'><ul id=\""+root.id+"\"> </ul> </div>"); 
    
for(var i=0; i<this.childNodes.length; i++)
        MenuHandler.insertHTMLBeforeEnd(document.getElementById(root.id), 
this.childNodes[i].toString()); 
    }
 
}
 

if  (document.getElementById)
    
var root = new Root();   
     
    
var m1 = new Menu("File","alert(this.innerText);"); 
    root.add(m1); 
    
var m11 = new MenuItem("New","alert(this.innerText);"); 
    m1.add(m11); 
    m1.add(
new MenuItem("Open","alert('open file');")); 
    
var m12 = new MenuItem("Save"); 
    m1.add(m12); 
    m1.add(
new MenuItem("Save As")); 
    m1.add(
new MenuItem("Close")); 
    m1.add(
new MenuItem("")); 
     
    
var m2 = new Menu("Edit"); 
    root.add(m2); 
    
var m22 = new MenuItem("Select All"); 
    m2.add(m22); 
    m2.add(
new MenuItem("Cut")); 
    m2.add(
new MenuItem("Copy")); 
    m2.add(
new MenuItem("paste")); 
     
    
var m3 = new Menu("View"); 
    
var m33 = new MenuItem("View List"); 
    m33.add(
new MenuItem("Function List")); 
    m3.add(m33); 
    m3.add(
new MenuItem("Tool Bar")); 
    root.add(m3); 
    root.toString();     
}
 

 本文转自BlogJavaOo缘来是你oO的博客,原文链接:实现菜单功能--改进版【原创】CSS+JavaScript ,如需转载请自行联系原博主。


相关文章
|
14天前
一个好看的小时钟html+js+css源码
一个好看的小时钟html+js+css源码
85 24
|
1天前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
19 8
|
2月前
|
前端开发
基于CSS3+Bootstrap实现的侧边栏后台菜单源码
CSS3+Bootstrap实现的侧边栏后台菜单特效源码是一段基于Bootstrap和图标库制作的侧边栏菜单后台管理页面效果代码,简洁大方、易于管理,是一段非常不错的后台菜单栏效果,欢迎对此段代码感兴趣的朋友前来下载。
101 54
|
21天前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
25天前
|
JavaScript 前端开发
jQuery和CSS3滑动展开菜单按钮插件
这是一款jQuery和CSS3滑动展开菜单按钮插件。该滑动展开菜单按钮在用户点击主菜单按钮之后,子菜单以滑动的方式依次展开
62 21
|
1月前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
47 3
|
2月前
|
JavaScript 前端开发 容器
jQuery多功能滑块插件r-slider.js
r-slider.js是一款jQuery多功能滑块插件。使用该插件,可以制作出滑块、开关按钮、进度条、向导步骤等多种效果。
47 5
|
2月前
|
JavaScript 前端开发
CSS3 动画和 JavaScript 动画的性能比较
具体的性能表现还会受到许多因素的影响,如动画的复杂程度、浏览器的性能、设备的硬件条件等。在实际应用中,需要根据具体情况选择合适的动画技术。
|
2月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
优化CSS和JavaScript加载
|
2月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。