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

更加坏的事情是,即使你仅仅针对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:

  • Cat in Chinese (feed: http://feeds.feedburner.com/CatChen/Chinese)
  • Cat in dotNET (feed: http://feeds.feedburner.com/CatChen/dotNET)

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

时间: 2024-09-24 14:36:36

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

IE6不能正常解析CSS文件问题的解决方法及原因分析_经验交流

网页采用了 UTF-8 编码格式,这本来没有问题,问题是外部 CSS 文件默认是 ANSI 编码,并没有保存为 UTF-8 格式.可能你会发现在一般情况下这样也是没有问题的,然而当 CSS 文件中包含有中文注释时就可能不尽如人意了!估计是 IE6 版本以下的浏览器在解析这个 CSS 文件时因为编码问题而无法正确解析,所以才会发生 CSS 在 IE6 下不起作用的情况.看来微软已注意到这个问题,在 IE7 中把它修复了.但是用IE6 的人还是不少.因此这个问题需要解决: 方法一:把 CSS.JS

CSS兼容要点分析_经验交流

IE vs FF CSS 兼容要点: DOCTYPE 影响 CSS 处理 FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中 FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 h

CSS hack实现 CSS完美兼容IE6/IE7/FF的通用方法_经验交流

关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一.CSS HACK 以下两种方法几乎能解决现今所有HACK. 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的HACK.(注意写法.记得该声明位置需要提前.) <style> #wrapper { width: 100px!important; /* IE7+FF */ width: 

css 不换行 自动换行 强制换行的实现方法_经验交流

强制不换行 div{ white-space:nowrap; } 自动换行 div{  word-wrap: break-word;  word-break: normal;  } 强制英文单词断行 div{ word-break:break-all; } CSS设置不转行: overflow:hidden 隐藏 white-space:normal 默认  pre 换行和其他空白字符都将受到保护 nowrap 强制在同一行内显示所有文本,直到文本结束或者遭遇 br 对象 设置强行换行: wor

一些很不错的css技巧,但也常为人们所忽略_经验交流

一.区分大小写 当在XHTML中使用CSS,CSS里定义的元素名称是区分大小写的.为了避免这种错误,我建议所有的定义名称都采用小写. 二.不需要给背景图片路径加引号 为了节省字节,我建议不要给背景图片路径加引号,因为引号不是必须的.例如: background:url("images/***.gif") #333;  可以写为 background:url(images/***.gif) #333;  如果你加了引号,反而会引起一些浏览器的错误. 三.用正确的顺序指定链接的样式 当你用

DIV+CSS布局的网站对网站SEO的影响分析_经验交流

符合XHTML标准DIV+CSS布局的网站,下面说说在SEO方面的影响. 代码精简 使用DIV+CSS布局,页面代码精简,这一点相信对XHTML有所了解的都知道.代码精简所带来的直接好处有两点:一是提高spider爬行效率,能在最短的时间内爬完整个页面,这样对收录质量有一定好处;二是由于能高效的爬行,就会受到spider喜欢,这样对收录数量有一定好处. 表格的嵌套问题 很多SEOer在其文章中称,搜索引擎一般不抓取三层以上的表格嵌套,这一点一直没有得到搜索引擎官方的证实.我的几项实验结果没有完全

提高CSS网页渲染效率的11点注意事项_经验交流

1.十六进制的颜色值对位数与大小写  编写十六进制颜色值时你可能会用小写字母或省略成3位数,关于这写法没找到确实的数据证明对浏览器的渲染效率是否有影响,但十六进制的颜色值默认标准是大写及6位数标注.在未知情况下不希望冒险而降低了渲染的效率.  * 不赞成 - color:#f3a;  * 建议用 - color:#FF33AA;  2.display与visibility的差异  他们用于设置或检索是否显示对象.display隐藏对象不保留物理空间,visibility为隐藏对象保留占据的物理空

CSS仿淘宝首页导航条布局效果_经验交流

以下是CSS内容部分: 以下是引用片段: 首页 数码通讯 女人 男人 家居 书籍音像 运动 游戏 宠物 香港街 淘宝商城 仿淘宝网首页导航条效果 转载请注明出处 子鼠 www.zishu.cn 2006-05-21 凌晨03:05分 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

CSS实现每行新闻数量不等效果代码_经验交流

本来还以为这块是由后台单独去做的,今天看到这种效果,居然是CSS实现的.现在将它放到这里与大家共享 特别推荐 1.脚本代码收藏站,AJAX/JS/ASP/PHP一网打尽[特别推荐]! 2.看书了小说网! 3.中文最强大的搜索引擎! 4.,下载中心! 5.新增加photoshop,flash,制作教程经典收藏! [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]