网站导航菜单的分割线和水平居中

所属分类: 网页制作 / CSS 阅读数: 2056
收藏 0 赞 0 分享

写这篇啰嗦的文章,缘由来自于Jorux Notebook的《什么是Semantics?》文章。

实际上,从《网站重构》一书开始在国内流行之后,Zeldman提出的语义化标记就已经在一定程度上流传开来。在抛弃table布局页面之后大家突然发现,原来这还不够,随意地使用<p>或者<div>来进行布局实际上和table布局一样的糟糕。

Jorux的例子(如下):

我是老大 | 我是不好意思说 | 老三 | 老四在这里 | 老幺

Jorux指出,在这种极为普遍的导航样式中(通常是用于网站底部的信息导航,100个网站里有90个采用这样的模式),我们应该使用无序列表,而不是下面这种:

   1:  <p>
   2:  <a href=”home.html>首页</a> | 
   3:  <a href=”about.html>关于</a> | 
   4:  <a href=”blog.html>博客</a> | 
   5:  <a href=”message.html>留言</a> | 
   6:  <a href=”album.html>相册</a>
   7:  </p>

甚至是使用了<ul>,但是依然将修饰线条作为内容元素的写法也是五十步笑百步:

   1:  <ul>
   2:  <li><a href=”home.html>首页</a></li>
   3:  <li>|</li>
   4:  <li><a href=”about.html>关于</a></li>
   5:  <li>|</li>
   6:  <li><a href=”blog.html>博客</a></li>
   7:  <li>|</li>
   8:  <li><a href=”message.html>留言</a></li>
   9:  <li>|</li>
  10:  <li><a href=”album.html>相册</a></li>
  11:  </ul>


遗憾的是,内容与样式分离web标准化建设的推进道路总是充满了各种各样的阻碍。即使是新浪和淘宝在它们的页面底部也存在着上述的情况。

先来看新浪的截图:

image

代码(简略了内容):

   1:  <div style="padding-bottom:6px;">
   2:      <a href="">新浪简介</a>
   3:      <a href="">About Sina</a>
   4:      <a href="">广告服务</a>
   5:      <a href="">联系我们</a>
   6:      <a href="">诚聘英才</a>
   7:  </div>

为什么要这么做,有过网页制作经验的朋友大概会了解。网站底部的导航通常都是以比较简单的文本形式出现,居中,再附加一些修饰——大部分都是“|”和“·”或者“—”。html部分采用新浪的做法,节省了编写css的时间,最重要的是让一切水平居中显示将是非常简单的事情。只需要将<div>的text-align设置为center就万事大吉。

这里需要讨论的是,到底使用什么标记才算是语义化?

我们没有教科书,任何一本某某权威指南不会写着:你应该使用<ul>和<li>,而不是<div>和<p>来制作导航菜单。也就是说,我认为如果考虑到实际项目的操作,使用前者或后者都不是一个严重到会出现违背XHTML准则的问题。

我们来看淘宝的底部:

image

在我看到,如果按照zeldman的思路,应该这样去写:

   1:  <dl>
   2:      <dt>全球阿里巴巴 - 阿里巴巴网络</dt>
   3:      <dd>
   4:          <ul>
   5:              <li>中国站</li>
   6:              <li>国际站</li>
   7:              ......
   8:          </ul>
   9:      </dd>
  10:  </dl>

但实际上,淘宝的代码是这样:

   1:  <div class="ali-group" style="width:680px;margin:5px auto;">
   2:  全球阿里巴巴 - 阿里巴巴网络:
   3:      <a href="">中国站</a>
   4:      <a href="">国际站</a>
   5:      <a href="">日文站</a> | 
   6:      <a href="">淘宝站</a> | 
   7:      <a href="">支付宝</a> | 
   8:      ......
   9:  </div>

为什么一个如此提倡标准化的UED小组所编写的淘宝代码中也有和Jorux说法相违背,不严格按照语义化标记来操作呢?

因为,这样的水平居中和添加“|”不会那么烦人。

