Spiga

欲练 CSS ,必先宫 IE

2007-02-18 02:58 by Cat Chen, 16955 visits, 收藏, 编辑

“Win国天下,欲练CSS之人不在少数,大多不得要领,又或是走火入魔,全为IE所累。故曰:欲练CSS,必先功IE。”

曾经,我也属于为IE所累的行列,如今见到很多人仍然不愿意对自己的宝贝IE下手,所以决定特异写篇文章说说此事,以明辨IE到底是宝贝还是累赘。

好了,funny部分结束,按回我的习惯直入正题。之所以说IE不好,是因为IE会误导了你对CSS模型的理解,让你以为IE的理解是对的,之后无论如何你都无法用你的IE模型理论去为你那个无法在FF正常显示的CSS提供fix。更加坏的事情是,即使你仅仅针对IE设计,不考虑其它浏览器,由于IE模型绝对可以说是一只让人难以捉摸其脾气的怪物,所以你单纯为IE设计也会遇到众多难题,发现很多的效果总是绕来绕去都难以实现。

我们都知道,XHTML+CSS的目标就是实现内容与表现分离,理论上对于任何特定一份内容,我们都可以通过CSS实现任何我们想要的表现形式,或者细致地说是布局形式。虽然现实与这个目标有一定差距,但是CSS已经能够满足大多数常见的布局需求,这有CSS Zen Garden为证。然而如果你用的是IE,因为它难以捉摸,所以如果你想用一种简单优雅的CSS去让IE能够实现“任何你想要的布局形式”,那是不可能的,只有复杂繁缛的CSS才能够在IE上满足你的需求。我曾经提到过一种理论,“一个人对一个研究方向是否感兴趣很可能是完全靠偶然事件决定的,这就好像人第一次打羽毛球,如果你赢了几盘你就会感兴趣,如果你一直都赢不了你就会没兴趣”。IE在需要复杂繁缛的CSS这一点上,就足以令大多数的入门者却步。你总感觉到不得要领,你自然没兴趣学下去。

举一个例子说明这个问题,例如你不知道IE有hasLayout这回事,一个元素是否hasLayout对它的布局方式有重大影响,于是你肯定用最简单的思维去思考CSS,认为不同的CSS规则之间应该是松耦合的。“CSS应该被设计为简单优雅的”,你肯定会这样想,没错,它确实被设计为这样,不过IE不是这样去实现CSS罢了。我们用下面的代码去证明IE在quirks mode与standards mode之间的区别:
<div style="background-color: red; height: 30px">
  <div>Hello</div>
  <img style="float: left; width: 200px; height: 160px" src="blank.gif" />
  <div>Hello</div>
</div>

首先,我们用quirks mode看看结果如何,并且一个初学者看到这样的结果会去如何理解CSS规则。在quirks mode中,我们可以看到背景为红色的<div />包含了上面1行的文本,以及下面向左浮动的<img />(自然也就包括在浮动块右边的文本),在这里,我们可以建立两种认识:

  1. 容器是完整包含内容的,当内容的总高度比容器大的时候,容器就会自然伸展以确保容纳内容。
  2. 浮动块也属于上述条件所要求通过伸展以确保容纳内容。

以上规则是完全错误的,一个懂得标准CSS以及理解quirks mode的设计师将会如此解释他的理解:

  1. 因为IE在quirks mode中会将height理解为min-height,所以它认为<div />的高度不小于height指定的30px即可。而根据CSS标准,当height设置为30px时,高度就一定是30px,超出部分如何处理则由专门的CSS规则决定。
  2. 因为<div />被设置了height属性,在IE中这就让它hasLayout了,这就导致它一定要包含所有的内容,包括浮动块。而根据CSS标准,浮动块是无需被完全包含的,它就浮动在那里,除非遇到设置了clear属性的元素,否则后继内容只会侧移避让。

好了,相信这个对比足以说明问题的严重性了,通过IE的效果去理解CSS,最终只会让你的理解与真实的CSS相差甚远。详细的standards mode与quirks mode带来的标准执行差别,可以参考这篇文章:CSS Quirks mode and strict mode

然后肯定有人要问我,如果通过doctype确保使用的是standards mode,那是不是就没问题了呢?standards mode确实会让IE对CSS的解释合理很多,但事情并没有那么简单,这你可以通过实践去慢慢体会。你可以尝试在standards mode中设计CSS,并且尽力保持它们在IE/FF/Opera/Safari这4大主流浏览器中显示一致,随着设计的进行,你会发现这不是那么容易做到的。或许你不乐意花时间去fix其中的一些小问题,宁愿任由其中一些浏览器的用户看到比较丑陋的布局,但至少你已经了解到一个和上面例子类似的道理:不同浏览器即使同样在standards mode,其对CSS的理解仍然有所差异,而差异当中最多只可能有一个是正确的,甚至可能全部都是错误的。这篇CSS contents and browser compatibility就列举了众多浏览器对CSS支持的差异,一份CSS总会因为其中有一些规则在某些浏览器上是不支持的或者是buggy的,而导致你难以保持它们在不同浏览器上显示一致。

接下来可能还有人会问我,既然IE的市场份额最大(特别是在入门级的用户当中),又或者说我的客户指定使用IE作为客户端,仅仅针对IE设计CSS不好吗?为什么要针对FF之类的标准浏览器设计CSS然后再为IE进行fix?因为IE难以捉摸的脾气,让你无法将它的行为理解为一种简单优雅的规则,然后让你陷入CSS规则高度耦合的困境中。请看下面的例子:
<div style="background-color: red; border: 2px black solid">
  <img style="float: left; width: 200px; height: 160px" src="blank.gif" />
  <div>Hello</div>
</div>
<div>Hello</div>

现在,你在IE中看到的效果应该是左边出现<img />,然后两个<div />内的Hello都向右偏移以避让<img />这个浮动块了,其中上面的<div />仅仅占用移行的高度,因为它没有声明高度,所以就是自然高度,也就是一样,这些都很好理解,所有规则都是解耦的。然后向例子中增加对第一个<div />的width属性复制,看看结果会如何:
<div style="background-color: red; border: 2px black solid; width: 600px">
  <img style="float: left; width: 200px; height: 160px" src="blank.gif" />
  <div>Hello</div>
