CSS:响应式的导航菜单

最近我写了一点资料关于怎样制作一个响应式的移动导航栏,现在我发现了一个新的技术(有关HTML5)可以在没有使用Javascript的情况下做一个响应式菜单。这个菜单可以自动排列到左边、中间或者右边)。不像之前的教程需要点击某“开关”来显示或隐藏菜单,现在只需要把鼠标移到菜单按钮就会出现菜单列表(而且会提示当前所在的导航位置)。它可以在所有移动设备和桌面浏览器(包括IE)正常使用!

Demo地址:http://webdesignerwall.com/demo/responsive-menu/ (用手机浏览器访问,或者缩小浏览器窗口访问)

目的

这篇文章的目的是向你展示怎样让一个菜单列表在小屏幕时自动转换成有规律的下拉列表菜单。

这个技巧对于那些有很多链接链接项的导航栏是很有用的,因为你可以让它们全部整合到一个下拉列表框控件中。

Html代码

下面是导航的Html元素。<Nav>标签是通过CSS的绝对定位属性来请求创建一个下拉列表框,我会在文章结尾解释这个做法。.current class标志它是一个当前所在的菜单导航位置。

[html][/html] view plaincopyprint?

  1. <nav class=”nav”>
  2.     <ul>
  3.         <li class=”current”><a href=”#”>Portfolio</a></li>
  4.         <li><a href=”#”>Illustration</a></li>
  5.         <li><a href=”#”>Web Design</a></li>
  6.         <li><a href=”#”>Print Media</a></li>
  7.         <li><a href=”#”>Graphic Design</a></li>
  8.     </ul>
  9. </nav>

CSS代码

这个导航CSS代码很容易看懂,就不说细节了。需要注意我给nav<li>使用 displa:inline-block替换了 float:left 。这样允许菜单按钮通过在<ul>的元素 text-align在指定位置显示。

[html][/html] view plaincopyprint?

  1. /* nav */
  2. .nav {
  3.     position: relative;
  4.     margin: 20px 0;
  5. }
  6. .nav ul {
  7.     margin: 0;
  8.     padding: 0;
  9. }
  10. .nav li {
  11.     margin: 0 5px 10px 0;
  12.     padding: 0;
  13.     list-style: none;
  14.     display: inline-block;
  15. }
  16. .nav a {
  17.     padding: 3px 12px;
  18.     text-decoration: none;
  19.     color: #999;
  20.     line-height: 100%;
  21. }
  22. .nav a:hover {
  23.     color: #000;
  24. }
  25. .nav .current a {
  26.     background: #999;
  27.     color: #fff;
  28.     border-radius: 5px;
  29. }

居中和居右

你可是使用 text-align 属性来改变按钮的对齐方式

[html][/html] view plaincopyprint?

  1. /* right nav */
  2. .nav.right ul {
  3.     text-align: right;
  4. }
  5. /* center nav */
  6. .nav.center ul {
  7.     text-align: center;
  8. }

IE支持

IE8及以下版本不支持HTML5的<nav>标签和媒体查询,可以通过包含css3-mediaqueries.js (或者respond.js) 和html5shim.js 来提供可降级支持。如果你不想使用html5shim.js,你也可以使用<div>标签来代替<nav>标签。

[html][/html] view plaincopyprint?

  1. <!–[if lt IE 9]>
  2.     <script src=”http://css3-mediaqueries-js.googlecode.com/files/css3-mediaqueries.js”></script>
  3.     <script src=”http://html5shim.googlecode.com/svn/trunk/html5.js”></script>
  4. <![endif]–>

响应式

有趣的地方来了—通过媒体查询使菜单可响应!如果你对响应式设计还不是很熟悉,可以先看下我之前的文章responsive design 和 media query 。

在低于600px时进行断点判断,设置nav元素的position属性值为relative,将<ul>菜单列表position属性值设为absolute然后显示在顶部。通过 display:none 隐藏所有<li>元素,但保持类为 .current的<li>元素让它作为一个区域显示。然后在hover (鼠标移上去时执行)设置所有<li>重新显示出来(产生下拉列表的效果)。添加一个icon图在.current元素表明它是现在在访问的活动区域。访问demo看下最终效果。【这段的翻译好难~真想按自己的话说了算了~~】

[html][/html] view plaincopyprint?

  1. @media screen and (max-width: 600px) {
  2.     .nav {
  3.         position: relative;
  4.         min-height: 40px;
  5.     }
  6.     .nav ul {
  7.         width: 180px;
  8.         padding: 5px 0;
  9.         position: absolute;
  10.         top: 0;
  11.         left: 0;
  12.         border: solid 1px #aaa;
  13.         background: #fff url(images/icon-menu.png) no-repeat 10px 11px;
  14.         border-radius: 5px;
  15.         box-shadow: 0 1px 2px rgba(0,0,0,.3);
  16.     }
  17.     .nav li {
  18.         display: none; /* hide all <li> items */
  19.         margin: 0;
  20.     }
  21.     .nav .current {
  22.         display: block; /* show only current <li> item */
  23.     }
  24.     .nav a {
  25.         display: block;
  26.         padding: 5px 5px 5px 32px;
  27.         text-align: left;
  28.     }
  29.     .nav .current a {
  30.         background: none;
  31.         color: #666;
  32.     }
  33.     /* on nav hover */
  34.     .nav ul:hover {
  35.         background-image: none;
  36.     }
  37.     .nav ul:hover li {
  38.         display: block;
  39.         margin: 0 0 5px;
  40.     }
  41.     .nav ul:hover .current {
  42.         background: url(images/icon-check.png) no-repeat 10px 7px;
  43.     }
  44.     /* right nav */
  45.     .nav.right ul {
  46.         left: auto;
  47.         right: 0;
  48.     }
  49.     /* center nav */
  50.     .nav.center ul {
  51.         left: 50%;
  52.         margin-left: -90px;
  53.     }
  54. }

标签