Jorux Notebook

Just a web designer's blog

属性篇(3)—If you love css …

本篇主要介绍css对边框(border)的属性控制和链接(link)的伪类选择器.

边框(border): css控制的边框属性包括border-width, border-color, border-style.

Border之所以让人很困惑主要源于IE5错综复杂的BUG, 由于IE5是一个”will soon be dead“ 的浏览器, 这里只例举一个最为知名的关于border-width的BUG, 让大家更好的理解border的含义, 先看下图:

j

如上图所示, 对象A(白色矩形)周围有蓝色边框B, 可以看出A的实际宽度为ef, 而IE5不这么认为, 它把cd的长度定义为对象A的宽度, 这个bug在边框的宽度小时几乎察觉不到, 但在边框与对象宽度相差不大时显得尤为明显.

现在, 结合以上说明, 可以看出border是独立于对象之外, 位于maginpadding之间(后说明), 具有固定宽度, 颜色和样式的区域.

1. border-width: 其可有具体数值(如1px, 2px等)或是描述性(thin, medium, thick)的属性值. 由于浏览器及个人设置的不同导致thin, medium, thick这些属性值的表现不一, 不推荐使用. css代码如下:

border-width: 1px;
border-width: 2px;
border-width: thin;
border-width: medium;
border-width: thick;

宽度效果如下(注意不同浏览器下的区别):

 1px    2px    thin    medium    thick 

2. border-style: 边框样式包括solid, dashed, dotted, double, groove, ridge, inset, outset等, 代码如下:

border-style: solid;
border-style: dashed;
border-style: dotted;
border-style: double;
border-style: groove;
border-style: ridge;
border-style: inset;
border-style: outset;

样式效果如下(你可能需要Firefox或是Opera才能看到后四种效果):

 solid   

 dashed   

 dotted   

 double   

 groove   

 ridge   

 inset   

 outset   

3. border-color: 边框颜色属性和一般颜色属性是一样的, 可以参看属性篇(1).

Summary: 以上例举的都是四边相同样式的情况, 其实可以分别设置border-top, border-right, border-bottom, border-left四边的属性, 比方说想要表现一个宽2px, 蓝色(blue), 样式为solid的上下边框, 代码如下:

border-top-width: 2px;
border-top-color: blue;
border-top-style: solid;
border-bottom-width: 2px;
border-bottom-color: blue;
border-bottom-style: solid;

简写为: 

border-top: blue 2px solid;
border-bottom: blue 2px solid;

表现如下: 

 宽2px, 蓝色, 样式为solid的上下边框 


以下内容不再属于css属性, 但暂时归入属性篇中.

链接(link): 在html里用<a></a>标明链接, 在css里用a作为链接的选择器名.

css的缺点和它的优点一样明显, 其最大的缺陷就在于网页的动态表现不足, 在这一点上和Flash差距尤为突出.

好在css还是留了一手, 那就是链接的伪类选择器, 所谓伪类就是指依赖于浏览器或是用户的状态. 对于链接来讲, 存在link, hover, visited, active四种状态, 即四种伪类选择器: a:link(存在链接, 但无鼠标动作), a:visited(被点击或访问过), a:hover(鼠标悬停于链接上时的状态), a:active(鼠标点击与释放之间的状态).

css便是以这几个伪类选择器实现了其为数不多的动态效果. 目前最为常用的就是导航条和按钮的动态显示. 以下用一个动态按钮的实例来说明这四个伪类选择器.

1. 首先准备一副图片(button.png), 如下图(160px*240px), 其由四幅160px*60px的小图自上而下排列而成.

j

2. 接着需要往你的本地调试文件夹(调试环境的建立方法参考属性(1)中的说明)的index.htm中写入html代码, 如下: 

<div id=”button”><a href=”#”></a></div>

3. 在style.css中写入以下代码:

body {background-color: #FFF;}
#button a{
width:160px;
height:60px;
display:block;
background:url(../image/button.png) no-repeat 0 0;
}
#button a:link { background-position:0 0;}
#button a:hover { background-position:0 -60px;}
#button a:active { background-position:0 -120px;}
#button a:visited { background-position:0 -180px;}

可以看到如Example2的效果.

4. 代码解释:

<div id=”button”><a href=”#”></a></div>

在index.htm写入如上代码, 目的在于插入一个id名为”button”的盒子(div),且其内含有一个链接<a href=”#”></a>. 

