admin 管理员组

文章数量: 1087829


2024年3月5日发(作者:mysql黑色下载)

ISSN 1O08—9446 承德石油高等专科学校学报 Journal of Chengde Petroleum College 第15卷第1期,2013年2月 Vo1.15,No.1,Feb.2013 7面 深入研究CSS下拉菜单 姚 朋 (承德石油高等专科学信息中心,河北承德067000) 摘要:随着Web技术的发展,网页结构向着更加标准化的方向发展已经成为趋势。同时随着现代主流浏览器 对CSS标准更加全面地支持,CSS在网页设计中表现层的位置终于得到重视,其强大的功能也正在得到不断 深入的发掘和应用。一个典型的例子就是以前使用JavaScript等技术实现的下拉菜单,现在用CSS就可以轻 松地实现了,并可以兼容当前所有主流的浏览器。 关键字:CSS;下拉菜单;兼容IE6 中图分类号:TP311 文献标识码:A 文章编号:1008-9446(2013)01—0032—04 Drop-down Menu by CSS YA0 Peng (Information Center,Chengde Petroleum College,Chengde 067000,Hebei,China) Abstract:As web technology develops,the web page structure is developing towards a more stand— ardized direction.As the mainstream browser is supporting CSS standards more than before,CSS is inviting more attention in web design and its strong function is also being exploited and applied.A typical example is the previous use of JavaScript technology to dropdown menus,SO we can now use CSS to achieve this,which is compatible with all the current popular browsers. Key words:CSS;a drop—down menu;compatible IE6 1 CSS下拉菜单的基本要素和工作原理 用CSS实现下拉菜单,需要解决两个基本问题。第一个是当鼠标停留在一级菜单上时,CSS要能够 响应这个鼠标事件。第二个是在CSS响应这个鼠标事件的时候,让原来处于隐藏状态的二级子菜单显 示出来。在CSS标准中,:hover这个伪类正好可以响应当鼠标停留在某一网页元素上时这样一个鼠标 事件,于是第一个问题解决了。要通过:hover这个伪类提供的鼠标事件进行处理,来显示二级子菜单, 就需要使用CSS包含选择符了¨ 。CSS包含选择符的功能是可以通过某一网页元素控制包含在其中网 页元素的样式。这时,用CSS制作下拉菜单的两条要素已经具备了。因此CSS下拉菜单的基本工作原 理就是:通过为一级菜单的网页元素设置:hover伪类来触发鼠标事件,然后在这个事件中利用CSS包含 选择符显示嵌套在一级菜单元素中的二级子菜单。根据这个原理,也可以制作出多级CSS下拉菜单。 2 主要XHTML和CSS代码 2.1主要XHTML代码 <ul class=”menu”> <li><a href=””>首页</a> <! 一一[if h IE 7]><div><a href=””>首页<table><tr><td><![endif]一一> <ul> <li class=”border—top”><a href=””>十二五规划</a></li> 收稿日期:2012—04—24 作者简介:姚朋(1978一),男,陕西西安人,承德石油高等专科学校信息中心助理馆员。 