</div>
<div>Hello</div>

这时候第一个<div />完全容纳了<img />,把第二个<div />挤到下面了。这该怎么解释呢?我们可没有设置它的height属性哦,难道又犯之前例子所说的因为hasLayout而必须容纳所有内容?正解,这就是IE难以驯服的地方,一个应该是完全独立的width属性,设置之后引起了高度以外的其它影响,这让人无法尝试以一种简单优雅的方式去理解IE的行为。这就证明了,如果你要学习如何为IE设计CSS,就先要学习标准CSS,再加上对IE怪异行为的理解,比仅仅学习如何为一个标准浏览器设计要难多了。这时候你是不是想说,“如果客户愿意放弃IE,甚至全世界都愿意放弃IE,那就实在太美好了”,没错,这才是正确的想法,一心想着仅针对IE设计以求方便只会让你走火入魔。

最后,如果你已经有了一定的CSS基础,对CSS规则都理解无偏差,却缺乏组合CSS规则的想象力,无法做到所谓的“实现任何你想要的布局效果”,这也就是说,你的内功已练成,仅仅差一些表面的套路,这时候我推荐你去看《CSS Mastery/精通CSS》。看完这本书,相信你只会觉得自己缺乏布局的创造能力,而不会有布局却不知道如何实现。另外,如果你关注CSS方面的内容,可以考虑订阅我的blog:

过年之后,我可能会写一些与ASP.NET+CSS有关的文章,因为现在ASP.NET+CSS的开发并不方便,即使用了ASP.NET 2.0 CSS Friendly Control Adapters也如此,因此需要根据自己的实际情况定制配对的Control Adapter才能解决问题,这就是我接下来要研究的事情。

Add your comment

