导航

毅博客

分享本身就是件快乐的事,我因别人得到帮助而感到幸福

« 《网页设计技巧》系列之三 再谈布局详解链接的rel与target »

倾斜的鼠标翻转导航制作上的烦恼

本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
请大家帮忙:行文措辞难免有错,请大家在阅读时发现错误通过评论方式告诉我。谢谢大家

前天网上有个朋友发给我一个页面让我帮她看一下为什么鼠标翻转实现不了。我打开源文件看了一下,发现她根本没有掌握一个鼠标翻转的特性。并且对于倾斜导航的思考也不足。虽然我当时看出来了这些问题,但是由于手上一个项目正在收尾一时也没有时间向她一个讲解。正好昨天工作忙完了,现在又拿起那个文件看了一下,发现能过这个事件可以讲解好多个知识点,有一些地方比较容易让人不太注意,但是确实是非常关键的。下面我们通过制作一个倾斜的鼠标翻转导航为过程来针对不同的地方做出一些提示,希望可以帮助一些对于鼠标翻转导航制作上还存在疑问的朋友。

 我们先看一下想要实现的效果,当然在没做之前这些只能是存在于我们的脑子或是草图上。我们首先要想到它是个什么样子,然后才能去分析我们想要实理的效果是应该如何去做,闲言少叙,先看图:

我们看到上图,可以会觉得好像并没什么,好像很容易做。好我们来细细的分析一下这个效果。我们用标准来实现就不能直接插入一张图片在HTML里。用标准来做就需要把图片作为背景的方式用CSS进行调用。那么我们来看一下这样的导航是否可以直接就那么直接调用,其中是不是还有什么问题出现?下面请看一下这个导航效果的放大图:

大家注意上图中的“危险区”很明显,如果我们把两个倾斜的正块放在一起就必然会有一段重复区,我们现在的CSS还不支持异形处理。要解决这个问题就必需要使得这两个方块进行重叠。重叠就需要把他们放在不同的层次上。这就要用到CSS中的定位:“position : static | absolute | fixed | relative ”。关于position的详细请查看苏昱的《CSS2中文手册》,关于如何定位请查看我的《解读absolute与relative

做鼠标翻转我们通常会把所有的背景做成一个图,然后通过CSS来设置不同标签下的图片的不同位置。也许有人就会认为这个导航 的背景图应该是这样的:

如果你真的是这么想的那么问题就出来了:当在五个区块中的任一个区块中进行鼠标翻转时,上面的危险区的重复部位就会把左侧和是右侧的导航挡去一个角。所以正常的方式是:

只有这样在没有危险区的情况下才能作为最终的背景图片使用。当然还要注意的是背景并不是白色而是透明的,主要不是为了与网站的背景融合,关键是不要挡住在危险区的相邻的背景。我使用的是GIF图,GIF图有透明的时候边缘会有一点毛边。如果希望应对不同的色彩的网站背景,最好使用PNG或是把GIF图的边缘做成点像素。

对于这个背景图的思考完成之后我们就需要想想怎么制作这个导航了。先来分析一下这个鼠标翻转,原来做鼠标翻转是JS的事,现在可以通过CSS的:hover也可以实现这个翻转效果,代码少、结构清晰。所以这里这五个导航的翻转就是由A:hover来实现。关于a:hover的详细解解释可以查阅一下苏昱的《CSS2中文手册》。

首先我先写下了这个导航的HTML代码,由于是结构,要尽可能的简洁干净:

  1. <ul id="nav">
  2.  <li id="a"><a href="" title="">HOME</a></li>
  3.  <li id="b"><a href="" title="">ABOUT</a></li>
  4.  <li id="c"><a href="" title="">PRODUCT</a></li>
  5.  <li id="d"><a href="" title="">SEVICE</a></li>
  6.  <li id="e"><a href="" title="">FEEDBACK</a></li>
  7. </ul>

由于我们的这个导航每一个区域都不一样所以需要给每个块都加个ID。有了结构了下面就是CSS的部分了。我们这个导航是横向的,那么我们要先让这个UL列表先躺下:

  1. #nav {padding:0; margin:0; width:410px; height:25px; line-height:25px; overflow:hidden; list-style:none; }
  2. #nav li {width:82px; height:25px;  float:left;}