烦人的分割线

不要小看这个“|”,加入这么一个小小的修饰线条,看似简单,实际上还是比较头痛的。

首先我们知道,这个竖线是分割线,是把一个个链接从视觉上分开的一种手段,有多种方式去实现这一个效果:

1、直接插入“|”实体,但这和用空的table来撑开空白一样,是不符合内容和样式分离准则。

2、使用border-right来给每一个链接加上一个1px宽的边框。缺点是这个边框线条的高度定义起来比较讨厌,作为行内元素的a,无法应用到上下内边距来控制高度,勉强使用行高line-height只会让你在实际应用中漏洞百出。

3、使用background来给每一个链接加上一个竖线的图片背景,这种方式在视觉效果上应用灵活,但缺点是会多制作一张图片(尽管你可以CSS Sprites或者你认为一条竖线的图片大小可以忽略不计),同样高度无法定义。

4、使用:after这样的伪类元素,如a:after { content: "|"; }。可以再添加font-size来稍稍控制高度。尽管这样的一种做法被一些css玩家所推崇,毕竟了解的人少,使它看上去比较的高深和复杂。实际上它的缺点也最多。首先,:after在版本8以下的IE中通通免谈,这就意味着大部分浏览者无法看到这样的效果。其次,看上去这一条“|”是由css来控制的样式,实际上它在html中实际生成了内容,本质上和直接在<a>之后插入一个“|”没有区别。

综上所述,我们理应抛弃第一种做法,采用2、3、4中的一种来显示这个分割线效果。然而接踵而至的问题是,不管你用了哪种方法,你都要考虑如何去除最后一个“|”分割线。让导航看上是这样:

我是老大 | 我是不好意思说 | 老三 | 老四在这里 | 老幺

而不是这样:

我是老大 | 我是不好意思说 | 老三 | 老四在这里 | 老幺 |

常用的做法是给div中的最后一个a,或者ul中的最后一个li(或者都是第一个a和li,这取决与你css中的左右位置)添加一个id或者class,例如:

   1:  <ul id="menu">
   2:      ......    
   3:      <li><a href="#">王老五</a></li>
   4:      <li class="last"><a href="#">老幺</a></li>
   5:  </ul>

然后在css添加对这个.last的单独定义,去除它的边框或者背景或者:after生成的content内容。

如此的繁琐,是不是已经开始头大了?

水平居中

从分割线的问题,我们往下讨论导航的水平居中问题。

淘宝的另一个底部导航采用了不让人头大的选择:

image

在这个例子中,HTMl如下:

   1:  <ul class="foot-nav" style="width:690px;_width:695px;">
   2:      <li><a href="">关于淘宝</a></li>
   3:      <li><a href="">广告服务</a></li>
   4:      <li><a href="">合作伙伴</a></li>
   5:      <li><a href="">帮助中心</a></li>
   6:      <li><a href="">诚征英才</a></li>
   7:      <li><a href="">联系我们</a></li>
   8:      <li><a href="">网站地图</a></li>
   9:      <li><a href="">热门品牌</a></li>
  10:  </ul>

这里的采用了标准的写法,没有分割线,没有额外的id或class,没有上面讨论的烦人的各种问题。

然而这种写法意味着,如果将li的display设置block,text-align:center无法轻松的将这个导航水平放置在页面的正中,除非你给ul定义了一个宽度,在上面的代码中淘宝也的确是这样去做的。

如果,导航菜单中的项目数量不能够确定,整体的宽度势必也要成为变量——一个未知宽度。不断地去修改这个width,以确保margin: 0 auto;可以让这个导航水平居中无疑将让你的工作变得琐碎和困难。

未知宽度的水平居中

最简单的方法,就是让每一个li元素不要以block的形式float:left,以inline的方式让它们一字排开,给ul一个text-align:center就可以搞定这一切。

我做了这样一个例子,demo1。为了图省事,我没有做图,采用背景图片的方式显示分割线,而是使用了:after生成content的方法。