#button a{
width:160px;
height:60px;
display:block;
background:url(../image/button.png) no-repeat 0 0;
}

在css文件中写入以上代码, 目的在于控制盒子中链接的表现, 通过名为”#button a”的选择器来实现. 链接的宽高为160px*60px, 背景为图片button.png.

在这强调一下display:block的作用. 由于在html文件中,链接<a href=”#”> </a>中没有任何的内容(content)填充, 如果没有声明”display:block”, 那么即使声明了选择器”#button a”的宽高, 浏览器也会因为html文件中没有内容而无法显示链接. 所以”display:block”在这里的作用就在于强制浏览器显示没有内容填充的链接.  

#button a:link { background-position:0 0;}

用伪类选择器a:link声明链接的背景图片在左上角显示, 即距离左边和顶边分别0, 0. 但由于已经在选择器 “#button a”中声明了图片位置, 此代码可有可无.

#button a:hover { background-position:0 -60px;}
#button a:active { background-position:0 -120px;}
#button a:visited { background-position:0 -180px;}

用伪类选择器a:hover声明鼠标悬停时, 背景图片上移60px, 而使排在第二位的绿色小图片显示出来;

用伪类选择器a:active声明在鼠标点击与释放之间的状态时, 背景图片上移120px, 而使排在第三位的红色小图片显示;

用伪类选择器a:visited声明在链接被点击或访问过时, 背景图片上移180px, 而使排在第四位的灰色小图片显示;

现在你基本了解了css动态按钮的制作过程, 但以上css代码还存在一个严重的缺陷, 相信你会很快发现问题所在——这个按钮居然是一个”一次性按钮“, 也就是说这个按钮在点击第一次后, 就一直显示那个灰色小图片, 你能想出解决方法吗? 请在留言中指出.

答案会在下一篇文章中说明! 下篇将会涉及css的核心内容——盒子模型, marginpadding属性.(正文完)


《If you love css …》已经有四篇文章发表了, 更新速度比较慢, 原因有三:
1, css教程内容本身的难度在加大, 又奢望在说明方法方式上比前人有所进步;
2, 接手一个web design的project, 到了最后调试阶段, 那位美国大哥说了声”perfect”, 就声称太忙就不再回复mail, 使我认识到网络之不可靠, 绝不只发生在别人身上. 严重打击我的网络热情;
3, 毕竟我还不是个专业网虫, 现实生活中, 还是有那么多我所关心的, 不得不干的事, 仍旧未完成.
即使每天上网时间很短, 但我依然努力挤出时间, 在某天集中精力完成某篇文章, 感谢那些订阅本网站FEED的朋友(目前每天有20个左右的订阅流量). 更要鸣谢那些在本站留言, 纠正错误, 提出建议的朋友, 如果没有你们, 可能这个教程早就 ……

