博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】CSS+JavaScript 实现菜单功能--改进版
阅读量:6038 次
发布时间:2019-06-20

本文共 6883 字,大约阅读时间需要 22 分钟。

在上一篇《》通过一个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 + 
"
\
"
 οnmοuseοver=\
"
displaySubMenu(
this
)\
"
 οnmοuseοut=\
"
hideSubMenu(
this
)\
"
><a href=\
"
#\
""
    
if
(
this
.type
==
"
Menu
"
)
        str 
=
 str 
+
 
"
 class=\
""
 + this.cssStyle + 
"
\
""
    }
 
    str 
=
 str 
+
 
"
 οnclick=\
""
+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的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
A10 负载均衡模拟器下载安装及license免费激活详细介绍
查看>>
SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?...
查看>>
双向链表的几种实现
查看>>
我的友情链接
查看>>
Ubuntu快捷键
查看>>
RGBA是什么
查看>>
华三云ONEstor存储测试
查看>>
centos用lastb命令看失败登录记录
查看>>
*** 2003
查看>>
Microsoft Deployment Toolkit 2010 (MDT)下载地址
查看>>
sort与uniq
查看>>
openvswitch架构图
查看>>
云锁模块libsensitiveFilter.so导致nginx报错,K哥
查看>>
Oracle 存储过程和包的使用
查看>>
计算机经典图书样章免费下载【持续更新中……】
查看>>
java 运算符,流程控制语句,键盘录入
查看>>
老男孩教育-linux面试题-基础题1
查看>>
关于lync安装问题
查看>>
九、搭建织梦cms网站
查看>>
如何查看Oracle官方文档
查看>>