层级菜单动态效果的实现

时间:2023-02-10 14:02:39

 

【文章标题】层级菜单动态效果的实现

【文章作者】曾健生

【作者邮箱】zengjiansheng1@126.com

【作者QQ190678908

【作者博客】http://blog.csdn.net/newjueqi

【编程环境】Dreamweaver

【作者声明】欢迎转载文章,但转载请保留文章的完整性以及注明文章的出处。

 

*******************************************************************************

在网页上有一个很常见的效果,譬如有如下的菜单项:

层级菜单动态效果的实现

       1

 

当点击一下“同学好友”后,会出现一个下级菜单项,如图2

层级菜单动态效果的实现

 

       2

 

从图2可看出,

1.       “同学好友”和“xuelei 风息fengJay 风吹子”是在同一个单元格内(仔细观察红色框线)。

2.       上级菜单“同学好友”和下层菜单“xuelei 风息fengJay 风吹子”作用不同的样式表。

3.       xuelei 风息fengJay 风吹子”是一个整体的区域。

4.       所有菜单都是在一个表格中。

 

既然“xuelei 风息fengJay 风吹子”是一个整体的区域,那么怎么把这些信息放在一个区域中以便于统一管理呢?很自然地想到了<div>标签,这是个在网页开发中使用频率非常高的标签。

      

那么是怎么实现上层菜单和下层菜单之间具有不同的样式?答案是CSSCSS的名称是层叠样式表,既然是层叠,就是能被覆盖的,我们只要整个单元格作用一个样式表,在DIV区域作用一个不同的样式表,就能有不同的显示效果。

 

虽然在第一个单元格中,“同学好友”是固定显示信息,“xuelei 风息fengJay 风吹子”是动态显示信息,但我们必须明确:“xuelei 风息fengJay 风吹子”信息平时只是隐藏,当点击了一下“同学好友”后就显示出来。信息显示的隐藏,应该是属于CSS中布局方面的,查看CSS帮助文档,果然查到了一个属性display,其中有两个取值:

 

1. block:块对象的默认值。将对象强制作为块对象呈递,为对象之后添加新行

2. none隐藏对象。与 visibility 属性的hidden值不同,其不为被隐藏的对象保留其物理空间

 

注意看取值none,“是不为被隐藏的对象保留其物理空间“,也就是连所在区域也不显示,这不就是我们所需要的隐藏效果吗?

一般来讲,这种菜单的展现效果都是单个的。譬如当展开“Java好友”菜单,如果“同学好友”菜单以前是展开的话就会自动闭合,所以各个菜单项之间是互斥关系。同时如果“同学好友”菜单以前是展开的话,在重新点击一下“同学好友”菜单下面的子菜单就会自动闭合。

在表格中有如下层次关系:

 

Table

|--Tbody

       |--tr(1)

              |--td

|--超链接A同学好友

|--div区域:xuelei 风息fengJay 风吹子”

       |--tr(2)

              |--td

|--超链接A“JAVA好友

|--div区域:lian guoxing 欣”

       |--tr(3)

              |--td

|--超链接A“C++好友

|--div区域:“安吹kanxue 是人”

 

       既然是互斥关系,必须要获取当前的div对象和表格中所有的div对象。

1.       获取当前的div对象:当点击超链接对象时可通过“超链接对象。parentNode“获取所在的单元格对象,通过单元格的getElementsByTagName来获取div对象。

2.       获取表格中所有的div对象:

a,  通过document.getElementsByTagName( "table" )[0]获取当前的表格对象

b,  通过tabObj.getElementsByTagName("div")就能获取一个表格内所有的div对象

 

遍历表格内所有的div对象,当检测到的div对象为当前div对象而且状态为隐藏,那当前div对象状态变为显示,其他的div对象变为隐藏;当检测到的div为当前div对象而且状态为显示,那当前div对象状态变为隐藏。CSS样式表的选择器中有个class选择器,可把一个CSS作用于具有相同类名的元素,我们可以把div的显示设置为一种样式作用于类名opendiv的隐藏设置为另外一种样式作用于类名close,用DOMdiv分别改类名,就能实现互斥显示效果。

显示和隐藏的CSS样式表如下:

 

.open{ display:block

        

       }

.close{

       display:none;

       }

 

最后实现的代码如下:

 

//aObj为当前超链接对象

function list( aObj )

{    

       //根据A对象获取所在单元格对象

       tdObj=aObj.parentNode;

 

       //根据单元格对象获取本单元格的div对象

       divObj=tdObj.getElementsByTagName("div")[0];

 

       //获取表格对象

       tabObj=document.getElementsByTagName( "table" )[0];    

 

       //获取表格对象内所有的div对象

       divArray=tabObj.getElementsByTagName("div");

      

       //遍历所有的div对象

       for(  var x in divArray )

       {

              //遍历到的div对象为当前div对象

              if( divObj==divArray[x] )

              {

/*当检测到的div为当前div对象而且状态为隐藏,那当前div对象状态变为显示,其他的div对象变为隐藏;当检测到的div为当前div对象而且状态为显示,那当前div对象状态变为隐藏*/

 

                     if( divArray[x].className== "open" )

                     {

                            divArray[x].className= "close";

                     }

                     else

                     {

                            divArray[x].className= "open";

                     }

              }

              else //把其他的div对象变为隐藏

              {

                     divArray[x].className= "close";

              }

       }    

}

 

文章附件下载:http://newjueqi.ys168.com/