姚朋:深入研究css下拉菜单 ・33・ <li><a href=…’>创先争优</a></li> <li><a href=… >学校邮箱</a></li> <li><a href=””>对外主页</a></li> <li><a href= ’>学校简报</a></li> <li class=”border—bottom”><a href= ’>校内通知</a></li> </ul> <! 一一[if h IE 7]></td></tr></table></a></div><! [endif]一一> </li> <li><a href=””>管理机构</a> ……省略类似代码 </li> <li><a href=””>教学系部</a> ……省略类似代码 </li> <li><a href=…’>专题网站</a></li> </ul> 2.2主要CSS代码 .menu{ / 一级菜单容器 / width:900px; / 兼容IE和Opera浏览器,解决一级菜单自动换行 / height:22px; /¥ 兼容火狐和欧朋浏览器,解决margin不解析问题 / list—style:none; font—size:12px; } .menu li{ lfoat:left; position:relative; / 相对定位,为二级子菜单定位提供参照 / } .menu li:hover ul, menU li a:hover ul/ 响应鼠标停留事件,显示二级下拉子菜单 { visibility:visible; menU a { / 定义一级菜单中的超链接 / display:block; width:60px; margin:1px 1px 1px 1px; border:1 px solid#696969; padding:2px 2px 2px 2px; background:#eeeeec; color:#0O0; text—decoration:none; text—align:center; } :-c/ 

・34・ 承德石油高等专科学校学报 2013年第l5卷第1期 menu ul{ list—style—type:none; visibility:hidden; position:absolute; left:1px; / / / 二级子菜单容器 / 在没有鼠标事件被触发的时候,隐藏二级子菜单 / 二级子菜单相对于父元素li绝对定位 / / 定位二级子菜单的顶部边框紧贴一级菜单的底部边框 通过padding设置与一级菜单的间距 / / top:21px; } .padding:3px 0 0 0; / menu li div{ position:absolute; left:0px; top:0px; / IE6中一级菜单的定位容器,覆盖标准浏览器的一级菜单 / .menu table{ display:inline; } /:l:消除表格对IE6中一级菜单高度的影响。 / 2.3关键XHTML代码分析 以上的XHTML代码(除了IE的条件注释以外)的结构很简单,一级菜单容器.menu使用了一个无 序列表,每个二级子菜单也使用一个无序列表嵌套在相应的一级菜单的列表项之内,所有代码符合 XHTML的标准。 这段XHTML代码看起来复杂的地方是其中的IE条件注释,引入IE条件注释,是为了兼容IE6,原 因是IE6只支持a:hover伪类,而不支持其它网页元素的:hover伪类。在国内,截止2012年3月份,IE6 的使用率为22.40% ,所以尽管它对CSS标准的支持不如现代标准浏览器,却暂时还不能忽视它的存 在。IE的条件注释是微软从IE5开始引入网页中的一种非标准逻辑语句,它只能为IE浏览器所识别, 其它非IE浏览器则把它当做注释语句忽略掉,因此可以用它来编写针对某个版本IE浏览器的HTML 代码 。因此兼容IE6的方法就只能把二级子菜单嵌套在一个超链接之内,虽然这不符合XHTML标 准。但是不能直接把二级子菜单嵌套在原有一级菜单的超链接里,而是要通过IE条件注释为IE6增加 一个新的一级菜单的超链接,包含在二级子菜单的外面,然后通过绝对定位,覆盖原有的一级菜单。这 样做既可以兼容IE6,又可以使这段XHTML代码在现代标准浏览器里符合标准。以上IE条件注释语 句的意思是:当IE浏览器的版本小于IE7的时候,向网页中添加包含在条件注释中的XHTML代码。所 添加的这些XHTML代码的作用包括:1)在二级子菜单容器的无序列表外部添加表格,解决IE6二级子 菜单的无序列表的问题。2)把这个表格嵌套进超链接里,解决IE6不支持li:hover伪类的问题。3)为 超链接添加一个div容器,解决超链接不能正确显示和定位的问题。 2.4核心CSS代码分析 二级子菜单虽然嵌套在一级菜单的列表项之内,但其能否正常显示,相对于一级子菜单的位置是一 个关键因素。在现代标准浏览器中,只有当二级子菜单的顶部边框与一级菜单的底部边框紧贴或与一 级菜单的底部margin有重合时,鼠标在从一级菜单移动到二级子菜单的过程中,二级子菜单才不会消 失。其次是二级子菜单容器的无序列表UL必须绝对定位,这样它就不会占用在文档流中的当前位置, 而且还可以浮动显示在其它内容之上。由于二级子菜单的定位父元素是一级菜单,所以一级菜单容器. menu中的h要设置为相对定位。为了使二级子菜单的顶部边框正好可以紧贴着一级菜单的底部边框, 需要知道一级菜单的精确高度。根据盒模型,一级菜单的高度是由其中块状显示的超链接的高度决定 的,计算结果是20像素,包括外边框,也就是margin部分。但在IE浏览器中,一级菜单的实际高度是 

