CSS多级菜单

这是一个相当炫的功能,让网页看起来像桌面程序,如window的开始菜单。实现原理基本和纯CSS相册差不多,但要注意的事项比较多,让我们一步步来吧。

先来一个非常简单的一级菜单与悬停效果。


<ul id="menu">

  <li>

    <a href="http://www.cnblogs.com/rubylouvre/">

      菜单一<!--小图--><span><!--大图--></span>

    </a>

  </li>

  <li>

    <a href="http://www.cnblogs.com/rubylouvre/">

      菜单二<!--小图--><span><!--大图--></span>

    </a>

  </li>

  <li>

    <a href="http://www.cnblogs.com/rubylouvre/">

      菜单三<!--小图--><span><!--大图--></span>

    </a>

  </li>

  <li class="last">

    <a href="http://www.cnblogs.com/rubylouvre/">

      菜单四<!--小图--><span><!--大图--></span>

    </a>

  </li>

</ul>

结构很熟悉吧,就是把原来放图片的地方换成文字而已。我还特意标出来了。接着下来的表现层代码非常简单。


* {

  margin:0;

  padding:0;

}

.menu {

  font-size:12px;

}

.menu li {/*水平菜单*/

  float:left;

  list-style:none;

}

.menu a {

  display:block;

  position:relative;

  height:32px;

  width:100px;

  line-height:32px;

  background:#a9ea00;

  color:#ff8040;

  text-decoration:none;

  text-align:center;

}

.menu a:hover {

  background:#369;

  color:#fff;

}

.menu li span {

  display:none;

  position:absolute;

  left:0;

  top:32px;

  width:200px;

  height:150px;

  background:#B9D6FF;

}

.menu a:hover span {

  display:block;

}

web前端开发学习Q-q-u-n: 731771211,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频)

这里有两个值得注意的地方。我们先说第一个。子菜单(span元素)的top应该能使其顶部停留在a元素的范围内,如果包含块是li元素,同理。当span的top值大于32px,如40px,我们就无法把鼠标移到span元素上。因为离开了a:hover的作用范围,span元素又重新隐藏。


.menu li span {

  display:none;

  position:absolute;

  left:0;

  top:40px;/*★★修改这里★★*/

  width:200px;

  height:150px;

  background:#B9D6FF;

}

第二个问题是IE6特有的,就是子菜单在对应的包含块mouseout后仍不消失的问题。hover伪类相当于moverover与moverout。我们在可以在mouseover给它的子孙元素认定一种样式,mouseout时认定另一种。换言之,display现在在IE6无法切换(img元素除外)。解决方法用visibility 代替display。

好了,现在我们真正做二级菜单,把有关span的CSS全删掉,并在结构层原span的位置改为如下代码:

<ul>

  <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li>

  <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li>

</ul>

我们在各游览器看一下,感觉非常乏力。IE6与Opera10的二级菜单项是垂直的,但我们并没有清除浮动啊?firefox3.5与chrome与safari4的二级菜单项是水平分布了,但上面好像多出一个菜单项……IE8同学这次反而是表现得最好的。我没有装IE7,所以一向忽略它。

我们重新设置一下样式,如把包含块改设在li元素上,让二级菜单项呈垂直显示。


* {

  margin:0;

  padding:0;

}

.menu {

  font-size:12px;

}

.menu li {/*水平菜单*/

  float:left;

  list-style:none;

  position:relative;/*把包含块移动li元素*/

}

.menu a {

  display:block;

  /*position:relative;发现放在a元素中,

  在标准游览器中惨不忍睹,

  和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/

  height:32px;

  width:100px;

  line-height:32px;

  background:#a9ea00;

  color:#ff8040;

  text-decoration:none;

  text-align:center;

}

.menu a:hover {

  background:#369;

  color:#fff;

}

/*新增的二级菜单部分*/

.menu ul ul {

  visibility:hidden;/*开始时是隐藏的*/

  position:absolute;

  left:0px;

  top:32px;

}

.menu ul a:hover ul{

  visibility:visible;

}

.menu ul ul li {

  clear:both;/*垂直显示*/

  text-align:left;

}

web前端开发学习Q-q-u-n: 731771211,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频)

发现二级菜单在firefox与safari与chrome中没有反应,弹不出来(这三个浏览器的CSS部分互相抄袭严重啊)。opera10表现得最好,IE8其次。不过,标准浏览器的所有元素都支持hover伪类,不像IE6,非带href的a元素不可。我们改写部分CSS代码:


.menu ul li:hover ul,/*非IE6*/

.menu ul a:hover ul{/*IE6*/

  visibility:visible;

}