当我把UL放躺下之后突然想到它躺下的姿势不对,为什么呢,因为我们需要的是后一个叠在前一个的尾巴上的效果,而不是脑袋顶着屁股。所以这里需要改成:

  1. #nav {padding:0; margin:0; width:410px; height:25px; line-height:25px; overflow:hidden; list-style:none; position:relative;}
  2. #nav li {width:82px; height:25px; position:absolute; }

 这里的#nav为什么要加一个position:relative; 呢?请查阅《解读absolute与relative》而 padding:0; margin:0; list-style:none;是为了去掉UL前的那个黑点,并且清除浏览器中UL的默认值。你也可以在CSS文件的开头用一句 *{padding:0; margin:0; list-style:none;}来清理一下标签在浏览器中的默认值。把他们放躺下之后我看了一下效果,不得了,所有的链接全都合到一起了。因为所有的LI都被定义成为绝对值大家都跑到原点对齐去了。我们需要把他们分开。所以接着写CSS把他们都分开:

  1. #a {left:0px; top:0px; }
  2. #b {left:79px; top:0px;}
  3. #c {left:158px; top:0px;}
  4. #d {left:237px; top:0px;}
  5. #e {left:316px; top:0px;}

我们发现他们的TOP值都是0,为了让代码少一点我们把CSS再做一次修改:

  1. #nav {padding:0; margin:0; width:410px; height:25px; line-height:25px; overflow:hidden; list-style:none; position:relative;}
  2. #nav li {width:82px; height:25px; position:absolute;  top:0px;}
  3. #a {left:0px;}
  4. #b {left:79px;}
  5. #c {left:158px;}
  6. #d {left:237px;}
  7. #e {left:316px;}

都已经区分开,下面就是加背景图片了。这里要注意:图片要加在A标签上,如果不然可能就会出现错误。当然也可以放在UL背景或是li上,但是那样做法、图片就都不一样了,可能也不太好理解。这里只以放在A标签上。

  1. #nav a {width:82px; height:25px; padding:30px 0 0 ; overflow:hidden; display:block; background:url(bg.gif) no-repeat;}

这里我们把A标签也定义为宽为82高为25的方块,这里要注意一定要把A定义为块:display:block; 因为只有这样才可以完全显示背景图片。与overflow:hidden;相结合还可以把A标签中的文字挤出显示区,当然他的父级标签也要有overflow:hidden;不然在IE下还是会出现溢出显示的现象。加上一个背景图,这时浏览一下我们发现五个区块只出现图片的第一区,五个块都是一样的。我们需要把五个块应有的显示内容表现出来。就需要再加一些指令:

  1. #b a {background-position: -82px 0px;}
  2. #c a {background-position: -164px 0px;}
  3. #d a {background-position: -246px 0px;}
  4. #e a {background-position: -328px 0px;}

我们这里看到,中其并没有 #a a 这是因为#a a的显示内容就是当前内容,所以这句可以省了,由于#nav  a中已经定义了背影图片了由于#nav a包括了#a a、#b a…,所以这里只要做好背景的位置就好了。再浏览一下,是正确了,但是还没有鼠标翻转的效果。下面再来把这个鼠标翻转的效果再补上:

  1. #a a:hover {background-position: 0 -25px}
  2. #b a:hover {background-position: -82px -25px;}
  3. #c a:hover {background-position: -164px -25px;}
  4. #d a:hover {background-position: -246px -25px;}
  5. #e a:hover {background-position: -328px -25px;}

大家也看到了,这里也有很多重复的,可不可以再省略呢?如果只是针对IE流览器是可以的,因为IE在背景两个私有属性叫:background-positionX,background-positionY。但是Firefox与Opera都不支持,所以这里就不能省。基本上是成功了不过还有一个小细节,细心的朋友一定发现了,LI的位置移动是以79PX为一个单位,而图片则都是82PX的,链接也是82PX的大小。所以我们开头的#nav 的长度是错的,正常的是398px,为什么是398px那就自己想想算算吧!下面给出全部的CSS代码:

  1. #nav {padding:0; margin:0; width:398px; height:25px; line-height:25px; overflow:hidden; list-style:none; position:relative;}
  2. #nav li {width:82px; height:25px; position:absolute; top:0;}
  3. #b {left:79px;}
  4. #c {left:158px;}
  5. #d {left:237px;}
  6. #e {left:316px;}
  7. #nav a {width:82px; height:25px; padding:30px 0 0 ; overflow:hidden; display:block; background:url(bg.gif) no-repeat;}
  8. #b a {background-position: -82px 0px;}
  9. #c a {background-position: -164px 0px;}
  10. #d a {background-position: -246px 0px;}
  11. #e a {background-position: -328px 0px;}
  12. #a a:hover {background-position: 0 -25px}
  13. #b a:hover {background-position: -82px -25px;}
  14. #c a:hover {background-position: -164px -25px;}
  15. #d a:hover {background-position: -246px -25px;}
  16. #e a:hover {background-position: -328px -25px;}