87 条回复

  1. #1楼 JesseZhao      2007-02-18 13:05
    不错的文章,感觉哥们你对css很有研究啊
     回复 引用 查看   
  2. #2楼 Jeffrey Zhao      2007-02-18 14:21
    第一个例子在IE7下显示正常,你是用IE6看的吗?
    // 你的标题是“功”还是“宫”呢?
     回复 引用 查看   
  3. #3楼[楼主] Cat Chen      2007-02-18 14:38
    @Jeffrey Zhao
    第一个只是为了说明standards mode和quirks mode的区别,如果是quirks mode,IE7或者FF都会不正常。
     回复 引用 查看   
  4. #4楼[楼主] Cat Chen      2007-02-18 14:45
    @Jeffrey Zhao
    这个汉字问题……汗……我也不是很清楚。请问你知道小说上用的是哪个字吗?
     回复 引用 查看   
  5. #5楼 Jeffrey Zhao      2007-02-18 15:14
    @Cat Chen
    “欲练神功,挥刀自宫”这个?
     回复 引用 查看   
  6. #6楼[楼主] Cat Chen      2007-02-18 15:18
    @Jeffrey Zhao
    估计是吧……所以我先改了。
     回复 引用 查看   
  7. #7楼 JesseZhao      2007-02-18 15:19
    @Cat Chen
    能给我你的im号码吗?
    我的邮箱是prolibertine@gmail.com,有些事情想和你聊聊
     回复 引用 查看   
  8. #8楼[楼主] Cat Chen      2007-02-18 16:09
    @JesseZhao
    用PM发给你了,你应该很快就能在邮箱里收到。
     回复 引用 查看   
  9. #9楼 JesseZhao      2007-02-18 19:50
    @Cat Chen
    已经收到,im交流
     回复 引用 查看   
  10. #10楼 ComputeBank[未注册用户]2007-02-18 21:12
    感觉老兄可能在某些认识上存在问题
    首先,技术是为人们服务的,而不是仅仅用来规范和研究的,科学的目的是让人们更好的生活。IE的市场份额最大,那么让网页完美支持IE就是最大的目标,当然,同时做好对其他浏览器的支持更好——但是这是锦上添花,而不是必要因素。

    为了追求理论上和规范上的CSS等标准,而废弃对IE的特殊照顾,不智!
     回复 引用   
  11. #11楼[楼主] Cat Chen      2007-02-18 21:23
    @ComputeBank
    我不是说开发人员应该废弃IE。

    我觉得大多数程序员都接受了计算机语言是简洁优美的这一特性,然而如果尝试按照IE的视觉效果去理解CSS的话,必然无法找到一个如此的理解,搞不好就会“走火入魔”。要理解好IE的模型,必须先理解好标准CSS的模型,再理解IE的bug,这复杂度是无法避免的,也就会对入门者造成严重的障碍。

    如果是入门者,废弃IE就是非常明智的行为,学习总是从简单的事情开始才容易,而FF等比较标准的浏览器就很好用了。
     回复 引用 查看   
  12. #12楼[楼主] Cat Chen      2007-02-18 21:26
    @ComputeBank
    “让网页完美支持IE就是最大的目标,当然,同时做好对其他浏览器的支持更好”——在遮盖实际技术的情况下当然这样说,然而在通过技术实现时,因为支持IE比支持FF更难,所以先针对FF设计,再根据IE进行fix才是可能的。

    如果先根据IE设计,首先可能出现我文章中说的不正交的问题,设置一个width属性导致整个页面都乱了,你没有相当的理论知识就无法解决;其次这样出来的页面不可能根据FF进行所谓的“fix”。
     回复 引用 查看   
  13. #13楼 GoGoSonny      2007-02-18 22:24
    .NET不跨平台(不说MONO),ASP.NET一定要跨浏览器!
     回复 引用 查看   
  14. #14楼 deerchao      2007-02-18 23:10
    在兼容标准上,IE7比IE6强多了,VS2007 (Orcas)的HTML设计器更是重头写了一套HTML呈献引擎。

    如果连IE6的生产商微软都认识到了不兼容世界标准的问题,我们还一味只看目前的市场占有率的话,只能说眼光太短了。
     回复 引用 查看   
  15. #15楼 Jeffrey Zhao      2007-02-19 00:29
    @deerchao
    其实最重要的一点可能还是因为IE对于CSS的实现不良好(有别于“不标准”),例如添加了一个width导致的问题,增加了样式之间的耦合度。
     回复 引用 查看   
  16. #16楼 Jeffrey Zhao      2007-02-19 00:30
    @deerchao
    如果VS2007的HTML设计器重写HTML呈现引擎的话,那么它看到的东西和目前的浏览器一致吗?
     回复 引用 查看   
  17. #17楼[楼主] Cat Chen      2007-02-19 00:48
    @Jeffrey Zhao
    如果是Office Sharepoint Designer 2007的设计器,那么我可以说是不一致。

    我现在一直在用Office Sharepoint Designer 2007,虽然也很标准,但为了显示辅助设计所需的一些视觉效果,必然增加了IDE的复杂度,也就……反正我至少看到过不一致的情况。
     回复 引用 查看   
  18. #18楼 deerchao      2007-02-19 00:58
    Jeffrey Zhao, Cat Chen:
    应该是不一致的。

    另外,Microsoft Exression也采用了这种新的HTML显示引擎。
     回复 引用 查看   
  19. #19楼 A.Z[未注册用户]2007-02-19 13:39
    lz一看就是真正很有学识的人,虽然个人不喜欢把精力花到IE上,但是这个世界很多时候不是个人喜好可以放在首位的。即便是一个Windows的国度,微软的重心可能会在近两三年才会又完全投入到win上,在这之前,web已经是.net平台支持的一种泛滥的开发导向。对于html,我很坚定css架构对于一个web系统的重要性和必要性。期待lz的asp.Net 结合css的文章。
     回复 引用   
  20. #20楼 曲滨      2007-02-19 14:05
    IE 6 不是一个支持CSS2.0 的浏览器
    很正常的

    IE7 CCS的处理个人感觉更像 FF,不像ie6

    期待下文,
    最好有点图....
     回复 引用 查看   
  21. #21楼 冬冬      2007-02-19 17:30
    学习了,收获很多,谢谢。最近正准备摆脱MS的束缚。
     回复 引用 查看   
  22. #22楼 yunhuasheng      2007-02-19 19:59
    写的好!!
     回复 引用 查看   
  23. #23楼 ocean[未注册用户]2007-02-19 20:32
    其实可以用CSS在IE下进行任何布局,你第一个例子,div是30px,里面的内容超过30px的时候实际上可以通过style的另一个属性来设置div的行为,比如是截断、出现横竖滚动条、自动扩展。默认的行为无非是自动扩展而已,所以你可能不太容易理解,实际上只是你还没有了解而已。
    另外IE占据着绝大多数的市场份额,你可能需要花80%的力气满足20%的另类浏览器,而只需要花费20%的力气满足80%的IE,那么从商业角度上来说,怎么做就不用明说了。单纯讲技术没有任何价值,计算机本身没有任何价值,计算机只是一种辅助我们工作的工具,应该考虑的是如何让工具发挥最大的价值。
    另外你还应该考虑市场行为,特别是国内,真正用FF的你应该看一看是不是都是身边的技术人员,你应该看看你们公司的前台,非技术出身的老板,行政人员是不是也用FF,可以说在国内FF的使用用户大多都是技术人员,而且很多技术人员也是FF和IE同时使用。但是我们的客户大多数都不是技术人员。
     回复 引用   
  24. #24楼 ocean[未注册用户]2007-02-19 20:45
    还有一点就是你说的很多行为实际上在官方文档中都清清楚楚的写着,只是中国的技术人员不太乐意读英文的官方文档,实际上有时看看这个属性的官方文档,就明白怎么回事了,根本没有任何深奥的理论。CSS本来就是级联样式表,不同层次设置相同属性都可能会互相影响,你是在不断的测试,然后得出这种行为是怪异的,你的这种行为好像是黑客破解一样,不断摸索,而怪异又是你不了解所以才感觉怪异,至少你说的那些行为我都觉得非常正常。实际上有很多官方文档写的很清楚,你看一看,就知道怎么回事了。
     回复 引用   
  25. #25楼 yunhuasheng      2007-02-20 11:25
    @ocean
    说得挺专业!
     回复 引用 查看   
  26. #26楼[楼主] Cat Chen      2007-02-20 17:37
    @ocean
    “默认的行为无非是自动扩展而已”——我想这里是你理解有误了,所以误把IE的视觉效果理解为标准。如果一个元素height设置为30px,那么它的高度就一定是30px,也就是说背景高度固定为30px。当然文字超出部分怎么办确实由其它属性决定,但是box model自身不能像你说的“自动扩展”。

    “自动扩展”是IE的做法,因为IE错误将height当作min-height处理,而min-height自然是可以高于的。而如果你接受这种错误的理解,认为“默认的行为无非是自动扩展而已”,那就属于“走火入魔”的类别了。
     回复 引用 查看   
  27. #27楼[楼主] Cat Chen      2007-02-20 17:49
    @ocean
    看完你关于我的做法类似黑客的说法,我只能说你肯定没有深入理解过浏览器解释CSS时的区别,更加不知道CSS Hack的实质。

    “实际上有很多官方文档写的很清楚,你看一看,就知道怎么回事了”,你的意思是CSS Hack其实就是按照CSS标准解释时所导致的正常结果,只不过我不理解这种结果所以说是Hack?那么请你解释一下针对IE的Holly Hack是怎么回事:
    /* Hides from IE5-mac \*/
    * html .buggybox {height: 1%;}
    /* End hide from IE5-mac */

    只有IE/Win能看到中间的.buggybox {height: 1%;},而其他浏览器包括IE/Mac都把这段当作不匹配规则或注释看待。

    * html的前缀让非IE认为这条规则不匹配任何项目,html就是根元素了,* html不可能匹配什么,只有IE(包括IE/Win和IE/Mac)会使用这条规则。那么我问你,匹配* html是标准还是不表准呢?如果是标准,为什么其它浏览器不执行?如果不是标准,IE执行了这不是bug又是什么?那么既然这不是标准,IE执行了,我叫它作CSS Hack,是不是还是“实际上有很多官方文档写的很清楚,你看一看,就知道怎么回事了”?我就不知道哪个官方文档看一看就能够合理解释Holly Hack。
     回复 引用 查看   
  28. #28楼 航天奇侠2007-02-20 17:54

    考虑ie7就可以了,还管它ie6时代就不能进步了。
     回复 引用   
  29. #29楼[楼主] Cat Chen      2007-02-20 18:04
    @航天奇侠
    现在我也是这样想,特别是设计中文网站时,因为国内的用户都会“想尽办法”升级到IE7。

    IE7真的是给designer带来巨大的方便,原本按照标准设计好的CSS,根据IE7所需要进行的fix比IE6要少得多!
     回复 引用 查看   
  30. #30楼 Jeffrey Zhao      2007-02-21 00:44
    @Cat Chen
    现在对于IE6和IE7的问题还是很麻烦,IE7和IE6很难共存,现在一般用Virtual PC或者另准备一台机器吧?
     回复 引用 查看   
  31. #31楼[楼主] Cat Chen      2007-02-21 09:56
    @Jeffrey Zhao
    一般只能找别人借台有IE6的机来测试吧,我也觉得很麻烦。
     回复 引用 查看   
  32. #32楼 Firzen[未注册用户]2007-02-21 21:36
    TMD

    IE对css支持真的很有问题。
    最近我在ie7 和ie6上 看到不同的layout
     回复 引用   
  33. #33楼[楼主] Cat Chen      2007-02-22 00:01
    @Firzen
    肯定了,否则IE7就不叫“进步”了。
     回复 引用 查看   
  34. #34楼 ocean[未注册用户]2007-02-22 11:18
    你可能还没有理解我的意思,IE并不一定完全执行国际标准,也即W3C标准,我说的默认的行为和正确的行为是指微软官方文档中指定的行为,当然微软官方文档中的指定的行为并不一定符合W3C标准,所以对你所说的“因为IE错误将height当作min-height处理,而min-height自然是可以高于的”之类的,实际上这都是IE by design的行为,在设计的时候就会这样处理,所以不是错误的处理,而是特意的进行这样的处理。
    还有一点就是用的最多的就是标准,同时很多公司也会在标准的基础上进行一些更改和扩展。不要被国际标准束缚住手脚,国际标准只是一种参考标准,而不是法律,没有任何的强制性。
    从根本上你就依据就错了,在某个软件上做东西,自然依据的是这个软件的官方文档。虽然这个官方文档很多东西也像国际标准的描述,但是不能等同,否则你就会发现太多的怪异行为。
    如果你觉得一个软件不符合国际保准就不能生存或者你就不乐意在上面开发东西,那就由市场来定吧。其实真正的决定软件生存的,是市场,不是标准。
     回复 引用   
  35. #35楼 阿毅[未注册用户]2007-02-22 22:24
    @ocean

    最让人诟病根本不是ie是否执行w3c标准,而是ie自身没有可靠的标准。
    即便你参照着ie的官方文档并只针对IE设计,你还是会很痛苦很痛苦,大多数情况下优雅、简洁与你无缘,如果你仅仅为了实现布局而已,你自然可以,效率也不会更低。

    至于你所说的:
    从根本上你就依据就错了,在某个软件上做东西,自然依据的是这个软件的官方文档。虽然这个官方文档很多东西也像国际标准的描述,但是不能等同,否则你就会发现太多的怪异行为。
    -------------
    真不知道你到底想说什么。就整个标准而言,弄过几次CSS设计就应该知道ie和w3c是不完全相同的标准。

    对“市场决定标准”,那么“市场又是什么决定的?”"ie的市场除了操作系统垄断的因素外,还因为什么才取得的?" “我们是不是只能在微软的市场内发展自己的市场呢?”

    PS:你连楼主的意思都没看明白就胡乱搭腔,指摘这那的。真是。。。

     回复 引用   
  36. #36楼[楼主] Cat Chen      2007-02-22 22:57
    @ocean
    height的作用就是W3C标准中的min-height,这个MSDN里面可没有说明。对于更复杂的情况,例如hasLayout,只是简单提到有此属性,根本没详细说明它的影响。而你用Google搜索"hasLayout",看看第一位的那篇文章,详细说明了hasLayout的触发条件和影响,这个在MSDN中哪里有被提及?如此复杂的hasLayout,MSDN不被提及,说什么“看文档”都是废话!

    幸好……幸好MSDN是如此的畏忌探讨高级话题,所以我们这些blogger才有文章可以写。例如我写的《深入理解ASP.NET动态控件》,假如MS不是可以隐藏页面生命周期的复杂性,而是把这一切皆是清除了,那么我就不能再写此类文章了。MSDN总是希望开发人员从一个简化的模型去理解黑盒子里面的实质,然而这个简化模型却没办法完全符合黑盒子的实现模式,总会出现符合MSDN却得到“意外惊喜”的情况,哈哈!
     回复 引用 查看   
  37. #37楼[楼主] Cat Chen      2007-02-22 23:06
    @ocean
    我觉得你应该尝试去实践开发一些跨浏览器的CSS模板,然后才能知道其中的细节。为什么我不说是IE和FF不同,而说是IE比FF复杂,所以入门则应该选择FF开始,这是有道理的。

    或者你去看看CSS Mastery,它关于浏览器的评价用到了一个形容词"consistency",也就是“一致性”。用简单的中文来表述,“一致性”意为着说了这样就这样,不能够一种情况下这样另一种情况下又不是这样。举个例子,假如你订了一份“晚报”,但它有时候晚上投递,有时候早上投递,往往你想看报纸的时候却发现时间不对,郁闷否?这就是所谓“不一致”,而也正是IE让人讨厌的地方。
     回复 引用 查看   
  38. #38楼 zibo[未注册用户]2007-02-23 15:35
    好的.就这么写.
     回复 引用   
  39. #39楼 yok.[未注册用户]2007-02-23 21:32
    ie目前还是事实标准. 对网页制作人员来说, 优先考虑网页在ie上的效果是明智的做法. 毕竟大多数用户都用ie, 不服不行. 对用户来说, 大多数网站都在ie下才有最好的效果, 一部分网站甚至在非ie浏览器里界面乱套甚至不能用. 所以上网要上得爽也得用ie. 不服也不行...恶意的猜测, ie不遵守标准和对html良好的容错性是ms抢占浏览器市场的一种商业策略.

    但是firefox的市场份额越来越大, 大众接受firefox的主要原因不是他遵守标准, 而是安全性比ie高. 几乎所有病毒(包括流氓软件)都是经ie从互联网上被感染的. 我帮别人装完系统后第一件事就是装firefox, 删除桌面上的ie快捷方式. 对于不懂电脑的人来说, 网页难看点总比经常中毒要好. 在互联网上兼容firefox还是有必要的

    浏览器的市场份额最终还是取决于开发者的选择. 对firefox有利的事情是:
    开发者多花时间在浏览器兼容的问题上;
    用户厌倦了频繁的中毒;
    对ie有利的是:
    开发者懒惰马虎, html代码出现错误, 例如不关闭标签, 错位嵌套;
    开发者使用ie only的javascript特性;
    用户觉得上网体验比避免中毒更重要;
    用户根本不知道firefox是啥, 也没人告诉他...

    其中开发者的选择是一个先决条件, 因为做出了ie only的网站, 用户别无选择. 要是谁做出了firefox only的网站, 那是找死...

    我自己还是用ie多, 不得不面对现实. 但是我把ff设成默认浏览器以免不小心中招, 并且在开发的过程中也做到多浏览器的兼容. firefox的份额还有得升的, 嘿嘿...
     回复 引用   
  40. #40楼[楼主] Cat Chen      2007-02-24 00:30
    为什么总有人不理解我在说什么呢,我想说的是学FF容易,学IE难,先学FF再进阶学习IE才是正路,这就如同先学初等数学再学高等数学一样。

    当然,你可以反过来直接学高等数学的,完全不理解那些是什么东西,好像“中文屋子”那样把一切当作符号来按照一定的规则操作,但是你只能进行非常有限的操作。如果你想高等数学解题能力得到提高,你就必须引入更复杂的操作规则,最终这套规则必须以理解初等数学为基础。既然如此,何不一开始就学好初等数学,再学习高等数学基于初等数学的新规则,这样你就两类题都能解了。
     回复 引用 查看   
  41. #41楼 随风流月      2007-02-24 09:49
    1.IE Only 的 Javascript 特性有时对开发者不利;
    2.不关闭标签甚至在 IE 下也是存在问题的;
    3.IE 的上网体验不一定高于 Firefox。
     回复 引用 查看   
  42. #42楼 Jeffrey Zhao      2007-02-24 20:16
    @随风流月
    IE的JavaScript设计其实对于开发人员很方便吧?
     回复 引用 查看   
  43. #43楼[楼主] Cat Chen      2007-02-24 22:05
    @Jeffrey Zhao
    各有千秋吧,IE提供一些API虽然看起来很好用,但因为不正交,而且buggy,你不知道使用过程中出现的效果是不是你期望的,这就很烦人。
     回复 引用 查看   
  44. #44楼 ocean[未注册用户]2007-02-24 22:21
    Wow, "如此复杂的hasLayout,MSDN不被提及,说什么“看文档”都是废话! 幸好……幸好MSDN是如此的畏忌探讨高级话题,所以我们这些blogger才有文章可以写。"
    首先你可以在这个地方找到这个属性的官方文档:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/haslayout.asp
    或者:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/mshtml/reference/ifaces/currentstyle2/haslayout.asp
    当然,因为这个是官方文档,不是详解,所以上面只说了应该说的部分(注意,官方文档本身就是说明情况,而不是教材,有时不可能很详细)
    所以在msdn上专门还有一篇:"HasLayout" Overview
    这篇文章是Markus Mielke写的,这位老兄是IE team的program manager,在这篇文章中论述了Layout的几个方面。
    链接如下:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/cols/dnexpie/expie20050831.asp

    当然,如果你找,可能还会找到其它的,当然官方文档不可能比教材详细,写书或者写blog本身就是根据官方文档,通过自己的示例和经验,以变通的手法让别人更清楚的理解,官方文档则是相对死板的描述。所以千万别说msdn没有提及。

    我从5年前做IE上的css、JavaScript,可以说熟知其中的每一个属性,我并不觉得IE上做很难,当然现在事情已经变了,FF确实越来越多人用了,所以你也会经常看到新闻报告在FF上发现了什么bug之类,用的人多了,自然关注的就多了,你认为FF真的安全吗?那是用的人少而已。同时病毒的传染有放大的功能,100人用IE,1个人用FF,如果在IE上有一个病毒,就会有100个人抱怨,而在FF上有100个病毒,却只有一个人抱怨,当然这个比喻也不是很恰当,因为FF的安全性确实也不错,不过如果你认为他绝对安全那就错了。
    当然因为现在我也不做这种web开发了,很多属性也都记不清楚了,不过我还是认为必须以大多数人的市场为基础来学习。如果改天FF达到90%的使用率,我决对推荐首先符合FF的标准。
     回复 引用   
  45. #45楼[楼主] Cat Chen      2007-02-24 22:40
    @ocean
    那么你看看这篇文章:
    http://www.satzansatz.de/cssd/onhavinglayout.html
    它比官方关于hasLayout要详细多少?既然hasLayout有这些复杂的触发条件和后继影响,为什么官方文档不说呢?这正是我所说的“幸好MSDN是如此的畏忌探讨高级话题”,MS总是希望让它们的东西看起来非常简单易用,通过隐瞒细节来吸引新手。

    Markus Mielke的文章的话,其实很多MS的员工都是很负责任很厚道的,有这些文章是好事情。不过对于于入门者来说能够接触到这类文章的概率自然比较低,这就是所谓的门槛了。

    其实你如此了解IE和FF的话,你应该会认同为FF设计比为IE设计容易,对不对?只不过因为IE市场份额大,所以你认为应该优先为IE设计。既然如此,对于入门者来说,先学习为FF设计再学习为IE进行fix,一步分作两步走,是不是更简单一些呢?
     回复 引用 查看   
  46. #46楼[楼主] Cat Chen      2007-02-24 22:44
    @ocean
    再补充一句,Markus Mielke在文章最后感谢了社区中的众多热心参与者,链接了On Having Layout等文章,证明其实如果没有社区的推动,MS还是会避讳hasLayout的问题。
     回复 引用 查看   
  47. #47楼 ocean[未注册用户]2007-02-24 23:07
    very good! 社区的力量当然是无穷的。
     回复 引用   
  48. #48楼 xmlsvg      2007-02-25 13:07
    @ocean 呵呵,自认为很专业,全说错了!
     回复 引用 查看   
  49. #49楼 BoyLee      2007-02-25 13:08
    好东西
     回复 引用 查看   
  50. #50楼 阿毅[未注册用户]2007-02-26 04:10
    @Cat Chen

    给个建议:以后千万记得先强调ie几乎没有标准可用!所有的误解都是源于认为ie执行一个可信、可靠的标准。
     回复 引用   
  51. #51楼[楼主] Cat Chen      2007-02-26 09:59
    @阿毅
    IE也不是没有标准,只是其标准极为复杂,没有文档可言,所以对初学者来说简直如同研究史前动物一样困难。
     回复 引用 查看   
  52. #52楼 zixia[未注册用户]2007-03-04 22:40
    好文,支持打到IE.
     回复 引用   
  53. #53楼 reonlyrun      2007-03-12 13:25
    还看不太懂,先收藏一下吧:(
     回复 引用 查看   
  54. #54楼 Anders Liu      2007-03-19 17:05
    标题下了我一跳....

    从字义上猜测,“宫”应该表示“切除”的意思,“功”则是“深入研究”,金老爷子用的是“宫”,表示啥就不用说了。这里看来用“功”比较好。

    一字之差啊一字之差

    不过的确是好文!顶一下
     回复 引用 查看   
  55. #55楼 野猪&翔帅      2007-03-28 15:03
    好文章
    评论更精彩
    支持
    期待新作
     回复 引用 查看   
  56. #56楼 Tracy[未注册用户]2007-04-04 13:40
    不如帮我看看为什么我的网站在Opera上显示都乱了

    http://中国钢铁交易平台.cn/
     回复 引用   
  57. #57楼[楼主] Cat Chen      2007-04-04 14:38
    @Tracy
    这个完全还是table布局吧,而不是css布局。
     回复 引用 查看   
  58. #58楼 Tracy[未注册用户]2007-04-04 17:29
    Layer布局,Table布局都有

    布局复杂的时候始终要用到Table,任务比较赶的时候也只好用Table,毕竟在Web Designer一拉就可以出任意行、列的Table,不像Layer那样要花上数倍时间和精力
     回复 引用   
  59. #59楼 Anthan      2007-06-14 10:45
    @Jeffrey Zhao
    可以在装好IE7的同一台机子上弄个绿色版的IE6,除了菜单等功能用不了之外,其他CSS,JavaScript都是可以正常用的。
     回复 引用 查看   
  60. #60楼 runbin[未注册用户]2007-09-11 14:58
    大家讨论来讨论去的多麻烦啊,不如大家都做全Flash的页面...就没那么多麻烦了
     回复 引用   
  61. #61楼 runbin[未注册用户]2007-09-11 15:01
    Flash多好,在Flash里画几个像素就是几个像素,画到哪就在哪,肯定不变.还能画0.25像素的线.CSS能吗?哈哈我哈哈哈哈
     回复 引用   
  62. #62楼[楼主] Cat Chen      2007-09-11 17:47
    @runbin
    Flash虽然很好,但说到可达性就要考虑你所面向的市场。如果市场都是PC,甚至都是Windows,那么问题就很简单。但如果市场包括手机和PDA,以及其他各种可能使用轻量级浏览器的场合,那么Flash就不具备充足的可达性了。
     回复 引用 查看   
  63. #63楼 里长[未注册用户]2007-10-29 15:56
    请问你的邮件是多少?
    我们im一下。

    我在你的博客发言了。

    驳斥了一番那些div+css的概念混淆者。
     回复 引用   
  64. #64楼[楼主] Cat Chen      2007-10-29 18:36
    @里长
    你直接在这个博客点击给我留言,然后就会发送到我的邮箱,我再告诉你im吧,这样可以吗?
     回复 引用 查看   
  65. #65楼 rtrrryryryryry[未注册用户]2007-12-20 14:10
    现在这样的局面不是很好吗?! 大统一了,一切都清晰明确了,人人都能快速入门了,你们干什么去?

     回复 引用   
  66. #66楼 LikeCode      2007-12-21 13:52
    cat你这篇文章写地太好了!
    我又想说"该死的IE!!!",真是该死,IE就是个怪物,但我们做开发的又不得不去讨好她!

    听说IE8将全面支持CSS与XHTML标准, 真是天大好事!!!不过,唉,恐怕还要过起码3年,我们做WEB开发才能轻松开发~~~~你看现在 IE7都不太普遍,现在一般停留在IE6,等IE8成变MS浏览器用户中的主流,怕是要一段岁月~~~
     回复 引用 查看   
  67. #67楼 CSS迷恋[未注册用户]2007-12-21 14:16
    第一天学CSS。看了还是一头雾水,不过看了你的文章。我还是要跟贴。加油写下去。。。。
     回复 引用   
  68. #68楼[楼主] Cat Chen      2007-12-21 14:21
    @LikeCode
    19号已经发布新闻了啊,IE8 Beta1将于2008年上半年发布,已通过Acid2测试。
     回复 引用 查看   
  69. #69楼 LikeCode      2007-12-21 14:30
    --引用--------------------------------------------------
    Cat Chen: @LikeCode
    19号已经发布新闻了啊,IE8 Beta1将于2008年上半年发布,已通过Acid2测试。
    --------------------------------------------------------
    cat,IE发布是一回事,成为主流MS浏览器却是另一回.

    VISTA还不是发布了快一年了吧(有了吧,不清楚),但你看有几个用户习惯用的,基本是停留在XP.OFFICE都2007了,2008也快来了,但用户普遍停留在2003,XP,甚至是2000!

    我想,到时IE8全面支持标准的CSS和XHTML时,以前只针对 IE7-(IE7以下版本,包括IE7)的网页在IE8显示可能一团糟,哈哈,那将是什么情况,无知的用户当然是认为IE8太糟糕了,打开网页常常是一团糟,哈哈~~~就象现在的FIREFOX用户抱怨FIREFOX一样~~~~这情况太搞笑了~~~

    等到IE8成为主流需要一段岁月, 等到差不多所有网站都根据标准CSS,XHTML开发,要一段岁月, 所以, 开发人员等到可以轻松的做 UI 设计时候还要一段岁月啊~~~~~~
     回复 引用 查看   
  70. #70楼[楼主] Cat Chen      2007-12-21 16:12
    @LikeCode
    我觉得那段新闻稿还是值得看看的。

    IE6是如何兼容IE4的?Quicks Mode与Standards Mode。IE8将会引入IE8 Standards Mode,这是第3个模式,老的网页不触发者个模式,还是好像IE7那样解析。
     回复 引用 查看   
  71. #71楼 风景年华      2008-01-07 16:20
    作者有水平,读者也专业,呵呵,真好
     回复 引用 查看   
  72. #72楼 姜建伟[未注册用户]2008-04-14 11:33
    你好!感觉你对这方面很有研究!你可以把IE quirks发给我吗?谢谢你
     回复 引用   
  73. #73楼[楼主] Cat Chen      2008-04-14 13:58
    @姜建伟
    IE Quirks是指一本书还是什么?
     回复 引用 查看   
  74. #74楼 琥珀色的微笑[未注册用户]2008-07-07 16:09
    很好的文章。我现在只是职一的学生,但由于表现优异被推荐到了一间电子商务公司工作。那里的职员全部都是网页制作高手。但是我知识缺乏得不得了,根本帮不上忙。这篇文章令我对网页制作有了更好的一点了解。真不错,期待能有其他知识再简单一点点的文章发表供初学者看看。我支持你!
     回复 引用   
  75. #75楼 怎奈[未注册用户]2008-08-16 19:31
    高人啊
     回复 引用   
  76. #76楼 Ivony...      2009-11-05 11:05
    我是不知道CSS什么时候成为行业标准的。

    这个脱离任何实现由几个不负责任专家在实验室里想出来的标准的第一个版本甚至在问世这么多年后都没有被完整的采纳。

    对于IE而言,CSS只是一个建议标准,没有任何理由可以去指责微软的解释是错误的或者不合情理的,也没有人因此提出对微软的诉讼或处罚,因为这从任何一个角度来说都是站不住脚的观点。莫非浏览器行业标准中有说明必须按照W3C的CSS标准解释?

    完全的遵循一个脱离实际的标准除了让你到处碰壁之外对你的页面而言没有任何好处。诚然,错误的混淆IE的CSS实现和某个组织的CSS标准对于初学者而言的确是有害。但这并不代表我们也可以蹲到实验室里不去考虑浏览器的支持和实现。

    现在大家都在尽量靠拢W3C的标准是客观事实,但我们应当清醒的认识到两点:一是大家只是在靠拢而没有任何实现是完整和毫无二致的;其次这种局面并不是唯一真理,指不定哪天大家就不跟它混了,毕竟这个组织连一款市场份额万分之一的浏览器都没有。

    现在CSS标准由一个效率趋于零而思维异乎于常人的组织维护,过分将这个组织的标准奉为真理,只能说是另一种强迫症。
     回复 引用 查看   
  77. #77楼[楼主] Cat Chen      2009-11-05 11:31
    @Ivony...
    首先,你要评论这篇文章,必须按照当时的观点来。现在IE8已经相当符合标准了,争论这个的价值已经不大。

    其次,我没有拿IE CSS和W3C CSS比,而是拿IE CSS和FF CSS比。FF当时市场份额超过10%,并且也不是仅仅存在于实验室中。我没有说IE应该实现FF都实现不了的那些W3C CSS,它能做到和FF差不多也就够了,而这正是IE8现在所做的。

    最后,在当时的情况下,为什么大家都倾向于FF CSS而非IE CSS?这两个都不完全符合W3C CSS啊,显然是有优劣之分嘛。当然,这个优劣是由离场决定的,做Web 2.0开发的,要求节省带宽还SEO的,可能就认为FF CSS是优;做企业开发的,不在乎下载体积和语义的,反而希望编辑方式尽量所见即所得的,可能就认为IE CSS为优。
     回复 引用 查看   
  78. #78楼 Ivony...      2009-11-06 01:01
    引用Cat Chen:
    @Ivony...
    首先,你要评论这篇文章,必须按照当时的观点来。现在IE8已经相当符合标准了,争论这个的价值已经不大。

    其次,我没有拿IE CSS和W3C CSS比,而是拿IE CSS和FF CSS比。FF当时市场份额超过10%,并且也不是仅仅存在于实验室中。我没有说IE应该实现FF都实现不了的那些W3C CSS,它能做到和FF差不多也就够了,而这正是IE8现在所做的。

    最后,在当时的情况下,为什么大家都倾向于FF CSS而非IE CSS?这两个都不完全符合W3C CSS啊,显然是有优劣之分嘛。当然,这个优劣是由离场决定的,做Web 2.0开发的,要求节省带宽还SEO的,可能就认为FF CSS是优;做企业开发的,不在乎下载体积和语义的,反而希望编辑方式尽量所见即所得的,可能就认为IE CSS为优。



    首先很抱歉,我的确有看到这篇文章所发表的日期,也挣扎了很久才决定进行这种不礼貌的掘坟刨墓的行为。

    不论这篇文章的发表背景如何,我想有一点我很确定,就是IE对CSS的实现并不应当得到“怪异”这样片面而武断的评价,更不应该认为:“如果客户愿意放弃IE,甚至全世界都愿意放弃IE,那就实在太美好了”才是正确的想法。

    这篇文章发表的时间处于IE7刚刚或即将发布的时候,其背景是IE一方面希望兼容原有的CSS实现,一方面又迫于压力不得不向W3C的CSS标准靠拢所形成的一种左右为难的局面。所以在CSS实现上,这个阶段的IE呈现出一些怪异的行为也是情有可原。但文章显然有以偏概全的嫌疑,IE对CSS的实现大部分行为并不怪异,很多CSS样式甚至是IE首先支持,那个时代的IE的确对float的支持很差劲,但不要忘了那个时候的Firefox根本就无法支持inline-block样式所能达到的效果。从这一点上来说,那时的IE的布局也并不见得比Firefox就要糟糕多少。何况,Firefox的事件处理模型比IE怪异这一观点也得到很多人的认同,至少我这么认为。
     回复 引用 查看   
  79. #79楼[楼主] Cat Chen      2009-11-06 08:35
    @Ivony...
    这里讨论的不是哪个浏览器的CSS功能多,而是哪个浏览器的CSS问题多,所以尽管IE支持很多强大的CSS效果,但也无法弥补它的缺陷。

    至于CSS问题,这里也不单纯说bug的数量,而是整个CSS Model是否容易理解。如果整个CSS Model设计上是正交的,一个bug就影响一个地方,那么遇到这个bug会很容易识别,同时也容易workaround。但IE的bug正好相反,hasLayout这样的Model绝对是不正交的。
     回复 引用 查看   
  80. #80楼 ixuh[未注册用户]2009-11-24 22:42
    作为一个初学者战战兢兢地发一下言,大牛太多了都不敢说话了。

    今天恰好就碰到了帖子中的问题,div中的内容超出了大小,FF中显示的div还是原来的大小。然后从众回复中发现原来这也有一个style属性限定,刚才找到了,overflow=visible。爬楼果然还是有好处的。
    其实就这个例子而言,我反而觉得默认行为就应该是要自动增加大小以适应内容变化(TD就是这样的吧?),是不是初学者都这么想呢?呵呵。

    题外话,今天鼓搞了一上午的FF,配各种插件,看英文看得眼睛发酸。不得不说有了插件后FF比IE强大很多,可是这个过程很折腾人。>.<
    现在我还是用的傲游,等于白配了(- -@),因为我发现大多数网页还真的就是IE看比较好,对一个普通用户而言,那一点点速度估计不会放在眼里的。
    用IE的多,开发也只好针对IE(甚至去找JS代码的时候很多都是仅IE适用而且还不注明),网页针对IE的多,用户又只好用IE,这不是个死循环么。

    最后说一句,很多时候同样的功能要写两套代码实在是太郁闷了。
     回复 引用   
  81. #81楼[楼主] Cat Chen      2009-11-24 22:57
    @ixuh
    我不否认初学者都希望div大小自适应,但当你遇到更复杂的问题是,你就会明白——FF可以做到自适应,但IE6反过来就做不到限制大小(hasLayout的情况下)。当我们需要应付各种情况时,FF做到了,IE却往往做不到,或者思路更加绕。

    至于脚本,还是老老实实学习道理吧,往上找来用不是好办法,用来学习思路还可以。51js的代码很多对吧?很多都很烂对吧?但那是很久以前的事情了,你看现在51js的版主是不是都支持跨浏览器。
     回复 引用 查看   
  82. #82楼 ixuh[未注册用户]2009-11-25 01:54
    @Cat Chen
    我真的是初学者啦。。
    我刚才发现overflow=visible这个属性不对
    visible :  不剪切内容也不添加滚动条。
    这意思不就是FF的默认动作么,试了一下果然是的。

    不过总算是找到解决方法了:
    max-height: 100px; //FF
    height: expression("100px"); //IE

    顿时觉得这水深的呀。

    PS:楼主你的feed可以收到更新但是链接全部打不开,是因为google被墙了吗?
     回复 引用   
  83. #83楼[楼主] Cat Chen      2009-11-25 09:56
    @ixuh
    哪个链接打不开?
     回复 引用 查看   
  84. #84楼 ixuh[未注册用户]2009-11-25 11:44
    @Cat Chen
    rss阅读器上,点标题打不开内容,但是可以看到预览。
    例如

    编写 iPhone Friendly 的 Web 应用程序 (Part 7 - 多点触击)
    http://feedproxy.google.com/~r/CatChen/Chinese/~3/8XOjYo05N_k/iphone-friendly-web-part-7.html

    把这个地址复制到地址栏都打不开呢。
    IE8: Navigation to the webpage was canceled
    FF: 连接超时 位于 chinese.catchen.biz 的服务器响应时间过长

    但是我直接在博客里找到对应的网页却可以看,所以我猜应该是Google被墙了。
     回复 引用   
  85. #85楼 ixuh[未注册用户]2009-11-25 12:07
    呃,说错了,是这个地址被墙了
    chinese.catchen.biz
     回复 引用   
  86. #86楼[楼主] Cat Chen      2009-11-25 12:30
    @ixuh
    这要看你具体订阅那个地址了,订阅dotnet.catchen.biz是没问题的,订阅chinese.catchen.biz就可能无法访问。
     回复 引用 查看   
  87. #87楼 ixuh[未注册用户]2009-11-25 16:05
    @Cat Chen

    订阅的问题已经解决,多谢!
     回复 引用