二级菜单能弹出来了,但那个神秘的li元素也现形了。我用双重浮动的收缩包围(shrink-wrapping)现象都无法消除这个神秘的li元素。参考外国的代码,方法是,把整个子菜单放到a元素的外面,然后用li:hover控制样式的切换。于是结构层改写如下:


<div class="menu">

  <ul>

    <li>

      <a href="http://www.cnblogs.com/rubylouvre/">菜单一 </a>

      <ul>

        <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li>

        <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li>

      </ul>

    </li>

    <li>

      <a href="http://www.cnblogs.com/rubylouvre/">菜单二</a>

      <ul>

        <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li>

        <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li>

      </ul>

    </li>

    <li>

    //***************略************

    </li>

    <li>

    //***************略************

    </li>

  </ul>

</div>

原文地址:https://blog.51cto.com/14592820/2446535

时间: 2024-10-22 11:02:35

CSS多级菜单的相关文章

html css 多级菜单实例

<!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> <title></title> <st

实用js+css多级树形展开效果导航菜单

<!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-Typ

JavaScript+CSS多级树形展开菜单的代码

JavaScript+CSS多级树形展开菜单的代码,本例是应用别人的例子,原来那位老兄是用一般方法写成的无限级折叠菜单,在此先感谢他!后来我就通过了一些简化修改,将原来的例子改成了面向对象的方式,实例中的展开与闭合的小图标可以自己重新添加,从而更好的查看效果. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-tra

前端开发css实战:使用css制作网页中的多级菜单

前端开发css实战:使用css制作网页中的多级菜单 在日常工作中,大家都会遇到一些显示隐藏类菜单,比如页头导航.二维码显示隐藏.文本提示等等......而这些效果都是可以使用纯css实现的(而且非常简单),使用css的优势显而易见,它可以使页面中的javascript变得更少. 实现逻辑: 核心:hover伪类控制子元素的显示隐藏,添加css3动画;  (没错就是这样简单) :hover伪类,适用于当用户指向一个元素时,例如用户的鼠标指向一个段落p.当用户鼠标离开元素时,恢复元素原有的样式显示

zTree下拉菜单多级菜单多选实现

惯例,先上图: 这是在一个项目中,为了满足样式美观.多级菜单以及多选而将zTree插件更改过后的效果. 在实际的开发过程中,本来zTree也是可以满足需求的,但是zTree多选的话需要checkbox选择框,这样导致样式风格和项目总体不一致.下面是根据ztree所修改的内容. 如上图 这是个outlook样式的菜单. 我们只需要简单的右键,查看代码,就可以把源码拿下来看看. 我们需要的源码如下: <SCRIPT type="text/javascript"> <!--

纯CSS实现树状结构导航,纯CSS折叠菜单,简单粗暴,就是这么强大

在对网站进行mip改造的时候,使用百度的导航组件,很难有较好的展现形式. 百度又不允许自定义JS,所以,考虑增加CSS(是在百度组件的基础上增加JS),用css补充实现点击功能,实现精美的导航. 最终结果是为了实现以下三个样式 1.未展开状态 2.展开状态,有二级导航的,要出现+号 3.点击+号能展开二级菜单 参考以下树状CSS的设计思路,主要是使用 html5的 details summary标签,注意看注释 演示图如下  代码如下 <!DOCTYPE html> <html xmln

day1作业二:多级菜单

    作业二:多级菜单 1.三级菜单 2.可以次选择进入各子菜单 3.所需新知识点:列表.字典 4.打印b回到上一层 5.打印q退出循环 流程图如下: readme: (1)存储三级菜单的字典;设置标识符active用来循环: (2)生成存储省市的字典,d1 = {1: '河南', 2: '广东', 3: '湖南'}; (3)用户输入查询编码,如果用户输入q退出循环:如果用户输入小于1或大于3则重新输入:输入编码在range(1,4)中,则输出省,并继续循环; (4)生成存储市的字典d2 =

python 多级菜单进入城市

python 多级菜单  可实现功能有:进入子菜单 返回上一级菜单 退出菜单 帮助  #/usr/bin/env python3 # -*- encoding: utf-8 -*- # Auther:yooma 2016-08-14 22:00 import sys execLaye = {1:{"北京":{1:{"东城":{1:{"建国门":{1:"建国门大厦",2:"门建国大厦"}},2:{"

2 纯CSS的菜单

使用纯CSS实现菜单的原理:将下拉框隐藏,当鼠标在菜单时显示隐藏的菜单. html代码: <nav> <ul> <li> <a>菜单1</a> <ul> 子菜单.... </ul> </li> </ul> </nav> 核心CSS代码 nav ul li:hover > ul { display: block; } nav li ul { display: none; positi