查看最终效果:
http://andymao.com/andy/demo/20070127/nav.htm

蓝色理想阅读处:
http://bbs.blueidea.com/thread-2716625-1-1.html

作者 / 振之
网站 / 毅博客 http://andy.andymao.com/
电话 / (86)025 5890 9295
  • quote 3.怿飞
  • http://www.planabc.net
  • 写得不错,对很多细节方面讲得很到位!赞个!

    但把导航文字用CSS使其溢出隐藏的方式,对于搜索引擎或许是不太友好,理论上会作为作弊来处理!
  • 2007-1-27 11:03:10 回复该留言
  • quote 4.振之
  • http://www.jonmax.com
  • 引自 怿飞
    写得不错,对很多细节方面讲得很到位!赞个!

    但把导航文字用CSS使其溢出隐藏的方式,对于搜索引擎或许是不太友好,理论上会作为作弊来处理!


    并非飞兄所说的那样对搜索引擎不友好,溢出隐藏只是样式层面的,并非是结构层面上的,而搜索引擎并不会去关注样式层面!这是我的看法
  • 2007-1-27 13:08:48 回复该留言
  • quote 7.振之
  • http://www.jonmax.com
  • 引自 iu99
    top既然是0 ,在它后面加上单位有什么特别的意思吗?
    为什么要写成 0px 呢?


    这个没有特别的意思,只是我顺手就写上去了,当数值为0时不需要单位
  • 2007-2-7 16:05:52 回复该留言
  • quote 11.xiaojie
  • 真的很不错。我喜欢。
    不过还是有点不懂,为什么我做的老是只显示文字后面的那一点点背景。
    happycool 于 2007-10-14 13:58:02 回复
    少了转换为块元素了吧~

    display:block
  • 2007-10-14 13:58:02 回复该留言
  • quote 12.as
  • http://woria.cn
  • 这个和更换啊a:hover 背景图片有什么 差异吗?
    怎么弄了这么一堆代码?
    毅 于 2007-11-6 14:46:10 回复
    差异我已经在文中写清楚了,实在不明白的可以自己动手做做!我文中也给了示例了,想像与现实的差距只有你在实践中才能看到。
  • 2007-11-6 14:46:10 回复该留言
  • quote 13.as
  • http://woria.cn
  • 你用css来玩相对位移 让"危险区域"的角能接合。进而定义了 #a #b #c #d #e 这些东西。
    有了id干啥不行啊。。
    直接 把图片切好做好。 只用 a:hover 更换图片不行了。还写了左平移 右平移。。。
    你是不是不想我们这些新手看懂呀。。

    我觉得简化 简单手法才是 目的。用这样那样的技术 就偏移了目的。
  • 2007-11-6 13:57:06 回复该留言
  • quote 15.as
  • http://woria.cn
  • 我明白你写的那些代码和要点是什么。

    我的意思是说:
    那个危险区域完全可以通过图片+id共同作用来处理 仅仅使用 a:hover 实现。。
    没必要说切出来的图片,也就是每一个a所使用的背景图片是 相同的 规则的。
    在hover时候所更换的图片上 做手脚 远比 用css控制它们的位置 更直接 和 明了。

    个人意见 呵呵。
    毅 于 2007-11-6 18:02:16 回复
    没觉得每个A:hover都要控制个图片来得直接明了,没觉得这样做有什么好处。零碎的图片反而不利于整体效果的显示。事实证明通过控制背景显示位置不论是在下载效果上还是在代码减化上都要比每个链接使用不同的图来得更为精简与高效。

    由 毅 于 2007-11-7 0:05:12 最后编辑
  • 2007-11-6 18:02:16 回复该留言
  • quote 16.as
  • http://woria.cn
  • 你说这个我同意。
    更换背景图片的话,需要重新下载。
    如果是直接控制A的背景图片位置 确实高效很多,不用下载图片了呗。

    我就是 觉得为了实现这个 写了很多ID和样式进去 很麻烦,光看就要要看半天。
  • 2007-11-7 9:13:23 回复该留言
  • quote 17.as
  • http://woria.cn
  • 昨天回家也做了一个,也用的相对 绝对定位。和你的原理相同,不过我做的数值计算比较少。
    贴出来,你给pp
    我比较佩服你的 艺术设计 色彩把握以及设计观念啊。
    看你关于网站层次 色彩 布局的 文章觉得受益非浅!



  • 2007-11-7 10:45:40 回复该留言
  • quote 19.振之
  • http://www.andymao.com/
  • 你还是没仔细看我的文章。你那个实例与我写的根本不是一回事,当然代码少了很多。
    你只是增加个背影,话说回来了,如果每个导航链接的字数不一样时你如何解决这个问题?我这里是完成使用以图换字技术。详细看一下我的实例。要常动手,观察要仔细。我为什么要用一张整图来完在这项工作。这并非是我闲得没事胡乱的卖弄技术。
    andymao.com/andy/demo/20070127/nav.htm
  • 2007-11-7 14:35:07 回复该留言
  • quote 20.as
  • http://woria.cn
  • 导航数字指的是什么?
    我是觉得 在用图片去替换链接文字 很麻烦啊。
    做一个背景图片 不是小一些 链接文字还可以随时通过更改页面代码来更改。


  • 2007-11-7 15:06:26 回复该留言
  • quote 22.as
  • http://woria.cn
  • 恩 我这人确实有点马虎。
    我就是看不明白 你说的“导航链接的字数”是什么意思。
  • 2007-11-7 17:30:01 回复该留言
  • quote 23.振之
  • http://www.andymao.com/
  • 你现在做的 "menu1""menu2"这些字数都是大差不差的。如果这些字数要是不一样呢?不一样多。那么那个背景是不是就不能用了呢?另外,设计的时候并不一定是用常用字体,如果是一些不常用字体,或是效果那么怎么办?以图换字的技术其实并不麻烦,只不过是你怕麻烦。
  • 2007-11-7 17:46:28 回复该留言
  • quote 24.破房子
  • 这样子做出来的图片在这里是看不出什么大的问题的,但是,他有缺点就是锯齿,现在这个图片看得还不是很显眼,因为后面用了一个白色的背景,忽悠了我们的眼睛,在应用的时候这样的锯齿是不能产生的,所以最好的办法还是做成flash得好,矢量的图片可以做到完美的效果
    毅 于 2007-11-17 9:52:15 回复
    我不认同你的看法,即然是在做这个图片,就必然知道背景是什么样的色彩,我不可能傻到这些问题也不会处理。不同的背景就用不同的背景去做,难道一定要做到劳永逸?我并不排除做成FLASH的好处,但是我同样认为flash也有着很致命的一些问题!比如不利搜索等。
  • 2007-11-17 9:52:15 回复该留言
  • quote 25.cosa
  • 我自己实验了下:etosun.cn/other/list.html
    上面一个没有用到绝对定位和相对定位,只是让li躺下来了.
    第二个是按毅老师的方法做的.差异在单个导航间距上反映出来了.
    后来发现比79px小的距离也行,个人理解似乎这就是老师这样写的目的?麻烦老师解疑!谢谢!
  • 2007-12-9 14:43:03 回复该留言
  • quote 26.振之
  • http://www.andymao.com/
  • 你自己做的第一个方式其实是没有烦恼的,因为间隙很大,两者之间没有重叠的地方。而第二个间隙很小,这就烦恼所在,间隙小了就会有互为重叠的地方,如何避免就成为本主的主要核心!

    其实这是很简单的技巧,关键是希望本文可以打开读者的思路,勇于想像!
  • 2007-12-9 17:18:34 回复该留言
  • quote 27.aiCss
  • 为什么不用单个的图做呢,这样真的好复杂啊看着都晕啊...
  • 2007-12-18 0:43:05 回复该留言
  • quote 30.古石
  • LI的位置移动是以79PX为一个单位,而图片则都是82PX的,链接也是82PX的大小。所以我们开头的#nav 的长度是错的,正常的是398px,为什么是398px


    我刚开始学习网页标准
    我想了好久 也不大明白是什么意思
    麻烦能给我讲一下吗
  • 2008-8-29 10:59:26 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog .Theme from Google黑板报 By Washun

Copyright 2005-2007 Jonmax.com. All Rights Reserved.

Search

最新评论及回复

最近发表

资助者链接