在css中的最后,我添加这样两行:

   1:  #menu li:before { content: "|"; padding-right: 10px; }
   2:  #menu li:first-child:before { content: ""; }

这样,在不支持:after的浏览器中,导航以最质朴的方式展现,在IE8和FF这样的浏览器中,分割线将显示出来,最后一个li的分割线将被删除。

上面的方法,在大部分时间还是比较好用的,但如果需要给导航菜单添加更多的效果控制,例如给每一个li添加一个按钮似的背景,我们就必须让li成为块级元素。这个时候,text-align:center就无效了。

好在Stu Nicholls给出了一个解决方案——Centering Float Left Menus。

我做了另一个例子,demo2。

在这样的基础之上,无论你或删或增导航菜单的项目数量,无论你是想给它添加简单背景色,还是添加复杂的圆角框,你都可以从容应对了。

更多精彩内容其他人还在看

Opera中国的WEB标准课程

网页制作Webjx文章简介:在这篇文章里,我要向大家介绍我和其他很多人花费数月时间开发的一个课程——Web标准课程,该课程旨在向大家提供Web设计和开发的坚实基础,无论读者是谁,此教程完全免费、可访问,并且不需要预备知识。当然,我主要还
收藏 0 赞 0 分享

CSS样式表渐进增强的基本概念

网页制作Webjx文章简介:如果你挠着头想弄清楚优雅降级和渐进增强的区别,我告诉你,这是视角问题。优雅降级和渐进增强都考虑网站在各种设备的各种浏览器上如何良好运转。两者区别的关键在于它们各自关注的焦点,以及这种关注对工作流程的影响
收藏 0 赞 0 分享

简单介绍Web Developer插件制作网页

网页制作Webjx文章简介:Firefox浏览器是一个良好支持W3C标准的开放源代码的浏览器,拥有Linux/Windows/Mac版本。因为Firefox浏览器良好支持W3C标准,所以使用Firefox来调试网页是非常好的。 Firefox浏览器是
收藏 0 赞 0 分享

CSS布局带来的巨大影响:CSS display属性值

网页制作Webjx文章简介:网页元素应用上那些与表格相关的display属性值后,能够模仿出与表格相同的特性。我将会在该文中给大家演示这种方法给CSS布局带来的巨大影响。 应原书编辑要求,先在文章顶部给出链接:《Everything You
收藏 0 赞 0 分享

用div css模拟表格对角线

这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点。如果对此深以为然的朋友,请一笑过之 首先声明: 这只是探讨一种CSS模拟表格对角线的
收藏 0 赞 0 分享

IE Firefox在css中的差别 (部分)

1、单位问题 问题:任何距离的数值ie可以不加单位,ff必须要求写单位(0除外) 解决:写全单位如padding:0px; 2、水平居中 问题:div里的内容,ie默认为center,而ff默认left 解决:mairgin:0px auto; 3、高度问题
收藏 0 赞 0 分享

不用js可以实现信息提示效果

[code] <style> body { font:verdena; font-size:14px; color:#000 } h1{ font:verdena; font-size:22px; color:#000 } h2{ font:verdena;
收藏 0 赞 0 分享

CSS解决未知高度的垂直水平居中自适应问题

今天有人问起,晚上试着写出来,供参考; 以下代码兼容主流浏览器IE6、IE7、Firefox、Opera。 从最简单的开始………… 一、如何让一个DIV水平居中? 这个简单不作过多说明! [code] <st
收藏 0 赞 0 分享

CSS cursor 属性 -- 鼠标指针样式效果

取值: [ [<uri> ,]* [ auto | crosshair | default | pointer | move | e-resize | ne-resize | nw-resize | n-resize | se-resize | sw-resize |
收藏 0 赞 0 分享

css 简单区别ie6,ie7,firefox的写法

同一样式里可以这样 [code] margin:17px; FF +margin:17px; IE6 IE7 _margin:17px; IE6 [/code] 按这个顺序,刚好区分开三个浏览器
收藏 0 赞 0 分享
查看更多