23 Responses So Far

  1. leizi Says:
    Gravatar

    leizi先來支持一下!

    Jorux的CSS教程我全部收藏

  2. leavic Says:
    Gravatar

    那个链接不同状态显示不同图片的问题,还真有点像C语言中的指针偏移。
    不过C语言中可以很轻松的重新把指针指向到变量的首地址,CSS中就不太清楚要怎么处理了,难道可以再刷新后重置所有超链接的状态?

    或者,会在下一篇解答?

  3. Jorux/Bluecssr Says:
    Gravatar

    “一次性链接”问题, 确实像Leavic所说的那样, 存在类似C语言中的指针偏移现象. 基于一个基本事实, 一个链接被点击后, 它的状态就是”visited”.
    想要将指针重指向, 方法只能是”清除浏览器的历史记录”或者提高浏览器的安全级别, 让其”记不住”访问历史. 但强制更改访客浏览器设置, 不仅有违道德, 没有效率, 而且违背了”:visited”伪类的存在目的.

    “:visited”的意义在于提示访客这个链接是被访问过的, 我们无需也不能更改”visited”这个事实. 之所以说那个按钮是”一次性”的, 不是因为它显示”灰色图标”, 而是因为伪类”:hover”和”:active”失效问题. 希望Leavic或其他朋友在解决这个问题时, 考虑到这一点.

    指针确实偏移, 但无需重指向. 因为在没有鼠标动作时, 确实应该显示灰色图标. 我们要解决的问题就是怎样使伪类”:hover”和”:active”重新生效.
    这点我可能在文章中没有说明清楚, 在这借着回复Leavic的机会说明一下. CSS中的问题就像”怎样让一个鸡蛋直立于平面上”的问题一样, 想到了就极为简单. 大家再努力想想, 希望在留言中看到你们的解决方法!

  4. 红鼻子 Says:
    Gravatar

    最近比较忙,好久没有来Jorux这里,讲了这么多内容了,辛苦辛苦

  5. irini Says:
    Gravatar

    再次感谢Jorux在百忙中的帮助!

    我是用Opera看这篇文章的,在这个浏览器下点击那个botton不会出现灰色的图标,就直接显示成一开始的黄色。

  6. Jorux/Bluecssr Says:
    Gravatar

    To IRINI:
    因为那个链接的地址为”#”, Opera可能对于链接”#”有特殊认识, 所以不能显示”a:visited”状态, 只要刷新一下那个页面就会显示灰色图标了.
    另外与opera的历史设置状态也有关, 必须让其记住”访问历史”.

  7. 红鼻子 Says:
    Gravatar

    修改成为
    Link
    Visited
    Hover
    Active
    顺序这样,后面的优先级大于前面的,就行了
    记住就是LVHA这个样子的顺序就不会有错了

  8. Jorux/Bluecssr Says:
    Gravatar

    红鼻子的答案是正确的.
    之所以排在后面的优先级大, 是因为浏览器读取css文件时是自上而下的.
    但这并不是充分条件. visited, hover, active这三种状态不是独立的, 它们存在交集.
    比方说一个按钮, 如果它被点击过, 而且你正点击这个按钮, 那么这个按钮既是visited, 也是active, 而且因为鼠标悬于按钮之上, 所以它也处在hover的状态. 那么这个时候, 你把css文件中的visited置于最后的话, 那么hover和active两种状态的属性都会被visited的属性所覆盖而不显示.
    同理, active必须置于hover之后才能显示其属性.
    要点:
    1.visited必须置于hover和active之上;
    2.active必须置于hover之后;
    3.link的位置无所谓, 所以你只需保证VHA的顺序即可.

  9. dai Says:
    Gravatar

    读你的文章就好象在听我最喜欢的一个教授的课,因为你们的风格相同:严谨清晰,易于理解!再次感谢!

  10. 角虫 Says:
    Gravatar

    原来讨论的魅力就是发现更多别人知道而自己不知道的。

    很喜欢你的教程,请继续写下去。

  11. sdwart Says:
    Gravatar

    写A:伪类的顺序:LoVe,HAte 记住大写字母就可以了L:link V:visited H:hover A:active

  12. Bush Says:
    Gravatar

    Hello, nice site look this:
    http://sold.solidno.com/moto-usato/ , moto usato, [URL=http://sold.solidno.com/moto-usato/]moto usato[/URL]

    End ^) See you

  13. Treno Says:
    Gravatar

    ..Rather helpful information you have here. Grazie!

  14. W.l Says:
    Gravatar

    关于链接实例部分是否已将example2.css文件移除?无法正常显示效果。

  15. Jorux/Bluecssr Says:
    Gravatar

    To W.I: 可以正常显示。

  16. 木木 Says:
    Gravatar

    你要多多休息,我们等着你。呵呵。

  17. gemini Says:
    Gravatar

    呵呵,现在才发现了这么好的地方。来晚了,但是还是会从头看起的。以后跟上队伍。嘿嘿,辛苦jorux了

  18. Hauran Says:
    Gravatar

    阅读完毕。谢谢。

  19. ingls Says:
    Gravatar

    这个教程非常好
    尤其对我这初学者
    思路清晰/容易理解和记忆

    感谢jorux!辛苦了

  20. Evan Says:
    Gravatar

    再拜

  21. 木可木可 Says:
    Gravatar

    新公司,新的一个行业,学习CSS,可是身边又没有人指点,只好在网上搜集教程自己学习~
    无意中来这里,发现站长的教程与其他的都不同,很受益~~
    辛苦了~~

  22. neil Says:
    Gravatar

    其实,从用户体验的角度来讲,所谓”一次性链接”用处很大,但也有局限.比如新闻这样一次性阅读的文章,使其visited的表现区别于link,能有效的将读过与未读过的文章区分开, 方便浏览者了解自己的”足迹”, 但如果用在导航中,显然会让浏览者产生某些误会

  23. lkaxb Says:
    Gravatar

    受益了,学习中

Leave a Reply

Anti-Spam Image

Designed by Jorux. Proudly powered by WordPress 2.0.    Except where otherwise noted, this site is licensed under a Creative Commons License.