W3C-所见非所得

编程开发

每位网页设计师都应该了解W3C标准,但是你想要熟练掌握它的所有标准,恐怕还有点困难。即便是非常熟练的设计师,碰到某些问题也不免会头疼一阵子。我在标准还是效果一文中提到,在从XHTML 1.0 Transitional 标准过渡到XHTML 1.0 Strict 标准时,我遇到了一些麻烦。我想把我试图解决这些麻烦的过程,跟大家分享一下,希望你能得到一些启发。在我开始正文之前,我想先引用lucky blog中一篇文章的片段

至于标准,在经过狂热的代码优雅的追求热以后,我对它的看法已经逐渐地发生了改变。这个问题就得先回到我们为什么要做网站的起点上来。不管你目前的网站是否是营利性的,出发点就只有一个:就是面向客户。

过渡到XHTML 1.0 Transitional

XHTML 1.0 Transitional标准的核心思想就是标签闭合,不管是自闭合标签还是非自闭合标签,一旦你创建了一个标签都必须在适当时候闭合它。这是一种很好而又必要的思想,所有的事情都有始有终。对于非自闭合标签很好理解,我们以前可能会书写以下的代码

hello world

这里面所有的标签我们都闭合了,也就是ul和li,有些标签如果你不闭合,在浏览器里看是没有问题的,这是因为浏览器有一些纠错的能力,但这种纠错的能力是依平台而定的。也就是说在IE里认为的纠错闭合方式可能和Firefox有很大不同,这就是为什么某些网站在IE和Firefox里看起来有很大的区别的原因。

对于自闭合标签,我们以前注意得不够多,也是容易忽视的。这类标签最容易出现在网页head部分,比如

这段代码是有问题的,因为meta标签没有闭合,正确的写法应该是

我们通过在标签最后加上斜杠来标记这个自闭合标签的结束。还有一些自闭合标签也需要引起我们的注意,比如img,input等等,我们以前总是没有用斜杠闭合它们的习惯。

向XHTML 1.0 Strict进发

大概80%的网站在解决了标签闭合的问题后,都可以通过XHTML 1.0 Transitional的校验。现在我们得向更高级的标准进发,如果你迫不急待的在W3C提供的校验器里用XHTML 1.0 Strict检验自己的代码,你可能会发现一大堆错误,刚刚兴奋起来的心情马上又会萎靡下去。我把这些标准中最难对付的两个挑了出来

a标签的target属性。我们习惯了在a标签里用诸如target="_blank"的属性来使用户在新窗口打开链接,但XHTML 1.0 Strict认为不经用户同意,就打开新窗口使不合适的。因此在新的标准里,target属性被抛弃了。不过解决办法也是有的,很多人使用a标签的onclick事件来触发打开新窗口,这是个不错的想法。不过也有其它的做法,我会在后面提到。

img标签的align属性。这个属性比前一个更加要命,align属性可以极大地方便我们的文字与图片混排。但是为了与css兼容,这个控制排版的属性同样被去掉了,官方建议用float属性来解决这一问题,但是对应于原来align=center的方法就不得而知了。

那么有没有更好的解决方案呢?答案是肯定的,如果你的网页存在上述问题,AListAPart提供的方法可以让你100%通过校验。通过分析上面的两个问题,我们知道我们是因为使用了在新标准里被抛弃的属性而导致的错误,那么我们可不可以强制声明这两个属性呢?可以!请看下面的代码

]>

现在把你的代码放心地让W3C校验器检验吧,但是AListAPart的这篇文章还有下文

If you run such a file through the W3C validator, you find that it validates wonderfully well. If you download the sample files for this article and validate file internal.html, you can see this for yourself. Unfortunately, when you display the file in a browser, the ]> shows up on the screen. There’s no way around this bug, so this approach is right out.

什么意思?打开你的浏览器看看就知道了,最上方是不是多了点你不想要的东西。恭喜你,这个问题无解,因此我们的这次尝试可以说只针对于能让你的网页通过测试,至于能不能用又另当别论了。也许你注意到了,在网页头部DOCTYPE这一行对网页标准至关重要,我们能不能在这一行的其他地方找到突破口呢?可以,仔细研读W3C标准后你会发现,W3C组织把dtd声明文件模块化了,我们可以根据自己的需求组合不同的模块,而已经抛弃的属性,可以通过我们的声明其所属模块将其包含进来,我已经写好了一个自定义的dtd,只需要将你的头部声明改为

这样做是符合W3C标准的,但是很遗憾,无法通过W3C校验。因为W3C校验不支持使用自定义dtd来校验,那么我说了半天不是白说了...没错,很遗憾,这些揪心标准就是不给你好脸色。如果你有闲心校验一下本网站的代码,就会知道,这两个问题在我这里还是待解决状态,所以我从开始就声明这是一个解决过程,而不是解决途径,希望你能从这个过程中有所启发:)

已有 8 条评论
  1. xml, dtd ...

  2. 对了,我已经部署了wp-super-cache,很猛……

  3. 看出来了...

  4. strict标准真的抛弃了很多属性啊 头疼

  5. 初尝加班的衰人
    初尝加班的衰人

    脑细胞杀手无处不在啊.....

  6. Vichair
    Vichair

    哎~对于我这种只是做点模板玩的人来说标准可以无视,能达到效果就可以了,hohoho

  7. 午夜客
    午夜客

    还是支持IE好了!

  8. Hoofei
    Hoofei

    使用web标准的目的是为了兼容不同的浏览器,以及节约带宽,提高访问速度,或许还存在一点SEO。但不是为了通过W3C的验证。我这样认为。呵呵。