[转贴]欲练 CSS ,必先宫 IE

原文:http://www.cnblogs.com/cathsfz/archive/2007/02/18/652226.html

“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才能解决问题,这就是我接下来要研究的事情。

时间: 2024-09-10 23:22:22

[转贴]欲练 CSS ,必先宫 IE的相关文章

欲练CSS ,必先解决IE的一些细节分析_经验交流

更加坏的事情是,即使你仅仅针对IE设计,不考虑其它浏览器,由于IE模型绝对可以说是一只让人难以捉摸其脾气的怪物,所以你单纯为IE设计也会遇到众多难题,发现很多的效果总是绕来绕去都难以实现. 我们都知道,XHTML+CSS的目标就是实现内容与表现分离,理论上对于任何特定一份内容,我们都可以通过CSS实现任何我们想要的表现形式,或者细致地说是布局形式.虽然现实与这个目标有一定差距,但是CSS已经能够满足大多数常见的布局需求,这有CSS Zen Garden为证.然而如果你用的是IE,因为它难以捉摸,

大数据共享交易平台:欲练神功,必先自宫!

大数据交易平台发展迅猛 大数据成为创新经济的引擎,基于大数据的产业异常活跃,各地政府都把大数据当做经济转型的重点,也把大数据作为"弯道取直",实现后发赶超,获得跨越式发展的机会.于是,很多地方联合企业主导的大数据产业园,大数据交易中心纷纷成立: 面对各地蓬勃发展的大数据交易中心,大家都很谦虚,都在说探索,那么什么样的数据共享交易机制才有利于数据的流动呢? 数据企业对大数据交易平台并不感冒 接触过不少大数据企业,通常都会问负责人同一个问题:你们的数据会通过数据交易中心提供服务吗?得到的回

小网站的做大之路:欲练神功 先修内功

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 资源的稀缺性是笼罩在市场竞争主体头上的那一圈"黑云",于创业者尤甚,如果不能在稀缺的资源中分一杯羹,那下一顿可能就不知道在哪里吃,最终,遭遇饿死之命运.对此,互联网领域的草根们更有深刻体会. CNNIC发布的第20次中国互联网络发展状况统计报告中显示,截至2007年6月,中国网站数量已经达到131万个.CNNIC报告显示,2007年上半年我国共增加了47万个网站,比2006年同期增加了52万个,年增长率达到66.4%.目前中国每万

div+css必看的15个css重则

DIV+CSS最重要的优势之一:保持视觉的一致性;以往表格嵌套的制作方法,会使得页面与页面,或者区域与区域之间的显示效果会有偏差.而使用DIV+CSS的制作方法,将所有页面,或所有区域统一用CSS文件控制,就避免了不同区域或不同页面体现出的效果偏差.下面为你介绍几点注意事项,希望对你有帮助. 1.不要使用过小的图片做背景平铺. 这就是为何很多人都不用 1px 的原因,这才知晓.宽高 1px 的图片平铺出一个宽高 200px 的区域,需要 200*200=40, 000 次,占用资源. 2.无边框

阿紫遭恶搞穿彩衣 网友:我是阿赤橙黄绿青蓝紫

"阿紫"遭恶搞穿彩衣 网友:我是阿赤橙黄绿青蓝紫 作为读者心中经久不衰的武侠作品,金庸小说一直在被不停改编和翻拍成影视剧,并影响了几个年代的观众.而不同年龄层的观众心中,也都有一个自己偏爱的版本.但是,近日http://www.aliyun.com/zixun/aggregation/22669.html">华策影视(300133,股吧)曝光的一组新版<天龙八部>定妆照,却遭到网友大力吐槽.巧的是,于正工作室打造的<笑傲江湖>曝光的首款片花被网友

百度副总裁朱光:百度联盟凝聚互联网追梦人

中介交易 SEO诊断 淘宝客 云主机 技术大厅 "风雨十二年,百度联盟已经拥有70万合作伙伴.这其中,有耀眼如星的风云人物,也有无数执着追梦的草根创业者.百度联盟12年的快速发展离不开你们,中国互联网的发展也离不开你们!"面对聚集在黄山脚下的众多合作伙伴,百度副总裁朱光十分感慨,他深知自己面前是一群执着的追梦人,他们正在用互联网改变人生,也用互联网改变世界.每一位创业者都有着一段惊涛骇浪的创业故事."一路走来,百度联盟分成总额从前年的19亿大幅增长到去年接近38亿.正是坚韧.

平面设计理论:制作LOGO的方法和思路

发散性思维要点: 1:本秘籍和大家分享的是做LOGO 的方法和思维方式   不涉及造型和色彩心理学等基础知识 2:转载请注明出处和作者:李小强(http://ska2016.blogbus.com/)  (再次鄙视转载 字体真经 却写自己名字的同学) 3:本秘籍只是万千武功中的一种,仅供参考,走火入魔我不负任何连带责任 4:欲练神功 不必自宫! 绝世武功必然有心法 讲心法前 先和大家诠释2个名词 大家先看下面这些LOGO  这些是我随机找的体育类的LOGO 他们都有什么共同特征呢? 很显然 他们

yii去掉必填项中星号的方法_php实例

本文实例讲述了yii去掉必填项中星号的方法.分享给大家供大家参考,具体如下: 如何去掉必填项里的星号呢? 先分析下代码实现: public function labelEx($model,$attribute,$htmlOptions=array()) { return CHtml::activeLabelEx($model,$attribute,$htmlOptions); } public static function activeLabelEx($model,$attribute,$ht

Java面试笔试题大汇总(最全+详细答案)

声明:有人说, 有些面试题很变态,个人认为其实是因为我们基础不扎实或者没有深入.本篇文章来自一位很资深的前辈对于最近java面试题目所做的总结归纳,有170道题目 ,知识面很广 ,而且这位前辈对于每个题都自己测试给出了答案 ,如果你对某个题有疑问或者不明白,可以电脑端登录把题目复制下来然后发表评论,大家一起探讨,也可以电脑端登录后关注我给我发私信,我们一起进步! 以下内容来自这位前辈 2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题