下拉菜单仍然是Web上流行的界面元素,虽然有一些纯Javascript 解决方案,但在禁用Javascript 的浏览器下,它却无能为力。因此,纯CSS的下拉菜单才是最好的选择。

这种技术及其简单,只需把子导航嵌套在无序列表中,并让子导航默认隐藏,然后当鼠标悬停或点击父列表时,再让它显示出来。

本节,在上一节主导航的基础上,添加子导航,来演示下拉导航的制作方法。主导航的样式保持不变,这里只介绍子导航的样式。首先,创建多级导航列表。

  1. <ul class = "mainnav">
  2.    <li><a href="#">文件</a>
  3.        <ul class = "submenu">
  4.        <li><a href="#">新建</a></li>
  5.        <li><a href="#">打开</a></li>
  6.        <li><a href="#">保存</a></li>
  7.        </ul>
  8.    </li>
  9.    <li><a href="#">编辑</a></li>
  10.    <li><a href="#">查看</a></li>
  11.    <li><a href="#">收藏夹</a></li>
  12.    <li><a href="#">工具</a></li>
  13.    <li><a href="#">帮助</a></li>
  14. </ul>

与主导航相同,首先需要重置列表的默认样式,将外边距、内边距设置为 0,并去掉默认的项目符号。

  1. .submenu {
  2.    margin: 0;
  3.    padding: 0;
  4.    list-style: none;
  5. }

由于在主导航中让所有 li 向左浮动,子导航中,需要子导航垂直显示。因此,需要让子导航中的 li 样式不再浮动。

  1. .submenu li {
  2.    float: none;
  3. }

接下来,把子导航中链接的 display 属性设置为 block,以便在链接区域的任何位置都能激活链接。再设置链接的宽度、默认属性、以及鼠标悬停时的属性。

  1. .submenu li a {
  2.    color: #000;
  3.    padding: 4px 0;
  4.    font-size: 13px;
  5.    display: block;
  6. }
  7. .submenu li a:hover {
  8.    color: #fff;
  9.    background: #4899E0;
  10. }

子导航样式设置完成后,就可以通过 display: none 把子导航隐藏起来。当鼠标悬停在主导航的 li 上时,再通过 display: block 把子导航显示出来。

  1. .mainnav li:hover .submenu {
  2.    display: block;
  3. }

由于子导航在普通流中定位,会占用父元素的空间。因此,如果子导航使用绝对定位,它就会脱离文档流,不再占用父元素的空间。这样的话,在子导航被显示出来时,父元素的高度就不会被撑开。

  1. .submenu {
  2.    padding: 0;
  3.    list-style: none;
  4.    display: none;
  5.    position: absolute;
  6. }

至此,纯CSS的下拉菜单就制作完成了,快来看看效果吧!

图6-16 二级下拉导航

这里只是演示了二级下拉菜单的制作过程,当然,也可以制作三级、四级,甚至更多级的下拉菜单。假如在二级菜单下,又添加三级下拉菜单:

  1. <li><a href="#">查看</a>
  2.    <ul class = "submenu">
  3.    <li><a href="#">工具栏</a></li>
  4.    <li><a href="#">转到</a>
  5.        <ul class = "drop">
  6.        <li><a href="#">后退</a></li>
  7.        <li><a href="#">前进</a></li>
  8.        </ul>
  9.    </li>
  10.    </ul>
  11. </li>

无论多少级菜单,其本质完全相同,制作方法也没什么差别。都是让子菜单使用绝对定位,并默认隐藏起来,当鼠标悬停在上一级菜单上时,再自动将下级菜单显示出来。

  1. .drop {
  2.    left: 100%;
  3.    display: none;
  4.    list-style: none;
  5.    background: #ccc;
  6.    position: absolute;
  7. }
  8. .submenu li:hover .drop {
  9.    display: block;
  10.    margin-top: -27px;
  11. }

添加三级菜单后的运行结果如图 6‑17 所示:

图6-17 三级下拉导航

上述这种技术制作出来的下拉导航,可以适用于大多数现代浏览器,但在IE7及以下版本中,存在易用性问题。

一个问题是,在IE7及以下版本中,多级列表中,下级列表的位置会发生偏移,导致二级和三级菜单的位置不正确。可以通过 CSS hack 对二级和三级列表进行修正,偏移的距离,要根据实际情况确定,而IE6与IE7偏移的距离可能会不同,需要单独修正。

  1. .mainnav li:hover .submenu {
  2.    display: block;
  3.    *margin-top: 38px;
  4.    *margin-left: -88px;
  5.    _margin-top: 40px;
  6.    _margin-left: -84px;
  7. }
  8. .submenu li:hover .drop {
  9.    display: block;
  10.    margin-top: -27px;
  11.    *margin-top: 0;
  12.    *margin-left: 0;
  13. }

另一个问题是,在IE6中,当鼠标悬停在主导航的 li 上时,子导航却不能正常显示出来,因为IE6不支持在非锚元素上使用 :hover 伪类选择器。因此,需要使用 Javascript 或 .htc 文件来启用这个功能。

.htc 文件实际上就是脚本文件,只有IE能够识别它。 在网上下载csshover.htc 文件,把它放在网站的某个位置,然后,在 body 选择器中通过 behavior 属性指向该文件即可。

  1. body {
  2.    behavior: url("http://XXX/csshover.htc");
  3. }

还有一个问题,就是上述每个 li 后面有一个回车,在IE6中,当 li 中的内容是一个 a 元素,并且 a 元素或 a 元素的子元素(如,<img/>元素)设置了display: block 时,浏览器将不会忽略 li 之间的空白字符,表现为在 li 之间有一个额外的空行。