姚朋:深人研究CSS下拉菜单 ・35・ 22像素,多了2像素,可以看出IE浏览器并没有严格按照盒模型来计算。绝对定位二级子菜单与父元 素顶部的距离为21像素,使二级子菜单的顶部边框紧贴着一级菜单的底部边框。 默认状态下,在一级菜单的鼠标事件没有被触发的时候,二级子菜单处于隐藏状态,即设置visibili— ty:hidden属性。当鼠标停留在某个一级菜单上时,对应的li:hover伪类响应这个鼠标事件,通过包含 选择符,设置其包含的二级子菜单ul的visibility:visible属性,使二级子菜单显示出来。由于二级子菜 单是嵌套在一级菜单之内的,所以当鼠标离开一级菜单的超链接,移动到二级子菜单之上时,二级子菜 单仍然会显示,而当鼠标移走之后,二级子菜单又会恢复默认的隐藏状态。对比用JavaScript实现的下 拉菜单,CSS的工作方式就显得非常的简洁,从这个例子也可以看出,CSS的某些功能和JavaScript是有 重合的。 2.5 兼容IE6的CSS代码分析 为了兼容IE6,在XHTML代码中通过IE条件注释增加了一些代码,在CSS中也要对其进行相应的 控制。第一是把包含一、二级菜单的div容器绝对定位,覆盖标准浏览器下显示的一级菜单。第二是把 嵌套在超链接中的表格设置为内联显示,消除表格对IE6中一级菜单高度的影响,使其与现代标准浏览 器一致。 3 其它问题 3.1兼容问题 一级菜单容器.menu类的宽度要显式定义,否则当其实际宽度大于IE和Opera浏览器窗口时,会 自动换行显示。一级菜单容器.menu类的高度也要显式定义,否则Firefox和Opera浏览器不能正确解 析它与和其后内容之间的margin值。根据盒模型分析这个问题的原因应该是:Firefox和Opera没有根 据一级菜单容器.menu所包含的超链接的高度来计算.menu容器的高度,而是直接认为它的高度为零, 所以其后的内容就向上流动,直到被一级菜单挡住,从而导致margin属性失效。二级子菜单中的列表 项或超链接不能设置marign值,否则鼠标在经过margin区域时二级子菜单可能会消失。 3.2一、二级菜单间距的调节 一般情况下,二级子菜单是紧贴着一级菜单的底边框显示的,也可以制作二级子菜单和一级子菜单 之间有一定空隙的效果。在现代标准浏览器里,这个效果可以很容易的通过一、二级菜单之间的margin 值调节,但是IE6不支持这种方法。为了兼容IE6,可以通过设置子菜单容器ul的padding.top属性来调 节一、二级菜单之间的空隙。但如果希望显示效果如图1那样有一个边框,就不能直接设置子菜单容器 ul的边框,而是要通过设置其内部li元素的左右边框、首个li元素的顶部边框和末尾li元素的底部边框来 模拟一个边框。使用padding调节一、二级菜单间距的另一个问题是这个距离最大不能超过5像素。 4 结束语 以上介绍的CSS下拉菜单可以兼容国内外各种主流的浏览器。除了下拉菜单,使用CSS还可以实 现选项卡、图片切换、圆角等很多功能。随着Web标准化的进程和现代标准浏览器对CSS标准更多的 支持,CSS将能在网页中完成更多和更炫目的功能。如今,有越来越多的网页设计者开始关注和研究 CSS,将来CSS在网页设计中的表现将会更加出色。 参考文献: [1] 侯利军.精通Web标准网页布局一xHTML+CSS+JavaScfipt[M].北京:人民邮电出版社,2007 [2] 浏览器之家[EB/OL].http://www.1iulan7.net/a/top/2012/0402/6547.htm1. [3] 朱印宏.CSS商业网站布局之道[M].北京:清华大学出版社,2007. 


本文标签: 菜单 显示 浏览器 网页 鼠标