<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Roc's blog - (x)HTML&amp;amp;CSS</title><link>http://www.liquidroc.name/</link><description>内心的呐喊来自于对前路的追求～ - </description><generator>RainbowSoft Studio Z-Blog 1.8 Arwen Build 81206</generator><language>zh-CN</language><copyright>Copyright 2006-2008 Rocstudio. Some Rights Reserved.</copyright><pubDate>Fri, 10 Sep 2010 16:57:37 +0800</pubDate><item><title>Firefox 3.5升级中6点值得注意的地方</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/6-firefox-35-fact-you-need-to-know.html</link><pubDate>Thu, 02 Jul 2009 11:23:01 +0800</pubDate><guid>http://www.liquidroc.name/post/6-firefox-35-fact-you-need-to-know.html</guid><description><![CDATA[<div id="notice">   <p>今天刚刚把Firefox升级到3.5，配合着Win 7 RC的确让人神清气爽。看到<a href="http://www.evotech.net/blog/">Estelle</a>很快写了点关于Firefox升级的东西，实在太开心了，省的去翻官方的通告了。快速翻了一遍，如下：</p> </div>  <p>原文地址：<a title="6 Firefox 3.5 updates of interest" href="http://www.evotech.net/blog/2009/06/6-firefox-35-fact-you-need-to-know/">6 Firefox 3.5 updates of interest</a></p>  <p>版权所有：Estelle Weyl</p>  <h3><strong>Firefox 3.5对于CSS 3选择器的支持</strong></h3>  <p>Firefox 3.5在6月的最后一天正式发布了。正如我在几个月之前用过的Beta版本一样，FF3.5全面支持CSS3选择器。<a href="http://www.evotech.net/blog/2009/02/css-browser-support/">点这里查看CSS3浏览器支持表</a>。这个更新实在太伟大了，让我们不禁欢欣鼓舞，只有一点例外：这个消息意味着我之前在写的谷歌Chrome的hack同样将影响FF3.5。</p>  <p>我将CSS3浏览器支持表同步更新到FF3.5。放眼望去，FF3.5那一列被美丽的绿色背景填满，因为它全面支持CSS2.1和CSS3。</p>  <h3><strong>Firefox 3.5的CSS和HTML特性</strong></h3>  <p><strong>1、@font-face</strong></p>  <p>@font-face声明（与其说属性，它看起来更像是下载）允许你去定义一个字体，并且下载该字体，之后在整个站点页面范围内，你可以将其插入其他的font-family属性中去引用这个字体。</p>  <pre><font size="2">@<span style="color: #800000">font-face</span> {  <span style="color: #ff0000">font-family</span>: <span style="color: #0000ff">&lt;a-remote-font-name&gt;</span>;  <span style="color: #ff0000">src</span>: <span style="color: #0000ff">&lt;source&gt; [,&lt;source&gt;]*</span>;  [<span style="color: #ff0000">font-weight</span>: <span style="color: #0000ff">&lt;weight&gt;]</span>;  [<span style="color: #ff0000">font-style</span>: <span style="color: #0000ff">&lt;style&gt;]</span>;}</font></pre><pre><font size="2"></font></pre><p><strong>2、媒体类型</strong></p><p>Firefox 3.5支持更多特定的媒体设备状况，例如提供CSS基于颜色索引，屏幕长宽比，屏幕的高度或是宽度，轴向，分辨率等等。在iphone CSS中，我们已经对其中的一些有了初步的了解。换句话说，这些在FF上很酷的新鲜特性，都是Webkit中玩剩下的了。此外，FF3.5支持媒体类型声明使用逻辑运算符，针对那些不支持此特性的上一代浏览器的hack相信不久也会被发明出来。</p><pre><font size="2">media screen and (min-width: 600px) and (max-width: 800px) <span style="color: #008000">// low resolution laptop?</span>&lt;link rel=&quot;<span style="color: #8b0000">stylesheet</span>&quot; media=&quot;<span style="color: #8b0000">print and (min-width: 11in)</span>&quot;... <span style="color: #008000">// landscape printing</span></font></pre><pre><font size="2"><span style="color: #008000"></span></font></pre><p><strong>3、支持HTML 5特性</strong></p><p>Firefox 3.5支持HTML 5的音频和视频元素，离线资源，HTMl 5的拖拽API支持站内和站站之间的拖拽。另，Firefox 3.5改进了对于canvas的支持。</p><h3><strong>Firefox 3.5 CSS 2.1和CSS 3新特性以及失败之处</strong></h3><p>Firefox 3.5做出了一些改进，但在对CSS的支持上仍然有上升的空间。除了官网中提到的以上几点之外，以下几点也有相应改进：</p><p><strong>4、:before和:after更新至CSS2.1规范</strong></p><p>:before和:after这两个伪元素在position，float，list-style-*以及其他一些显示属性上尚且不能得到完整的CSS 2.1支持。见<a href="http://www.evotech.net/blog/2009/05/css-properties-values-and-browser-support/">CSS属性值大全</a>。在这一点上我依然观察到一些问题，但我的CSS在测试中没有完全验证我的想法……所以，以观后效吧。</p><p><strong>5、opacity，text-shadow和word-wrap</strong></p><p>虽然这些CSS3（对于text-shadow来说，它也属于CSS2.0范畴）属性在Firefox早期的版本中某些方面表现的很不错，但现在你不用在这三个属性前添加-moz扩展了。</p><p><strong>6、CSS3属性中的-moz-扩展</strong></p><p>-moz-box-shadow, -moz-border-image, -moz-column-rule, -moz-column-rule-width, -moz-column-rule-style,以及 -moz-column-rule-color目前在FF3.5全部支持。</p><p>我还没有做更多的测试，即便如此我还是把已知的写在这里。一旦有机会，我将会更新此页和<a href="http://www.evotech.net/blog/2009/05/css-properties-values-and-browser-support/">CSS属性值大全</a>的页面。</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/6-firefox-35-fact-you-need-to-know.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=114</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=114&amp;key=13b3bd19</trackback:ping></item><item><title>Web标准化变通的底线</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/understand-web-standard.html</link><pubDate>Thu, 26 Mar 2009 21:51:44 +0800</pubDate><guid>http://www.liquidroc.name/post/understand-web-standard.html</guid><description><![CDATA[<p><u><font color="#0066cc">Zeldman</font></u>的《重构》一出，让我们知道在Web前端的开发上原来也是要遵循标准的。然而，Web标准化却是靠技巧和经验自觉遵守的一种规范，它并不是如1+1=2那样让人无可争辩的公理。所以，重构大潮日渐兴起的几年之间，关于Web标准化的讨论从来没有停下脚步，特别是考虑到中国人特有的中庸变通之道，标准化的应用在每一个前端开发团队或个人手中都变得可以忽左忽右。</p><p>在蓝色理想上看到一篇<a href="http://www.blueidea.com/tech/web/2009/6545.asp">质疑ul列表应用的文章</a>，尤其印证了这一点。作者rainoxu的主要观点：ul似乎有被滥用的趋势。以实例来说明就是，一个如下的导航栏未必一定要用&lt;ul&gt;和&lt;li&gt;去构建，可以变通为使用&lt;span&gt;和&lt;a&gt;元素去代替。</p><p style="text-align: center">&nbsp;<img title="" alt="" onload="ResizeImage(this,520)" src="http://www.liquidroc.name/upload/200903262153430084.png" /></p><p>其理由是，在样式表不加载的情况下，&ldquo;墨守成规&rdquo;的使用语义化的ul列表，会让页面高度过度的拉长，就像下图中您看到的这样；而按照rainoxu的做法，使用&lt;span&gt;和&lt;a&gt;变通一下，则会让页面在样式表不加载的情况保持一定的&ldquo;优雅&rdquo;。</p><p style="text-align: center">&nbsp;<img title="" alt="" onload="ResizeImage(this,520)" src="http://www.liquidroc.name/upload/200903262154191456.png" /></p><p>这个关于慎用ul列表的理由成立么？不知道各位同学是怎么想的，但是要我说，这真是有点舍本求末！这种从表象倒推原理的方法，完全把标准化和语义化的本义忽略了。如果从表象出发，我们有太多理由去否定诸如ul、ol或者其他语义结构的存在，比如默认列表项前的圆点（大部分时间我们都要用自定义样式把圆点消除）。</p><p>试问除了专门从事前端开发的人员，有多少用户会刻意的将css加载禁用，浏览一个&ldquo;裸奔&rdquo;的网站？尽管网络拥堵的时候，打开某些页面时css加载不成功，会偶尔看到无样式页面，我们的第一反应时F5重刷新，如果还是不成功，那么用户就要和这个网页说再见了，犯不着在一棵树上吊死。哪怕是用手机终端去上网，大型网站基本上都会有对应的wap站点，一统江湖的Opera Mini和UCweb之流也绝不会在载入页面的时候刻意挡掉css样式表。关注ALA的同学，275期的《<a href="http://www.alistapart.com/articles/returnofthemobilestylesheet/">Return of the Mobile Style Sheet</a>》更是阐明了移动设备今后对于样式表支持的回归。</p><p>Web标准中的确是存在着无数的变通之道，但拿一种在现实应用中绝少出现的&ldquo;实验室结果&rdquo;去否定Web标准和语义，显然是一种想当然的做法。按照span替换ul的逻辑，那么页面上的h1也要用span加strong代替，不然没有样式表的页面，标题会太粗大了，在手机界面上也会占用大量空间；缩略图、标题加内容简介的页面块也不能用dl、dt和dd的结构了，还是用回table最好，没有样式的时候，他们比前者整齐太多了。</p><p>多说无益。总之，刻意的&ldquo;创新&rdquo;对于Web标准化的普及和理解是有害的，神来一笔固然让人激动，下笔之前还是应该三思，再三思！</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/understand-web-standard.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=101</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=101&amp;key=044d3481</trackback:ping></item><item><title>小议css文件管理</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/css-file-organization.html</link><pubDate>Tue, 04 Nov 2008 00:39:37 +0800</pubDate><guid>http://www.liquidroc.name/post/css-file-organization.html</guid><description><![CDATA[<p>上大学之前，家里的阳台上有两样东西：一个是我的七斗柜，另一个是父亲的工具柜。平日的杂志和书籍，都被我分门别类的摆放在七斗柜的每一层抽屉里；而父亲用来摆弄根雕、篆刻的工具柜则是打通的，所有的斧锤锯尺都码放在一起，虽然层层叠叠，却也不过于零乱。</p><p>需要提及的是，当初这两个柜子并不此处，把它们搬到阳台确实费了一番功夫。由于抽屉的重量，加上在搬动时有滑出的危险，我要先把七个抽屉拿出来，等到空柜子就位，再把它们一个个推进去；工具柜就比较轻松，把工具全部打包拿出再搬空柜子，最后再一股脑把工具全部放回去。</p><p>我想我的比喻到这里就应该结束了，否则这篇打算讨论css文件管理的文章将成为一篇糟糕的散文小品。看过《<a href="http://www.alistapart.com/articles/progressiveenhancementwithcss">Progressive Enhancement with CSS</a>》（或者是我粗浅翻译的中文版《<a href="http://www.liquidroc.name/post/progressive-enhancement-with-css.html">CSS渐进增强</a>》）的朋友可能会理解我这个啰嗦的比喻。<a href="http://www.alistapart.com/authors/g/aarongustafson">Aaron Gustafson</a>提到的把一个main.css分离为诸如type.css、layout.css以及color.css等等彼此独立又相互关联的小文件，就相当于我家阳台上的那个七斗柜。要找《微型计算机》？没问题，就在第一格；找《科幻世界》，在第二格，要是找《花花公子》，唔&hellip;&hellip;抱歉，我买不到（开个玩笑）。</p><p>网站建设中，把一个原先要全部写在一起的css分成多个互有分工的css，看上去科学合理，但是有另一种声音对这种css文件管理方法提出了质疑。<a href="http://christopherschmitt.com/">Schmitt</a>就在他的新书《<em><a href="http://webstandardsbook.com/">Adapting to Web Standards</a></em>》中列出几点问题，我综合了一下：</p><ol>    <li>选择器有可能在多个文件中重复，文件彼此的依赖关系复杂，调试变得更困难；</li>    <li>在团队开发中，不同的人对于css文件的分法有不同的理解，经验不足的新手反而会成为绊脚石；</li>    <li>增加了css的总体大小，增加了HTTP请求；</li></ol><p>这就和我搬动那两个柜子一样，单一的工具柜尽管有些乱，但是搬起来快；七斗柜搬起来慢，按时最后会显得井井有条，不过有时候放错了位置，你会在找遍第二格之后才发现，原来我把最新的《科幻世界》丢在第一格的《微型计算机》中了。</p><p>尤其是最后一点，特别为各大网站所看重。看看淘宝、新浪、腾讯还有Yahoo等等网站的首页，无一不是把几百甚至上千行的css代码嵌入HTML中，它们既没有像七斗柜那样分门别类，也没有像工具柜那样打包在一起，它们更像是五金铺，把所有的东西都摊开在店面中。当然，主要的原因在于，大部分时间里首页的css布局是独一无二的，其他的子频道/页不会用到首页的css，那也就意味着针对首页的css只会用到一次，既然这样，做成外链的css文件反而多了一个HTTP请求，不如做成嵌入式样式表。也许在个人看来没有差，但是对于服务器，累积下来就是可观的速度提升。</p><p>有趣的是，尽管都存在着一些个例，但是相对于国内的网站来说，国外的网站更喜欢七斗柜式的css文件管理。例如<a href="http://www.usatoday.com/">USAToday.com</a>、<a href="http://www.espn.com/">ESPN.com</a>以及<a href="http://www.time.com/time/">Time.com</a>。这个现象颇值得玩味，我这篇小品文就不展开讨论了。</p><p>最后用一个不太严肃的比喻结尾，真侍魂里，不管是拿着一把大刀的塔姆塔姆，还是背着七把刀的徳川庆寅，用得好都是高手&hellip;&hellip; :p</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/css-file-organization.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=74</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=74&amp;key=306be4ca</trackback:ping></item><item><title>CSS渐进增强</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/progressive-enhancement-with-css.html</link><pubDate>Wed, 22 Oct 2008 00:54:04 +0800</pubDate><guid>http://www.liquidroc.name/post/progressive-enhancement-with-css.html</guid><description><![CDATA[<p>原文：<a href="http://www.alistapart.com/articles/progressiveenhancementwithcss">Progressive Enhancement with CSS</a></p>  <p>作者：<a href="http://www.alistapart.com/authors/g/aarongustafson" target="_blank">Aaron Gustafson</a></p>  <p>翻译：<a href="http://www.liquidroc.name" target="_blank">Roc</a><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://www.alistapart.com/d/progressiveenhancementwithcss/progenh.jpg" /></p>  <p>&#160;</p>  <p>在本系列的上一篇文章里，我们了解了<a href="http://www.alistapart.com/articles/understandingprogressiveenhancement" target="_blank">渐进增强的基本概念</a>（中文译本可以参看<a href="http://ued.taobao.com/blog/2008/10/09/understanding-progressiveen-hancement-chs-translation/" target="_blank">这里</a>和<a href="http://lifesinger.org/blog/?p=298" target="_blank">这里</a>）；现在，我们可以开始讨论如何应用它了。在使用CSS的时候，我们有多种融合渐进增强的方法，本文将谈及其中的一些方法，此外也让你思考一下如何在你的站点中应用其他渐进增强的方法。</p>  <h2><strong>组织样式表</strong></h2>  <p>许多web设计者和开发者对于如何把样式表整合进文档没有太多考量，实际上这其中大有讲究。在正确的方法下，渐进增强将迅速给你带来许多好处。</p>  <h3><strong>运用多重样式表</strong></h3>  <p>对样式表进行小小的拆分将带来很多好处。显而易见的，维护超过1500行的样式表会有些困难，而将其拆分为多个样式表可以改善你的效率（和心情）。另一好处不被人经常提及，那就是，针对不同媒体类型之间的显示，将获得更好的一致性。</p>  <p>包含站点里所有样式规则的main.css文件，把它拆分为若干独立的样式表，分别为字体、布局、颜色信息。在分贝给它们一个对应的名称：type.css，layout.css，color.css。</p>  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://www.alistapart.com/d/progressiveenhancementwithcss/separation.png" /></p>  <p align="center"><em>图：单一的样式表如何拆分为多个相互关联的样式表</em></p>  <p>一旦完成了上述工作，你就可以使用一些小手法为古董级浏览器（例如IE 5/Mac）和许多对CSS布局缺乏足够支持的其他浏览器自动提供一个“降级<sup style="color: #f00">注1</sup>”体验。怎么实现呢？就看这个文件是如何链接的了。假设，一个main.css通过link元素链接。</p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;main.css&quot; /&gt;</code></p>  <p>首先，要把它拆分为上面提到的三个样式表：</p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;type.css&quot; /&gt;</code></p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;layout.css&quot; /&gt;</code></p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;color.css&quot; /&gt;</code></p>  <p>在以往，我们中的大多数使用的media值，如“screen,projection”，让Netscape 4.x之流能够妥帖地按样式布局，但还有更好的办法。不过在了解这个方法前，让我们先回忆一下替换媒体类型（alternate mediatypes）。</p>  <h3><strong>运用替换媒体类型</strong></h3>  <p>因为内容的传递是渐进增强的主旨所在，我们希望传递一个“增强”体验，给支持它的任一设备，我们确实需要考虑浏览器之外的设备；其中最重要的就是，打印设备和移动通讯设备。</p>  <p>不幸的是，移动设备的市场依旧混乱不堪和不成熟。所以，关于手持设备在渐进增强方面的细节讨论将有可能需要若干篇文章，甚至于整本书。但是别沮丧：在移动设备领域已经开始有所动作，一些有识之士正着手于资源的归纳整理以期去帮助人们。不过由于时间关系，同样也是明智的选择，我们把目光放到打印设备上。</p>  <p>通常，我们使用link元素添加一个打印样式：</p>  <p>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;print&quot; href=&quot;print.css&quot; /&gt;</p>  <p>一般而言，这个样式表涵盖了包括字体和颜色在内的所有的和打印相关的规则。在本例中字体样式比较特殊，在打印样式表中的字体样式和在主样式表中的一模一样。换句话说，有很多地方都重复了。</p>  <p>这里就可以看出从布局样式中拆分出字体和颜色样式的好处了：在打印样式中，我们不要需要这些规则了。此外，我们可以使用另一个小方法去提高站点的可控性，并对有问题的浏览器隐藏特定的布局样式。</p>  <p>重新回顾我们的样式表，如下：</p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;type.css&quot; /&gt;</code></p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;layout.css&quot; /&gt;</code></p>  <p><code>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;color.css&quot; /&gt;</code></p>  <p>因为没有声明一个媒体类型，所以Netscape 4.x将对这三个文件全部读取，但我们可以使用一个非常基础的css手段去阻止它，把layout.css移动到一个新的样式表中，并命名为screen.css。最后，用导入screen.css的形式替换原来的layout.css。现在NS4.x就不再会那么聪明了。（因为它们无法理解@import命令）。</p>  <p>@import 'screen.css';</p>  <p>仍然有一些可供改进的地方——我们应当明确声明该样式表匹配何种媒体类型。要做的就是把原来@import这句包含在一个@media声明中，就像这样：</p>  <p>@import 'screen.css' screen;</p>  <p>结果是IE6无法理解该语法，它将忽略这个样式表。当然，如果你需要对特定的浏览器隐藏些许样式，那么恭喜你，你掌握了一个新的工具！如果你敏锐地注意到样式表名称左右的取而代之的是单引号（’），而不是双引号（”）的话，再次恭喜：你发现的是一个让IE5/Mac忽略样式表的巧妙手法。由于IE5对于CSS布局的解释十分糟糕（特别是浮动和定位），对它进行隐藏布局规则是十分必要的。毕竟，颜色和字体这些其他有用的信息会应用于它。</p>  <p>使用相同的方式，导入print.css（你猜得没错，只包含打印布局的规则）。</p>  <p>@media screen { @import 'screen.css'; }</p>  <p>@media print { @import 'print.css'; }</p>  <p>现在，我们不仅有了一个组织良好的样式表，我们也拥有了渐进增强整个网站设计的手段。</p>  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://www.alistapart.com/d/progressiveenhancementwithcss/organization.png" /></p>  <p align="center"><em>图：相互关联的多个样式表以及它们应用于文档的方法</em></p>  <p align="center"><em></em></p>  <h2><strong>头等难题：如何处理IE6？</strong></h2>  <p>对很多人而言，IE6就是另一个Netscape4——每个人都希望它赶紧滚蛋。</p>  <p>跳过对IE6的诸多怨言。它确确实实有很多问题，但老实说，不是麻烦到无法处理的地步。而且，继承者IE7依然迅速推广（特别是在用户中）并且IE8也已经在公测了。这意味着终有一天我们会和IE6说拜拜。</p>  <p>不管是有意还是无意，微软在推出IE5时，<a href="http://msdn2.microsoft.com/en-us/library/ms537512.aspx" target="_blank">条件注释</a>这一个伟大的工具为渐进增强提供了可能。这一巧妙的方法（在其他浏览器中它被当成普通的HTML注释）让我们不仅可以针对IE，更可以针对不同版本的IE指定标记。</p>  <p>作为富有web标准化意识的开发者，我们应当总是使用最遵循标准的浏览器来测试我们的设计。然后为那些离标准差一些的浏览器提供修复。每个人的工作流程都不一样，不过我找到一个开始每个项目前最佳的样式表文件设定方式。我基础的设定如下：</p>  <ul>   <li><code>type.css</code> </li>    <li><code>layout.css</code> </li>    <li><code>screen.css</code> </li>    <li><code>print.css</code> </li>    <li><code>color.css</code> </li> </ul>  <p>然后，依照项目的需求，给特定的浏览器CSS文件添加一些“微调”。绝大多数项目中，只需要用到ie7.css和ie6.css，但如果项目需要对IE6之前的版本提供支持，我将创建相应的文件（比如ie5.5.css等）。我将在我的基本CSS设定中选择适当的样式表以放置这些文件。</p>  <p>我的CSS测试都是从Mozilla Firefox开始，因为我使用他的CSS编辑工具条编写大部分CSS。一旦当我在Firefox中完成了页面的设计，我会在其他浏览器中查看。绝大多数表现都是完美的，因为都遵循统一的web标准。接着是在IE7中查看。大部分时候，没有错误产生，但偶尔有些地方需要触发hasLayout，或是修复一个微小的布局错误。我把这些修复添加到ie7.css，而不是基础CSS设定中，然后使用条件注释把这个文件添加到文档的头部：</p>  <p>&lt;!--[if IE lte 7]&gt;</p>  <p>&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie7.css&quot; /&gt;</p>  <p>&lt;![endif]—&gt;</p>  <p>该条件注释标明这个样式表只针对小于等于版本7的IE浏览器。所以，如果有人使用IE7访问该页，他们将得到我应用的这些修复。但如果他们使用的是更新的版本——像IE8这样已经修复这些渲染错误的浏览器，如不再需要触发hasLayout——这个样式表将被忽略。另一方面，如果有人使用IE6访问本页，他们将从这个样式表中获得修复，因为出现在IE7中的渲染错误同样出现在IE6中。在ie7.css前，添加一个不声明媒体类型的采用@import形式的screen.css，从而使第一次被跳过的样式表被导入这样一来就修正IE（7和其他更低版本）中无法理解@import媒体类型（上面提到的）的缺陷。</p>  <p>IE7的修复一旦添加完毕，我会转到IE6中查看它是否需要另一些调整。如果需要，我就再在文档中添加一个条件注释，指向ie6.css。</p>  <p>&lt;!--[if IE lte 7]&gt;    <br />&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie7.css&quot; /&gt;     <br />&lt;![endif]--&gt;     <br />&lt;!--[if IE lte 6]&gt;     <br />&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie6.css&quot; /&gt;     <br />&lt;![endif]--&gt;</p>  <p>接着，我把对IE6做的修复添加到这个样式表中，它们将被IE7忽略，但是对IE5.5等向后兼容。</p>  <p>这样使用条件注释，让你可以为你的项目轻松管理需要针对的浏览器，并且让CSS hack彼此独立。</p>  <h2><strong>其他的考虑</strong></h2>  <p>CSS的渐进增强并不局限于如何将样式表和文档联系起来；我们同样可以将这个概念运用于CSS的编写。</p>  <p>例如CSS生成内容，现在支持它的浏览器还不多，但它的确是添加额外的设计或文本的一个好方式,既不影响原有页面的可用性，又能提供一些视觉或其他方面的增强。</p>  <p>举个例子，看下面这个简单的联系表：</p>  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://www.alistapart.com/d/progressiveenhancementwithcss/form.png" /></p>  <p align="center"><em>图：样例中用到的表单（代码在下面提供）</em></p>  <p align="center">&#160;</p>  <p>当编写该表单时，你试图在label元素中添加冒号（：），为什么？它们为label元素提供了内容了么？没有。它们的唯一作用就是为用户添加一个视觉效果，对于label元素来说，它们是多余的，应当被去除。</p>  <p>&lt;form id=&quot;contact-form&quot; action=&quot;#&quot; method=&quot;post&quot;&gt;</p>  <p>&lt;fieldset&gt;</p>  <p>&lt;legend&gt;Contact Us&lt;/legend&gt;</p>  <p>&lt;p&gt;Send us a message. All fields are required.&lt;/p&gt;</p>  <p>&lt;ol&gt;</p>  <p>&lt;li&gt;</p>  <p>&lt;label for=&quot;contact-name&quot;&gt;Name&lt;/label&gt;</p>  <p>&lt;input type=&quot;text&quot; id=&quot;contact-name&quot; name=&quot;name&quot; /&gt;</p>  <p>&lt;/li&gt;</p>  <p>&lt;li&gt;</p>  <p>&lt;label for=&quot;contact-email&quot;&gt;Email&lt;/label&gt;</p>  <p>&lt;input type=&quot;text&quot; id=&quot;contact-email&quot; name=&quot;email&quot; /&gt;</p>  <p>&lt;/li&gt;</p>  <p>&lt;li&gt;</p>  <p>&lt;label for=&quot;contact-message&quot;&gt;Message&lt;/label&gt;</p>  <p>&lt;textarea id=&quot;contact-message&quot; name=&quot;message&quot; rows=&quot;4&quot; cols=&quot;30&quot;&gt;</p>  <p>&lt;/textarea&gt;</p>  <p>&lt;/li&gt;</p>  <p>&lt;/ol&gt;</p>  <p>&lt;button type=&quot;submit&quot;&gt;Send It&lt;/button&gt;</p>  <p>&lt;/fieldset&gt;</p>  <p>&lt;/form&gt;</p>  <p>CSS生成内容是在把冒号添加入文档中的绝佳方法：</p>  <p>label:after { content: &quot;:&quot;; }</p>  <p>以该方法处理这个表单让我们看到，可以通过简单的CSS更改，从而灵活机动的从整个站点中移除装饰效果，比挨个处理每一处表单好多了。这个方法也巧妙的完成降级，因为该表单不会自己产生冒号——渐进增强的一个完美样例。</p>  <p>你或许找到了更多编写规则时用到的高级选择器，帮助你的站点渐进增强地为更多先进的浏览器指定的特殊样式。其中一个很棒的例子就是属性选择器，像IE6以及和IE6同时代、甚至更早出现的浏览器无法理解它。Egor Kloos在CSS禅意花园中的名为“Gemination”的作品完美的展示这一效果。</p>  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://www.alistapart.com/d/progressiveenhancementwithcss/gemination.jpg" /></p>  <p align="center"><em>图：Egor Kloos在CSS禅意花园中名为Gemination的作品在标准浏览器和IE6之间的差异对比</em></p>  <p>&#160;</p>  <p>他是怎么做的呢？让我们看看，下面的代码基于他的代码作了细微修改：</p>  <p>/* &lt;= IE 6 */</p>  <p>body { margin: 0; text-align: center; background: #600 none;}</p>  <p>/* IE 7, Mozilla, Safari, Opera */</p>  <p>body[id=css-zen-garden] { margin: 100px 0 0; padding: 0; text-align: center; </p>  <p>background: transparent url(squidback.gif);}</p>  <p>展示出来的差别显著和生动传神的告诉我们渐进增强是如何在CSS中贯彻执行的。</p>  <p>相似的，Andy Clarke在<a href="Andy Clarke had a little fun with IE6 on his site" target="_blank">他的站点</a>上针对IE6做了一点有趣的设计。利用IE中的滤镜和一些条件注释，通过去除页面整体颜色和提供了替换图片，他使站点有了一个“降级”体验效果。</p>  <p><img style="display: block; float: none; margin-left: auto; margin-right: auto" alt="" src="http://www.alistapart.com/d/progressiveenhancementwithcss/stuff-and-nonsense.jpg" /></p>  <p align="center"><em>图：Andy Clark的站点在标准浏览器和IE6之间的差异对比</em></p>  <p>&#160;</p>  <p>巧妙的将以下声明，通过针对IE6以下的条件注释直接添加入样式表，图像就变为灰阶显示：</p>  <p>/* =img for Internet Explorer &lt; 6 */</p>  <p>img { filter: gray; }</p>  <p>尽管这两个例子中包含了过多的日常工作中运用不到的技巧，但它们的确为CSS渐进增强实践，提供了杰出的支撑依据。</p>  <h2><strong>总结</strong></h2>  <p>正如我们讨论过的，对站点进行CSS渐进增强有着多种方式。最简单，或许也是最佳的方式就是先从组织你的样式表并充分了解文档和样式表之间的联系这一步开始。一旦你理解了条件注释的威力，处理各IE之间的差异将是小菜一碟，如果你对如何选择和如何使用选择器了如指掌，那么你将能在CSS文件中完成更加精准的调整。</p>  <p>在这些知识的帮助下，通往成为渐进增强方面的专家之路会更加平坦。下一期我们讨论JavaScript渐进增强的时候，你也一起来吧！</p>  <p>----------------------译者注----------------------</p>  <p>注1：原文是“lower-fi”，有些地方直接翻译成“低保真”，有些翻译成“降级”，本文取后者意。</p>  <p>翻译本文的想法来自于淘宝UED翻译的本系列的第一篇文章：<a title="http://ued.taobao.com/blog/2008/10/09/understanding-progressiveen-hancement-chs-translation/" href="http://ued.taobao.com/blog/2008/10/09/understanding-progressiveen-hancement-chs-translation/">http://ued.taobao.com/blog/2008/10/09/understanding-progressiveen-hancement-chs-translation/</a></p>  <p>也许，淘宝UED也会继续翻译该系列的所有文章，包括本文。</p>  <p>他们的水准毋庸置疑，当然也欢迎大家和我交流~</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/progressive-enhancement-with-css.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=67</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=67&amp;key=091b7a45</trackback:ping></item><item><title>Acid3认知和误解，我们有赢家么？</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/the-really-meaning-of-acid3.html</link><pubDate>Mon, 20 Oct 2008 21:12:55 +0800</pubDate><guid>http://www.liquidroc.name/post/the-really-meaning-of-acid3.html</guid><description><![CDATA[<p>原文：《<a target="_blank" href="http://www.webstandards.org/2008/10/02/dowehaveawinner/">Acid3 receptions and misconceptions and do we have a winner?</a>》</p><p>作者：<a href="http://www.webstandards.org/about/members/lgunther">Lars Gunther</a></p><p>时间：2008年10月2日</p><p><a title="Acid3" target="_blank" href="http://acid3.acidtests.org/">Acid3</a>可能是WaSP在去年完成的最显著的一件事。当Google Chrome推出时，几乎每一个对它的评价都提及这个测试，作为衡量标准的标杆。它被博客和文章频繁提及。现在<a target="_blank" href="http://webkit.org/blog/280/full-pass-of-acid-3/">Surfin' Safari blog已然宣称</a>Webkit的团队认为他们通过了Acid3的每一项测试。毋庸置疑，这是个伟大的成就。祝贺Webkit的团队，但我们更想祝贺每一个网民&mdash;&mdash;得益于该测试，他们将得到更好的体验！</p><p>通过Acid3测试到底意味着什么？</p><p>已经有一些关于该测试和它重要性的疑问了。有些人就有这样的说法&ldquo;我的浏览器没有通过这个测试，但我使用的时候没有碰到任何问题&rdquo;。也有很多其他人似乎认为Webkit和Gogi（Opera的内部核心）在三月份就已经通过了测试&mdash;&mdash;尽管两者都没有对外声称。</p><p>解释这些困惑我们需要解决两个问题：这个测试究竟测试了什么和如何测试的。该测试的主要部分是自动化通过JavaScript，该类测试控制运行100个子测试。拿到100分并不等同于通过Acid3&mdash;&mdash;这是一种普遍的误解，或者说是过于简单化的理解。</p><p>许多子测试都是开发人员热切期待的：支持完整的CSS3选择器，媒体库（<a target="_blank" href="http://www.w3.org/TR/css3-mediaqueries/">Media Queries</a>），SVG字体。的确其中的一部分测试属于少人问津或是过于深奥&mdash;&mdash;但该测试还是极富挑战性的。</p><p>第二部分是渲染测试。一些脚本化的子测试产生的结果影响了渲染，但也有渲染事件排除在此之外。它们中的一些也是开发人员热切期待的：文本阴影，可卸载字体以及display: inline-block。</p><p>第三部分测试被称为&ldquo;平滑&rdquo;准则。它基于速测试。子测试的时间不能太长，其中第26号子测试极富挑战性。相比于<a target="_blank" href="http://mootools.net/slickspeed/">Slickspeed</a>、<a target="_blank" href="http://webkit.org/perf/sunspider-0.9/sunspider.html">Sun Spider</a>，<a target="_blank" href="http://code.google.com/apis/v8/run.html">V8测试组件</a>或是<a target="_blank" href="http://dromaeo.com/">Dromaeo</a>，Acid3的测试并不彻底。但是它仍然成为一个浏览器速度快慢的标杆。</p><p>正如计划的那样。Acid3并不试图成为检验浏览器性能的一个或唯一标杆。实际上，许多其他的测试组件更重要。（我们在下面提供其中一些的链接）</p><p>测试至关重要。在离开测试的情况下，检验一个特定的浏览器如何遵循标准，例如应用标记和正确的显示结果，我们将无法保证得到一个开放和高度协同的网络。</p><p>像Acid3这样引人注目的测试有助于促进网络的协同。希望其他的测试也同样能够得到应有的重视。列出它们不是件有趣的事，但是值得去做。</p><p>抛开为自身的浏览器提升CSS性能的因素，微软为CSS2.1测试组提供了<a target="_blank" href="http://blogs.gotdotnet.com/ie/archive/2008/08/19/more-tests-submitted-to-the-w3c-css-2-1-test-suite.aspx">2524个测试案例</a>。他们值得称赞。</p><p>正如我们所知，目前IE浏览器在标准的遵循上有些落后于其他浏览器。它是最后一个通过Acid2测试的，并且在Acid3中失败的项目比任一其他浏览器都多。但我们能因为通过了Acid3测试就说Webkit是最好的渲染引擎么？</p><p>当然不行。Acid3只是众多指标中的一项。Webkit的成就是伟大的&mdash;&mdash;在许多其他激动人心的事情中他们充当着先锋的角色，例如<a target="_blank" href="http://webkit.org/specs/CSSVisualEffects/CSSTransitions.html">CSS过渡（CSS transitions）</a>和转换。松鼠鱼中极度JavaScript的展现，让它看上去和真的一样。</p><p>Opera是另一个需要致敬的领袖。它是唯一一款在SVG字体组件上支持超过90%的浏览器。它同时也是唯一贯彻目前<a target="_blank" href="http://blog.whatwg.org/this-week-in-html-5-episode-5">整合至HTML 5</a>中的<a target="_blank" href="http://www.whatwg.org/specs/web-forms/current-work/">Web Forms 2.0</a>的浏览器。远在Acid3推出前，它就可以支持媒体库和SMIL。</p><p>Gecko（结合Spidermonkey）已不在是失败者。除了技术竞赛外，不难猜测Webkit团队急于通过Acid3也是出于市场的考虑&mdash;&mdash;因为他们也许需要领先Mozilla一步。在Acid3获得重视之前，Mozilla正全力以赴于Firefox3的推出。现在他们正致力于Acid3的测试，相比与Webkit，从另一个角度讲他们是令人敬佩的。看看有关bug 410460的讨论和与之相关的bug，任何一点改进必须慎之又慎。甚至于当某一个特性对于通过Acid3来说已经足够的时候，工作仍在继续进行。</p><p>实际上，Acid3中的确仍存在一个开源问题，该问题可能让Webkit再次变的不适应。<a href="http://lists.w3.org/Archives/Public/www-style/2008Sep/0218.html">http://lists.w3.org/Archives/Public/www-style/2008Sep/0218.html</a>。也许它已经被修复。</p><p>也许这可以被比喻成提着水桶赛跑，某个选手率先撞线，而另一面，其他选手桶里的水并没有减少。它们都做得很好。（随便提一下，Firefox的内部版本得到了97的分数，在Windows和Mac平台下可卸载字体也可以工作了）</p><p>最后的赢家既不是Webkit、Opera、Mozilla也不是微软，但开发人员在工作中得到了更好的特性和更完善的浏览器一致性。这意味着，从长远来看开发人员将可以把精力投入到用户体验，而不是浏览器缺陷之中。Acid3的获益者是网络中的每一人。</p><p>供参考的一些测试组件：</p><ul>    <li><a href="http://www.w3.org/Style/CSS/Test/CSS2.1/current/">Cascading Style Sheets level 2 revision 1 </a></li>    <li><a href="http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/">Selectors</a></li>    <li><a href="http://www.w3.org/Style/CSS/Test/CSS3/Color/20070927/">CSS Color Module</a></li>    <li><a href="http://www.w3.org/DOM/Test/">Collection of DOM tests</a></li>    <li><a href="http://en.wikipedia.org/wiki/SVG">SVG</a></li>    <li><a href="http://en.wikipedia.org/wiki/HTML_5">Web Forms</a></li>    <li><a href="http://philip.html5.org/tests/canvas/suite/tests/">Canvas</a></li></ul>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/the-really-meaning-of-acid3.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=65</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=65&amp;key=2de2f4f6</trackback:ping></item><item><title>雅黑字体下“·”的显示问题</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/middot-or-bull.html</link><pubDate>Tue, 09 Sep 2008 16:10:10 +0800</pubDate><guid>http://www.liquidroc.name/post/middot-or-bull.html</guid><description><![CDATA[<p><strong>2008-12-16更新：</strong>看起来，微软也认识到了雅黑字体的问题，在最新的Windows 7系统中，雅黑字体得到了版本升级，该版本修正了本文所说的问题。<a target="_blank" href="http://60.191.125.232/zjol_dpc_storage_03/yahei_6.02.rar">点击下载最新的雅黑字体（傻瓜安装包）</a>。不过，在我看来，真正解决这个问题，如同IE6的用户升级到IE7一样的困难，用户的使用习惯很难改变（大部分时候是他们不知道如何改变）。我越来越多的怀疑Vista系统在步Windows Me的后尘。</p><p>在使用宋体需多年之后，我们多少产生了一些&ldquo;审美疲劳&rdquo;，微软雅黑字体的出现无疑使网页设计者看到了改变的希望。</p><p>Vista系统下，雅黑成为了默认字体，Office 2007的安装时也会附带雅黑字体。此外，我们还可以在网上轻易地搜索到雅黑字体的安装，让Windows Xp也可以体验雅黑的魅力。</p><p>在实际应用雅黑的过程中，我发现了一个小问题，困扰了我许久：</p><p>雅黑字体下，页面无法正常显示&ldquo;&middot;&rdquo;也就是&ldquo;&amp;middot;&rdquo;。遇到过这个问题的朋友可能心领神会，不知道的可以看如下的图片。</p><p><a href="http://www.liquidroc.name/upload/yahei_middot_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="370" alt="yahei_middot" width="597" border="0" src="http://www.liquidroc.name/upload/yahei_middot_thumb.png" /></a></p><p>&nbsp;</p><p>不论是实际输入一个&ldquo;&middot;&rdquo;，还是代之以&ldquo;&amp;middot;&rdquo;，雅黑下通通显示成一个空心的框，字体越大这个框越大。想要使用雅黑字体方案的网站，要么无视这个&ldquo;错误&rdquo;，要么就要想想其他的办法。</p><p>于是，我尝试着使用其他的字符实体以代替这个&ldquo;&middot;&rdquo;，最终我选择了&ldquo;&amp;bull;&rdquo;。这个字符实体可能有些朋友不是很熟悉，因为它不在常用的字符实体列表范围之内。一开始，我在《HTML&amp;XHTML权威指南》的附录中也没有发现它的身影，因为它并不在ISO Latin-1字符集之中。最后还是<a href="o_rain1977.html">苏沈小雨</a>的CSS 2.0手册帮了大忙，我在HTML附加命名实体里找到了它。</p><p>&ldquo;&amp;bull;&rdquo;之中的bull可不是公牛队的意思，它是bullet的简略，在U2022 ISOpub中它属于通用标点符号， 定义是黑色的小圆点（black small circle）。</p><p>再回过头看上面的图，在第四行中，我使用了&ldquo;&amp;bull;&rdquo;之后，效果应当说符合要求。但是当用户电脑中没有微软雅黑的时候，就会变成第五行那样的效果，&ldquo;&amp;bull;&rdquo;显示得太过夸张了。</p><p>考虑到页面代码的实际编写，雅黑的应用一般出现在大的标题上，所以我们将font-family: &quot;微软雅黑&quot;;再增添一个字体选择&mdash;&mdash;font-family: &quot;微软雅黑&quot;, &quot;黑体&quot;;。这样以来既能够体验雅黑字体，又涵盖了绝大部分的用户（应该没有什么人会去删除系统fonts文件夹下的黑体吧），并且在标题的视觉效果上雅黑和黑体要强于宋体</p><p>不过，对于正文的字体设置，我依然推荐使用&ldquo;宋体&rdquo;。</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/middot-or-bull.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=49</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=49&amp;key=0a346400</trackback:ping></item><item><title>Google Chrome和Safari 3.1的CSS Hack</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/css-hack-for-google-chrome-and-safari-31.html</link><pubDate>Thu, 04 Sep 2008 16:50:33 +0800</pubDate><guid>http://www.liquidroc.name/post/css-hack-for-google-chrome-and-safari-31.html</guid><description><![CDATA[<p>真是说时迟那时快，<a target="_blank" href="http://www.evotech.net/blog/about/">Estelle Weyl</a>的博客上贴出了关于Google Chrome的CSS Hack，其实就是针对于Safari 3.1的，都是自家兄弟嘛。</p><p>以下为翻译内容：</p><p>选择器的不兼容可以作为一种正当的途径用于区分不同的浏览器。和Safari 3.1一样，Chrome支持所有的选择器。我的建议是使用body:first-of-type,该<a target="_blank" href="http://www.evotech.net/blog/2007/06/targeting-safari-30-with-css/">针对于Safari的CSS hack</a>可以作为Safari 3+和Chrome的过滤器。但只针对Chrome而排除Safari 3.1是毫无道理可言的，如果你想要针对二者，过滤Safa 3.0，我将试着这样做：</p><div class="csharpcode"><pre class="alt">body:nth-of-type(1) p{ color: #333333; }</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>只有Google Chrome和Safari 3.1浏览器将段落显示为灰色（原文是red）。思路如下：</p><ul>    <li>页面只有一个body元素</li>    <li>只有两个浏览器支持<font color="#ff0000">:nth-of-type() </font>伪类</li>    <li>body:nth-of-type(1)只会匹配第一个，也是唯一个body元素。</li></ul><p>可以使用body:nth-of-type(1)作为前缀，在之后使用更多的选择器去定义body下的子元素。</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/css-hack-for-google-chrome-and-safari-31.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=48</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=48&amp;key=8a82e750</trackback:ping></item><item><title>样式表贴图定位（CSS Sprites）：图像切片的死亡之吻</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/my_view_on_css_sprites.html</link><pubDate>Thu, 04 Sep 2008 11:11:35 +0800</pubDate><guid>http://www.liquidroc.name/post/my_view_on_css_sprites.html</guid><description><![CDATA[<p>《<a href="http://alistapart.com/articles/sprites">CSS Sprites: Image Slicing&rsquo;s Kiss of Death</a>》是一篇旧文，于2004年3月5日发表于alistapart的<a target="_blank" href="http://alistapart.com/issues/173">第173期</a>，作者是大名鼎鼎的<a target="_blank" href="http://www.csszengarden.com">CSS禅意花园</a>的园主<a href="http://alistapart.com/authors/s/daveshea">Dave Shea</a>。之所以把它翻出来，是因为最近在看的关于页面优化的一些文章，都不约而同地提到了这项技术，温故知新~</p><p>有趣的是，关于CSS Sprites这个名称的中文翻译一直没有定论，如果依照词典直译成样式表<a target="_blank" href="http://dict.iciba.com/Sprite/">精灵</a>，恐怕没有几个人会同意这样的叫法。就好像有人把其后的image slicing直译成图像限制一样，会让人摸不着头脑~</p><p>和直译不同，也有人把它意译为CSS图像拼合，的确，整个css sprites的图像制作过程就是一种图像拼合，将页面所需的修饰性图像全部打包在一张图像中。但是对于如何用css层面上的positio定位来使用这个拼合的图像，这个名称就显得名不副实了。我倒是认为，这种css控制背景图像位置的技术和3D软件中的<a target="_blank" href="http://school.3dmax8.com/cankao/3dsmax_web/uvw_map_modifier.html">UVW贴图</a>有神似的地方，暂且就叫它样式表贴图定位吧。说到底，叫什么不重要，了解它才是王道&hellip;&hellip;</p><p>---------------------------------------- 开始正文的分割线 ----------------------------------------</p><p>原文如下：</p><p>回到电视游戏盛行的年代（我们这里讲的是8位游戏机的辉煌时期），那时的图像非常的简单，位图制成的二维形象和背景场景独立分开，这一点很像现在的像素艺术。成百上千的小图像成为构建整个游戏的视觉基石。</p><p><img alt="" src="http://alistapart.com/d/sprites/sprites.gif" /></p><p>当游戏慢慢变得复杂，技术的提升使得管理众多的小图片成为可能，游戏画面变得流畅自然起来。其中一点就是，贴图定位技术的引入，在代码控制下抽出所需的图片，这些图片在主图层中被映射于各自位置的之上，并有选择性地将其呈现于屏幕上。</p><h3>这和Web有什么关系？</h3><p>三十年河东三十年河西，虽然3D游戏的兴起让贴图技术日落西山，但同时兴起的2D手机游戏让贴图技术有了焕发新生的可能。现在，通过一点点的数学计算以及完备的css技术，我们将这个基本概念应用于整个web设计之中。</p><p>确切地说，我们将用CSS方案取代陈旧的图像切片（加上JavaScript）技术。更进一步的阐述是：建立一种网格图像，采用一个方法将网格中的每一个独立小单元抽出。我们可以在这个主图层文件中放置按钮、导航以及一切元素，连同它们&ldquo;初始&rdquo;和&ldquo;之后&rdquo;的链接状态。</p><h3>样式表贴图定位如何运作？</h3><p>在css应用上我们只需要一点创造性思维，这就是全部了。</p><p>让我们从主图层开始。将其分成四等分矩形，在<a href="http://alistapart.com/d/sprites/test-3.jpg">主图层图像</a>中你将看到&ldquo;初始&rdquo;图像在上，&ldquo;之后&rdquo;的悬停状态在其下。现在4个链接之间并没有清晰的界线，现在想象一下每一块文字对应一个链接。（为了简单起见，在其后的文章中，我们依然把链接图像叫做&ldquo;初始&rdquo;图像，悬停状态下叫&ldquo;之后&rdquo;。对诸如:active,:focus以及:visited的链接状态，这里不展开讨论。）</p><p>熟悉Petr Stanicek（Pixy）<a target="_blank" href="http://wellstyled.com/css-nopreload-rollovers.html">快速翻转图像</a>方法的朋友也许已经猜出我们将要做什么。感谢Pixy的这个样例，我们接下来的讨论都是基于它的基础功能。但是别高兴的太早了~</p><p>先来看HTML部分。每一个优秀的css技巧都力图在最简洁的代码块上添加视觉效果。本方法也不例外。</p><div class="csharpcode"><pre class="alt"><span class="lnum">   1: </span><span class="kwrd">&lt;</span><span class="html">ul</span> <span class="attr">id</span><span class="kwrd">=&quot;skyline&quot;</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>   <span class="kwrd">&lt;</span><span class="html">li</span> <span class="attr">id</span><span class="kwrd">=&quot;panel1b&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;#1&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   3:  </span>   <span class="kwrd">&lt;</span><span class="html">li</span> <span class="attr">id</span><span class="kwrd">=&quot;panel2b&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;#2&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span>   <span class="kwrd">&lt;</span><span class="html">li</span> <span class="attr">id</span><span class="kwrd">=&quot;panel3b&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;#3&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre class="alt"><span class="lnum">   5:  </span>   <span class="kwrd">&lt;</span><span class="html">li</span> <span class="attr">id</span><span class="kwrd">=&quot;panel4b&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;#4&quot;</span><span class="kwrd">&gt;&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   6: </span><span class="kwrd">&lt;/</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre></div><p>以上的代码将是我们这个例子的基础。简单的标记将使得代码在老旧的、对css支持差的浏览器中也得以运行，这也是行业中的一个良好趋势。对于我们力争要达到的目的，这是个很不错的主意。（我们在这里忽略了链接中的文字，你可以使用你所钟爱的<a target="_blank" href="http://www.mezzoblue.com/tests/revised-image-replacement/">图像替代法</a>来隐藏最后添加的文字。） <style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><h3>CSS的运用</h3><p>有了这些编写好的块元素，我们可以开始着手css。在开始之前有一点需要注意&mdash;&mdash;由于IE的一个bug，我们需要让&ldquo;之后&rdquo;图像紧贴在&ldquo;初始&rdquo;图像之后，而不是一张取代另一张的做法。尽管当我们把它们排成一行时，并没有什么真正的视觉差别，但这样会避免一个我们不想见到的加载&ldquo;闪烁（flicker）&rdquo;。</p><div class="csharpcode"><pre class="alt"><span class="lnum">   1:  </span>#skyline {</pre><pre><span class="lnum">   2:  </span>    width: 400px; height: 200px;</pre><pre class="alt"><span class="lnum">   3:  </span>    background: url(test-3.jpg);</pre><pre><span class="lnum">   4:  </span>    margin: 10px auto; padding: 0;</pre><pre class="alt"><span class="lnum">   5:  </span>    position: relative;}</pre><pre><span class="lnum">   6:  </span>  #skyline li {</pre><pre class="alt"><span class="lnum">   7:  </span>    margin: 0; padding: 0; list-style: none;</pre><pre><span class="lnum">   8:  </span>    position: absolute; top: 0;}</pre><pre class="alt"><span class="lnum">   9:  </span>  #skyline li, #skyline a {</pre><pre><span class="lnum">  10:  </span>    height: 200px; display: block;}</pre></div><p>和想象中不同，我们没有把&ldquo;初始&rdquo;图像指定给这些链接，而是用&lt;ul&gt;代替，后面你将看到这是为什么。</p><p>css的其他部分，分别给#skyline和列表项定义了尺寸、范围，给列表项定位，以及去除了不想要看到的默认列表样式中的圆点。</p><p>我们将链接作为一个透明的空层，通过父层级&lt;li&gt;来给它们定位。如果我们跳过&lt;li&gt;，直接定位这些链接元素，在老的浏览器上将会出现错误，所以我们不能这么做。</p><h3>定位链接</h3><p>&lt;li&gt;元素被绝对定位，为什么它们没有出现在浏览器窗口的顶端？那是因为对于绝对定位元素有一个奇异（quirky），但却很使用的特性（roc：我不觉得有什么奇异的地方），绝对定位元素会以离它们最近的父级定位元素为基点，而不是浏览器窗口这个根元素。因为我们给#skyline定义了position: relative;属性，所以我们可以将&lt;li&gt;元素绝对定位于#skyline的左上角。</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>#panel1b {left: 0; width: 95px;}</pre><pre><span class="lnum">   2:  </span>#panel2b {left: 96px; width: 75px;}</pre><pre><span class="lnum">   3:  </span>#panel3b {left: 172px; width: 110px;}</pre><pre><span class="lnum">   4:  </span>#panel4b {left: 283px; width: 117px;}</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>因此#panel1不再独占水平位置，#panel2b基于#skyline水平向左96px，其他的也类似。我们将链接定义为display: block;使其高度和&lt;li&gt;相同，这样我们就可以填充这些&lt;li&gt;了。这正是我们想要得到的效果。</p><p>现在我们有了一个链接效果的基础图片，但悬停状态还没有设置。<a target="_blank" href="http://alistapart.com/d/sprites/ala-image1.html">查看样例</a>，<a target="_blank" href="http://alistapart.com/d/sprites/ala-image1a.html">加上边框</a>也许可以看得更清楚些。</p><h3>悬停</h3><p>在过去，为悬停状态翻转一张新图片我们需要使用一些JavaScript。现在我们将所有的集中在一张图片上，我们需要一种有选择的抽出各种状态的方法。</p><p>如果我们在:hover状态下应用整张贴图，不附加其他值，我们只能看到左上角&mdash;&mdash;这不是我们想要得到的，虽然我们的确希望依照链接的范围裁剪。我们需要以某种方式移动这个贴图的位置。</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>#panel1b a:hover {</pre><pre><span class="lnum">   2:  </span>    background: transparent url(test-3.jpg)</pre><pre><span class="lnum">   3:  </span>    0 -200px no-repeat;}</pre><pre><span class="lnum">   4:  </span>#panel2b a:hover {</pre><pre><span class="lnum">   5:  </span>    background: transparent url(test-3.jpg)</pre><pre><span class="lnum">   6:  </span>    -96px -200px no-repeat;}</pre><pre><span class="lnum">   7:  </span>#panel3b a:hover {</pre><pre><span class="lnum">   8:  </span>    background: transparent url(test-3.jpg)</pre><pre><span class="lnum">   9:  </span>    -172px -200px no-repeat;}</pre><pre><span class="lnum">  10:  </span>#panel4b a:hover {</pre><pre><span class="lnum">  11:  </span>    background: transparent url(test-3.jpg)</pre><pre><span class="lnum">  12:  </span>    -283px -200px no-repeat;}</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>这些像素位置值要如何放置？我来解释一下：第一个值用来设置水平位置，第二个用来设置垂直位置。</p><p>每一个垂直位置都是相同的；由于整张贴图的高度是400px，初始和悬停各占据上下一半，所以我们将很容易的计算出高度值。想要将整个背景贴图向上移动200px，我们需要给一个数量相同的负值。以这个链接的顶端或者说0高度作为原点，背景图将在这个原点200px之上，也就相当于说，我们将原点设在了-200px上。</p><p>同样的，如果每一个链接的左边界都是0，我们需依据&lt;li&gt;的宽度，给背景贴图一个偏移值，就像前面我们做过的那样。所以，第一个链接不需要偏移，因为它就是水平位置的原点。第二个链接需要的偏移值是第一个链接的宽度，第三个链接的偏移值是前两个宽度相加，而最后一个链接的偏移值则是之前三个宽度的综合。</p><p>这个过程解析起来有点绕，不是吗？但如果亲手去调试一下，你将很快理解它们的工作原理，一旦你对此熟悉起来，它们看上去就不那么难搞了。</p><p><a target="_blank" href="http://alistapart.com/d/sprites/ala-image3.html">看看我们得到了什么</a>，一个单一图片翻转转化成为了一个无序列表。</p><h3>按钮</h3><p>在上面的例子里，并不是出于特别的原因，我们将链接彼此相邻。图像地图也许在有些地方比较合适，但把它们分开作为各自独立的按钮又会如何？我们可以给其添加边框和边距，</p><p>实际上，积木已经搭好了。我们其实不比对现有的代码大动干戈；最大的变动就是需要创建一个新的背景图片，而不是像上个例子中让链接彼此相连。由于我们不能给&lt;ul&gt;应用一个整体的原始背景图，我们以&lt;li&gt;代替，并且像上面讨论过的那样设置悬停状态下的偏移值。</p><p>使用一张<a target="_blank" href="http://alistapart.com/d/sprites/icons.gif">合适的图片</a>以及给&lt;li&gt;之间添加些许边距，<a target="_blank" href="http://alistapart.com/d/sprites/ala-buttons1.html">我们就得到了这些按钮</a>。</p><p>在这个例子里，我们添加了1px的边框，链接的最终宽度增加，这会影响到偏移值；我们需要增加2px的偏移值以抵消这一影响。</p><h3>不规则形状</h3><p>到目前为止我们都把精力放在不重叠的矩形形状上。如何将大量的复杂图像切片处理的就像是用Fireworks和ImageReady输出的那样简单呢？别紧张，我们同样可以做到。</p><p>开始的部分，我们采用第一个例子中同样的方法。给&lt;ul&gt;设置背景图，然后取消列表项的项目符号，以及宽度等其他定义。显著的区别在于我们要给这些&lt;li&gt;定位；目的就是让<a target="_blank" href="http://alistapart.com/d/sprites/ala-blobs1.html">这张图片</a>上每一个图形被包裹住。</p><p>因为我们相对于&lt;ul&gt;的左上角应用绝对定位，我们得以随心所欲地将链接精确放置。现在只剩下要处理<a target="_blank" href="http://alistapart.com/d/sprites/ala-blobs2.html">悬停状态</a>了。</p><p>值得注意的是，在这个案例中，仅仅设置初始和悬停状态图片是不够的。因为它们彼此重叠，所以在只是设置了一个悬停状态之后，块和块之间在悬停下会彼此露馅。事实上，它显示的块就是这个链接的边框范围。（<a target="_blank" href="http://alistapart.com/d/sprites/ala-blobs3.html">这里</a>可以看得很清楚）</p><p>那么如何避免呢？解决方法是添加第二种悬停状态图片背景，并且仔细的选择哪些图形需要出现。重新制作的<a target="_blank" href="http://alistapart.com/d/sprites/blobs.gif">贴图背景</a>被分割成在第一个悬停状态下紫色和蓝色图形出现，绿色、橙色和黄色图形在第二个悬停状态下出现。这样就避免了每一个图形在悬停状态下露出旁边的图形。<a target="_blank" href="http://alistapart.com/d/sprites/ala-blobs2.html">大功告成</a>。</p><h3>优缺点</h3><p>最后的几点关键。我们新的样式表贴图定位法在绝大部分的现代浏览器运作的很好。（<font color="#ff0000">Roc：这里的观点都是对的，但文本诞生的时间和现在&mdash;&mdash;相对于浏览器升级速度&mdash;&mdash;相去甚远，Opera6和7的版本就像是石器时代那么遥远了，所以这一段可以跳过</font>）Opera 6是个例外，在悬停状态下，它无法应用背景图片。为什么？我们还不能确定，但它意味着我们的悬停不起作用了。链接依然有效，如果它们都标记正确的话，最终的结果就是在Opera 6下它呈现出一个静态的，但可用的图片地图。我们寄希望于即将推出的Opera 7。</p><p>另一个困扰是<a target="_blank" href="http://www.alistapart.com/articles/fir/">FIR</a>。在极少数情况下，用户禁止了下载图片，但依然保持CSS样式，那么在页面上原来由图片占据的地方就会出现一片空白。链接虽然仍在，但却是不可见的。截至目前，还没有很好的解决之道。</p><p>还有就是文件的大小。有一种观点就是认为双倍尺寸的图片文件一定大过这些单一切片的集合，因为图片涵盖的尺寸比较大。所有的图片格式都有一个极限值（例如1x1px的gif图片总是在50bytes左右），切片越多，这种极限值就越快的堆积。此外，一张大的gif贴图只需要一个颜色表（color table），如果是切片，每一个切片图都需要附加一个自己的颜色表。</p><p>最后，不要忘了我们的标记是干净漂亮的，这是其优势所在。HTML列表完美，并且图片替代文本链接技术对于屏幕浏览者可用性更高。替换贴图里图形更是简单无比，因为我们只用一个css文件就可以控制尺寸大小和定位，所有的图形也都在一张大图之中。</p><p>---------------------------------------- 翻译结束的分割线 ----------------------------------------</p><p>感谢耐心看完我拙劣的翻译。</p><p>在css这个领域，04年的文章完全可以称得上是古董级，但这篇依然没有失去它的价值，尽管现在看来CSS Sprites在技术并没有太多的超前性，但是完美应用这项技术的网站并没有许多。因为，CSS Sprites这项css技术的优势根本在于减少了服务器请求次数，压缩了带宽开支，越是大型的网站越是看重这一点。</p><p>另外有一点对于使用Dreamweaver CS4 Beta的朋友需要注意，这个测试版本很显然它的可视化引擎不能正确处理背景位置，在可视化下编辑CSS Sprites，你会看到背景图片到处乱飞。CS3的正式版中没有这个问题。</p><p>最后，有一个好消息，<a href="http://alistapart.com/authors/s/daveshea">Dave Shea</a>时隔4年多推出了他的又一篇力作：<a target="_blank" href="http://alistapart.com/articles/sprites2">CSS Sprites2 - It's JavaScript Time</a></p><p>关注样式表贴图定位技术的朋友一定不能错过。</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/my_view_on_css_sprites.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=47</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=47&amp;key=933cec12</trackback:ping></item><item><title>从语义化谈网站导航菜单的分割线和水平居中问题</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/semantics-navigator.html</link><pubDate>Fri, 08 Aug 2008 18:22:11 +0800</pubDate><guid>http://www.liquidroc.name/post/semantics-navigator.html</guid><description><![CDATA[<p>写这篇啰嗦的文章，缘由来自于<a href="http://jorux.com/">Jorux Notebook</a>的《<a target="_blank" href="http://www.blueidea.com/tech/web/2008/6078.asp">什么是Semantics?</a>》文章。</p><p>实际上，从《网站重构》一书开始在国内流行之后，Zeldman提出的语义化标记就已经在一定程度上流传开来。在抛弃table布局页面之后大家突然发现，原来这还不够，随意地使用&lt;p&gt;或者&lt;div&gt;来进行布局实际上和table布局一样的糟糕。</p><p>Jorux的例子（如下）：</p><p><font color="#0080ff">我是老大 | 我是不好意思说 | 老三 | 老四在这里 | 老幺</font></p><p>Jorux指出，在这种极为普遍的导航样式中（通常是用于网站底部的信息导航，100个网站里有90个采用这样的模式），我们应该使用无序列表，而不是下面这种:</p><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span><span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">home</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>首页<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   3:  </span><span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">about</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>关于<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   4:  </span><span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">blog</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>博客<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   5:  </span><span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">message</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>留言<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   6:  </span><span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">album</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>相册<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   7:  </span><span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>甚至是使用了&lt;ul&gt;，但是依然将修饰线条作为内容元素的写法也是五十步笑百步：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">home</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>首页<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   3:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;</span>|<span class="kwrd">&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">about</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>关于<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   5:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;</span>|<span class="kwrd">&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   6:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">blog</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>博客<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   7:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;</span>|<span class="kwrd">&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   8:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">message</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>留言<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   9:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;</span>|<span class="kwrd">&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  10:  </span><span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span>=&rdquo;<span class="attr">album</span>.<span class="attr">html</span>&rdquo;<span class="kwrd">&gt;</span>相册<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  11:  </span><span class="kwrd">&lt;/</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><pre class="csharpcode"><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></pre><p>遗憾的是，内容与样式分离web标准化建设的推进道路总是充满了各种各样的阻碍。即使是新浪和淘宝在它们的页面底部也存在着上述的情况。</p><p>先来看新浪的截图：</p><p><a href="http://www.liquidroc.name/upload/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" width="385" height="50" src="http://www.liquidroc.name/upload/image_thumb.png" /></a></p><p>代码（简略了内容）：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">style</span><span class="kwrd">=&quot;padding-bottom:6px;&quot;</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>新浪简介<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> ┊ </pre><pre><span class="lnum">   3:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>About Sina<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> ┊ </pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>广告服务<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> ┊ </pre><pre><span class="lnum">   5:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>联系我们<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> ┊</pre><pre><span class="lnum">   6:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>诚聘英才<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   7:  </span><span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>为什么要这么做，有过网页制作经验的朋友大概会了解。网站底部的导航通常都是以比较简单的文本形式出现，居中，再附加一些修饰&mdash;&mdash;大部分都是&ldquo;|&rdquo;和&ldquo;&middot;&rdquo;或者&ldquo;&mdash;&rdquo;。html部分采用新浪的做法，节省了编写css的时间，最重要的是让一切水平居中显示将是非常简单的事情。只需要将&lt;div&gt;的text-align设置为center就万事大吉。</p><p>这里需要讨论的是，到底使用什么标记才算是语义化？</p><p>我们没有教科书，任何一本某某权威指南不会写着：你应该使用&lt;ul&gt;和&lt;li&gt;，而不是&lt;div&gt;和&lt;p&gt;来制作导航菜单。也就是说，我认为如果考虑到实际项目的操作，使用前者或后者都不是一个严重到会出现违背XHTML准则的问题。</p><p>我们来看淘宝的底部：</p><p><a href="http://www.liquidroc.name/upload/image_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" width="416" height="45" src="http://www.liquidroc.name/upload/image_thumb_1.png" /></a></p><p>在我看到，如果按照zeldman的思路，应该这样去写：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">dl</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>    <span class="kwrd">&lt;</span><span class="html">dt</span><span class="kwrd">&gt;</span>全球阿里巴巴 - 阿里巴巴网络<span class="kwrd">&lt;/</span><span class="html">dt</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   3:  </span>    <span class="kwrd">&lt;</span><span class="html">dd</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span>        <span class="kwrd">&lt;</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   5:  </span>            <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;</span>中国站<span class="kwrd">&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   6:  </span>            <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;</span>国际站<span class="kwrd">&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   7:  </span>            ......</pre><pre><span class="lnum">   8:  </span>        <span class="kwrd">&lt;/</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   9:  </span>    <span class="kwrd">&lt;/</span><span class="html">dd</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  10:  </span><span class="kwrd">&lt;/</span><span class="html">dl</span><span class="kwrd">&gt;</span></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>但实际上，淘宝的代码是这样：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">div</span> <span class="attr">class</span><span class="kwrd">=&quot;ali-group&quot;</span> <span class="attr">style</span><span class="kwrd">=&quot;width:680px;margin:5px auto;&quot;</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>全球阿里巴巴 - 阿里巴巴网络：</pre><pre><span class="lnum">   3:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>中国站<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>国际站<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   5:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>日文站<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   6:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>淘宝站<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   7:  </span>    <span class="kwrd">&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>支付宝<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;</span> | </pre><pre><span class="lnum">   8:  </span>    ......</pre><pre><span class="lnum">   9:  </span><span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>为什么一个如此提倡标准化的UED小组所编写的淘宝代码中也有和Jorux说法相违背，不严格按照语义化标记来操作呢？</p><p>因为，这样的水平居中和添加&ldquo;|&rdquo;不会那么烦人。</p><h3>烦人的分割线</h3><p>不要小看这个&ldquo;|&rdquo;，加入这么一个小小的修饰线条，看似简单，实际上还是比较头痛的。</p><p>首先我们知道，这个竖线是分割线，是把一个个链接从视觉上分开的一种手段，有多种方式去实现这一个效果：</p><p>1、直接插入&ldquo;|&rdquo;实体，但这和用空的table来撑开空白一样，是不符合内容和样式分离准则。</p><p>2、使用border-right来给每一个链接加上一个1px宽的边框。缺点是这个边框线条的高度定义起来比较讨厌，作为行内元素的a，无法应用到上下内边距来控制高度，勉强使用行高line-height只会让你在实际应用中漏洞百出。</p><p>3、使用background来给每一个链接加上一个竖线的图片背景，这种方式在视觉效果上应用灵活，但缺点是会多制作一张图片（尽管你可以CSS Sprites或者你认为一条竖线的图片大小可以忽略不计），同样高度无法定义。</p><p>4、使用:after这样的伪类元素，如a:after { content: &quot;|&quot;; }。可以再添加font-size来稍稍控制高度。尽管这样的一种做法被一些css玩家所推崇，毕竟了解的人少，使它看上去比较的高深和复杂。实际上它的缺点也最多。首先，:after在版本8以下的IE中通通免谈，这就意味着大部分浏览者无法看到这样的效果。其次，看上去这一条&ldquo;|&rdquo;是由css来控制的样式，实际上它在html中实际生成了内容，本质上和直接在&lt;a&gt;之后插入一个&ldquo;|&rdquo;没有区别。</p><p>综上所述，我们理应抛弃第一种做法，采用2、3、4中的一种来显示这个分割线效果。然而接踵而至的问题是，不管你用了哪种方法，你都要考虑如何去除最后一个&ldquo;|&rdquo;分割线。让导航看上是这样：</p><p><font color="#0080ff">我是老大 | 我是不好意思说 | 老三 | 老四在这里 | 老幺</font></p><p>而不是这样：</p><p><font color="#0080ff">我是老大 | 我是不好意思说 | 老三 | 老四在这里 | 老幺 |</font></p><p>常用的做法是给div中的最后一个a，或者ul中的最后一个li（或者都是第一个a和li，这取决与你css中的左右位置）添加一个id或者class，例如：</p><pre class="csharpcode"><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">ul</span> <span class="attr">id</span><span class="kwrd">=&quot;menu&quot;</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>    ......    </pre><pre><span class="lnum">   3:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;#&quot;</span><span class="kwrd">&gt;</span>王老五<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span> <span class="attr">class</span><span class="kwrd">=&quot;last&quot;</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;#&quot;</span><span class="kwrd">&gt;</span>老幺<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   5:  </span><span class="kwrd">&lt;/</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre></div><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></pre><p>然后在css添加对这个.last的单独定义，去除它的边框或者背景或者:after生成的content内容。</p><p>如此的繁琐，是不是已经开始头大了？</p><h3>水平居中</h3><p>从分割线的问题，我们往下讨论导航的水平居中问题。</p><p>淘宝的另一个底部导航采用了不让人头大的选择：</p><p><a href="http://www.liquidroc.name/upload/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" border="0" alt="image" width="511" height="46" src="http://www.liquidroc.name/upload/image_thumb_2.png" /></a></p><p>在这个例子中，HTMl如下：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span><span class="kwrd">&lt;</span><span class="html">ul</span> <span class="attr">class</span><span class="kwrd">=&quot;foot-nav&quot;</span> <span class="attr">style</span><span class="kwrd">=&quot;width:690px;_width:695px;&quot;</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   2:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>关于淘宝<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   3:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>广告服务<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   4:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>合作伙伴<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   5:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>帮助中心<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   6:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>诚征英才<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   7:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>联系我们<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   8:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>网站地图<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">   9:  </span>    <span class="kwrd">&lt;</span><span class="html">li</span><span class="kwrd">&gt;&lt;</span><span class="html">a</span> <span class="attr">href</span><span class="kwrd">=&quot;&quot;</span><span class="kwrd">&gt;</span>热门品牌<span class="kwrd">&lt;/</span><span class="html">a</span><span class="kwrd">&gt;&lt;/</span><span class="html">li</span><span class="kwrd">&gt;</span></pre><pre><span class="lnum">  10:  </span><span class="kwrd">&lt;/</span><span class="html">ul</span><span class="kwrd">&gt;</span></pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>这里的采用了标准的写法，没有分割线，没有额外的id或class，没有上面讨论的烦人的各种问题。</p><p>然而这种写法意味着，如果将li的display设置block，text-align:center无法轻松的将这个导航水平放置在页面的正中，除非你给ul定义了一个宽度，在上面的代码中淘宝也的确是这样去做的。</p><p>如果，导航菜单中的项目数量不能够确定，整体的宽度势必也要成为变量&mdash;&mdash;一个未知宽度。不断地去修改这个width，以确保margin: 0 auto;可以让这个导航水平居中无疑将让你的工作变得琐碎和困难。</p><h3>未知宽度的水平居中</h3><p>最简单的方法，就是让每一个li元素不要以block的形式float:left，以inline的方式让它们一字排开，给ul一个text-align:center就可以搞定这一切。</p><p>我做了这样一个例子，<a target="_blank" href="http://www.liquidroc.name/download/demo/nav_test2.html">demo1</a>。为了图省事，我没有做图，采用背景图片的方式显示分割线，而是使用了:after生成content的方法。</p><p>在css中的最后，我添加这样两行：</p><div class="csharpcode"><pre><span class="lnum">   1:  </span>#menu li:before { content: &quot;|&quot;; padding-right: 10px; }</pre><pre><span class="lnum">   2:  </span>#menu li:first-child:before { content: &quot;&quot;; }</pre></div><p><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style><style type="text/css">.csharpcode, .csharpcode pre{	font-size: small;	color: black;	font-family: consolas, "Courier New", courier, monospace;	background-color: #ffffff;	/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {	background-color: #f4f4f4;	width: 100%;	margin: 0em;}.csharpcode .lnum { color: #606060; }</style></p><p>这样，在不支持:after的浏览器中，导航以最质朴的方式展现，在IE8和FF这样的浏览器中，分割线将显示出来，最后一个li的分割线将被删除。</p><p>上面的方法，在大部分时间还是比较好用的，但如果需要给导航菜单添加更多的效果控制，例如给每一个li添加一个按钮似的背景，我们就必须让li成为块级元素。这个时候，text-align:center就无效了。</p><p>好在<a target="_blank" href="http://www.cssplay.co.uk/menus/centered.html">Stu Nicholls</a>给出了一个解决方案&mdash;&mdash;<a target="_blank" href="http://www.cssplay.co.uk/menus/centered.html">Centering Float Left Menus</a>。</p><p>我做了另一个例子，<a target="_blank" href="http://www.liquidroc.name/download/demo/nav_test.html">demo2</a>。</p><p>在这样的基础之上，无论你或删或增导航菜单的项目数量，无论你是想给它添加简单背景色，还是添加复杂的圆角框，你都可以从容应对了。</p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/semantics-navigator.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=38</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=38&amp;key=2445fb3a</trackback:ping></item><item><title>刘翔、罗伯斯谁更快？</title><author>a@b.com (rocchow)</author><link>http://www.liquidroc.name/post/css_hexcolor_render_speed.html</link><pubDate>Mon, 21 Jul 2008 00:29:26 +0800</pubDate><guid>http://www.liquidroc.name/post/css_hexcolor_render_speed.html</guid><description><![CDATA[<p>首先，我要向看了标题进来的朋友道歉，这不是一篇讨论当今田径赛场上两位悍将的体育文章。事实上，我要讨论的是一个关于css十六进制颜色渲染效率问题。</p><p>这个问题的由头来自<a target="_blank" href="http://www.52css.com/">52css</a>的《<a target="_blank" href="http://www.52css.com/article.asp?id=787">书写高效的CSS - 漫谈CSS的渲染效率</a>》，文章写得不错，网上转载无数，其中关于背景图片宽度不宜过小和避免使用IE滤镜，之前倒是了解，其他的都是些新观点，很是受用。只是，对于该文章的第一点有些疑问。摘录如下：</p><blockquote><p><strong>1、十六进制的颜色值对位数与大小写</strong><br />　　编写十六进制颜色值时你可能会用小写字母或省略成3位数，关于这写法没找到确实的数据证明对浏览器的渲染效率是否有影响，但十六进制的颜色值默认标准是大写及6位数标注。在未知情况下不希望冒险而降低了渲染的效率。<br />　　* 不赞成 - color:#f3a;<br />　　* 建议用 - color:#FF33AA;</p></blockquote><p>我们一直倡导的css缩写，难道是在冒风险么？就像作者说的，找不到确实数据，很难证实。这里有我做的两个例子<a target="_blank" href="http://www.liquidroc.name/download/demo/css_color_render_speed_test1.html">test1.html</a>和<a target="_blank" href="http://www.liquidroc.name/download/demo/css_color_render_speed_test2.html">test2.html</a>，都是一个含有20个div的页面，不同的是前者用缩写原则定义css背景，后者反之，使用一个简单的js判断页面加载速度。你甚至都不需要打开这两个页面，都可以猜出结果，两者16ms的加载速度毫无区别(本地文件加载时间，实际网络加载时间在78ms~140ms之间)。也许页面的确太小、也许用于渲染的背景css太少，但实际应用中，在一个页面中定义20个层的背景色就算不是最大值，也应该是均值了。</p><p>在毫秒级的层面上，两者没有分出胜负，但是在文件大小使用缩写的test1的字节数是2027，而后者则是2085。大小上的输赢倒是显而易见了。</p><p>回到标题上，就像是罗伯斯的12秒87和刘翔的12秒88，凭肉眼我们难以分辨他们之间的差距，对于十六进制的颜色值到底是缩写快还是大写6位数快，除非了是极致的性能狂人，否则把它奉为您工作中的指南是不恰当的。</p><p>在这个小小细节上，我认为倒是可以顺其自然。使用DW或者其他可视化网页编辑软件的朋友都知道，使用代码提示，在css中输入了诸如color:、background:之后，可以在弹出的256色标准色表中直观选择你想要的颜色，dw cs4上关于这里的一处细微改进，也许表达了Adobe Dreamweaver开发团队对于十六进制颜色渲染效率的一个态度：</p><p>&nbsp;<a href="http://www.liquidroc.name/upload/css_hex_color_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" border="0" alt="css_hex_color" width="540" height="200" src="http://www.liquidroc.name/upload/css_hex_color_thumb_1.png" /></a></p>]]></description><category>(x)HTML&amp;amp;CSS</category><comments>http://www.liquidroc.name/post/css_hexcolor_render_speed.html#comment</comments><wfw:comment>http://www.liquidroc.name/</wfw:comment><wfw:commentRss>http://www.liquidroc.name/feed.asp?cmt=30</wfw:commentRss><trackback:ping>http://www.liquidroc.name/cmd.asp?act=tb&amp;id=30&amp;key=cea498c9</trackback:ping></item></channel></rss>