这个问题有两种解决办法:一种方法是避免为 li 中的 a 元素或 a 元素的子元素设置display: block,或去掉 li 后面的回车;另一种方法是就是让 a 元素或 a 元素的子元素触发布局,常用的就是通过 _zoom: 1 触发布局,因为它没有副作用。

我们使用第一种方法,让二级、三级等列表中的链接使用display: inline-block,这样既不影响链接的点击区域,又可以消除 li 之间的额外空行,可谓一举两得。

  1. .submenu li a {
  2.    color: #000;
  3.    font-size: 13px;
  4.    padding: 4px 0;
  5.    display: inline-block;
  6. }

至此,我们的三级下拉导航才算真正制作完成,它在所有的浏览器下都表现正常,并且表现完全一致。

关于作者

歪脖先生,十五年以上软件开发经验,酷爱Web开发,精通 HTML、CSS、JavaScript、jQuery、JSON、Python、Less、Bootstrap等,著有《HTML宝典》、《揭秘CSS》、《Less简明教程》、《JSON教程》、《Bootstrap2用户指南》、《Bootstrap3实用教程》,并全部在 GitHub 上开源。

CSS 制作下拉导航相关推荐

  1. 使用CSS制作下拉菜单样式

    CSS制作下拉菜单 制作tooltip显示形式 代码示例 实现原理 HTML 部分 CSS 部分 制作可点击的下拉菜单 实现原理 代码示例 Appdex 制作tooltip显示形式 代码示例 < ...

  2. 怎么在html5中制作下拉导航栏,在PPT中制作下拉式导航菜单效果的方法

    为了提高PPT演示文稿的观赏性,用户可能希望在PPT幻灯片中添加下拉式导航菜单效果,通过该导航菜单在不同幻灯片间进行导航(如图1所示),制作下拉式导航菜单的具体操作步骤如下. 图1 下拉式导航菜单 ( ...

  3. 完全使用CSS制作下拉菜单

    在Blueidea看到的一段完全使用CSS制作的下拉菜单,绝对的强~因此收藏了一下. 这个样式最大的收获就是CSS也可以像JS一样,使用例如:div.open,a.outer:hover之类实现类似于 ...

  4. 使用 CSS 创建下拉导航栏

    下拉菜单有一个可以通过单击选择的项目列表.我们可以使用 HTML 元素和 CSS 创建一个下拉列表.所以,让我们学习创建一个下拉菜单. 创建下拉列表 可以使用<div>容器和<but ...

  5. Java制作二级导航菜单_纯CSS实现超简单的二级下拉导航菜单代码

    本文实例讲述了纯CSS实现超简单的二级下拉导航菜单代码.分享给大家供大家参考.具体如下: 这是一款纯CSS菜单,二级下拉导航效果,是最简洁的CSS导航菜单,兼容性也很棒,IE7/8.火狐等都支持,而且 ...

  6. 纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器)

    原文:纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器) 虽然网上类似甚至相同的案例有很多,但是我还是写下,以记下笔记,也可供大家参考 希望大家可以指导批评~~ 首先我们以列表ul ...

  7. html京东下拉菜单设置,div css下拉导航菜单(图+演示)

    div css下拉导航菜单(图+演示),div css下拉导航菜单,css导航菜单下拉 CSS导航菜单(CSS下拉菜单演示图) 查看演示-CSS下拉菜单样式:下拉导航菜单/ 以下有DIV CSS下拉菜 ...

  8. html css 导航 左右滑动效果代码,HTML+CSS/CSS3实现滑动下拉导航栏

    HTML+CSS/CSS3实现滑动下拉导航栏 纯css实现的滑动下拉导航栏,超详细代码,以及实现中遇到的小问题 首先创建一个列表以及一些标签的全局样式 html代码 css代码 * { margin: ...

  9. 自制纯css下拉导航

    自己动手用纯css写了一个下拉导航,下面把代码呈上.主要用到了伪类,相对定位,绝对定位的知识. <doctype html> <html> <head> <m ...

最新文章

  1. Apriori关联规则算法
  2. ESP8266开发笔记
  3. 数据结构与算法——递归、回溯与分治
  4. opensource项目_最佳Opensource.com:业务
  5. linux系统组成之小型RedHat little linux制作二
  6. Python 操作 Windows 粘贴板
  7. ES6学习(八)—Promise对象 超鸡重要
  8. ssm项目之sql查询的问题
  9. codeblocks16.01 中配置Opencv3 姿势
  10. 洛谷 - P1012 - 拼数 - 排序
  11. 14.卷2(进程间通信)---System V 共享内存区
  12. iPhone X/XS/XR/XS Max 的屏幕适配
  13. 量子计算机和量子纠缠的关系,科普:什么是量子纠缠和量子计算?
  14. establish connection
  15. 码住!Elsevier-最全清样/校样(Proof)处理流程
  16. 纪念半个月的旷课生活~
  17. 计算机硬件及冯诺伊曼结构
  18. Python——requests模块详解
  19. Axis2用法(1)JAVA2WSDL和WSDL2JAVA
  20. Mac和iPhone的浏览器接力功能。如何不利用safari接力。

热门文章

  1. Linux下如何查看tomcat是否启动
  2. 【转载】消息队列RabbitMQ入门介绍
  3. ubuntu右键添加打开终端的快捷菜单
  4. 为什么说string是引用类型,但是又有值类型的特点呢?
  5. 新浪微博开放平台深度历险
  6. JavaWeb前台异常处理
  7. 为什么c相电路在前面_Buck电路的多角度分析
  8. oracle plsql递归查询语句,oracle with 语句实现递归查询
  9. sonarqube+jenkins 构建代码质量管理平台
  10. 基于MHA+semi sync实现mysql数据库的高可用