当前位置: 首页 > Web前端 > CSS

CSS多级菜单

时间:2023-03-30 18:03:54 CSS

这是一个比较炫的功能,让网页看起来像一个桌面程序,比如窗口的开始菜单。实现原理和纯CSS相册基本类似,但是需要注意的地方很多,我们一步步来。让我们从一个非常简单的一级菜单和悬停效果开始。

  • 菜单一
  • 菜单2
  • 菜单三
  • 菜单四结构很熟悉,正确的?把原来放图片的地方换成文字就行了。我也标出来了。下面的表示层代码非常简单。*{保证金:0;padding:0;}.menu{font-size:12px;}.menuli{/*水平菜单*/float:left;list-style:none;}.menua{display:block;职位:相对;高度:32px;宽度:100px;行高:32px;背景:#a9ea00;颜色:#ff8040;文字装饰:无;text-align:center;}.menua:hover{背景:#369;颜色:#fff;}.menulispan{显示:无;位置:绝对;左:0;顶部:32px;宽度:200px;高度:150px;display:block;}这里有两点值得注意。让我们从第一个开始。子菜单的顶部(span元素)应该能够使其顶部停留在a元素的范围内。如果包含块是li元素,则同样如此。当span的top值大于32px,比如40px时,我们不能将鼠标移动到span元素上。因为它离开了a:hover的范围,所以span元素又被隐藏了。.menulispan{显示:无;位置:绝对;左:0;top:40px;/*★★修改这里★★*/width:200px;高度:150px;background:#B9D6FF;}第二个问题是IE6独有的问题,对应的包含块mouseoutout后子菜单不消失的问题。hover伪类相当于moveover和moveout。我们可以在鼠标悬停时为它的后代元素识别一种样式,在鼠标移出时识别另一种样式。换句话说,现在不能在IE6中切换显示(img元素除外)。解决方案是用可见性代替显示。好了,现在我们真正制作二级菜单,把span相关的CSS全部删除,把原来span在结构层的位置改成如下代码:
    • 二级菜单_11
    • 二级菜单_12
    • a>
    我们看了各个浏览器,感觉很无力。IE6和Opera10的二级菜单项是垂直的,但是我们没有清除浮动?firefox3.5、chrome、safari4的二级菜单项横向分布,不过好像多了一个菜单项……IE8同学这次表现最好。我没有安装IE7,所以我总是忽略它。让我们重新设置样式,比如将包含块更改为li元素,以便二级菜单项垂直显示。*{保证金:0;padding:0;}.menu{font-size:12px;}.menuli{/*水平菜单*/float:left;列表样式:无;position:relative;/*putthecontainingblock移动li元素*/}.menua{display:block;/*位置:相对;在a元素中发现,在标准浏览器中惨不忍睹,纯CSS相册3的第一个运行帧在chrome中遇到同样的bug*/height:32px;宽度:100px;行高:32px;背景:#a9ea00;颜色:#ff8040;文字装饰:无;text-align:center;}.menua:hover{背景:#369;color:#fff;}/*新增二级菜单部分*/.menuulul{visibility:hidden;/*开头隐藏*/position:absolute;左:0px;顶部:32px;}.menuula:hoverul{visibility:visible;}.menuululli{clear:both;/*垂直显示*/text-align:left;}发现二级菜单在firefox、safari和chrome,弹不出来(三个浏览器的CSS部分互相抄袭严重)。Opera10表现最好,其次是IE8。但是,标准浏览器的所有元素都支持hover伪类,不像IE6,它必须有一个带href的元素。我们重写了部分CSS代码:.menuulli:hoverul,/*notIE6*/.menuula:hoverul{/*IE6*/visibility:visible;}二级菜单可以弹出,但是神秘的li元素也是可见的。即使使用收缩包装双花车,我也无法摆脱这个神秘的li元素。参考国外代码,方法是把整个子菜单放在a元素外面,然后用li:hover来控制样式切换。于是结构层改写如下:
    • Menu1
      • 二级菜单_11
      • 二级菜单_12
    • 菜单2
      • 二级菜单_21
      • 二级菜单_22
    • //***************稍微************
    • //**************稍微************