这篇东西写了很久,大概半个月了,开始想详尽的写完所有的IEbug,但是要回家了,暂时先把这些放出来吧。写的过程参考了很多文章,比以前明白了很多东西,也发现了很多不知道的问题,如果您看完了,发现任何错误疑点、任何意见观点可以评论或者发邮件给我。
命中注定总有一个浏览器作为复仇女神来到世界各地的开发者中,在web标准运动初期,这个角色是Netscape Navigator 4,垂死挣扎就是不肯死去,阻碍着现代标准的进程;今天这个角色被Internet Explorer 6这位邪恶的坏同学代替了。——Jeremy Keith
盒模型(The Box Model)
我这里把盒模型真正给丫立体化(特殊到正方体了怎么样):
有一个正方体宝贝比如是传说中象征永恒的水晶,为了保护它需要一个精美的盒子。为了防止碰撞,在盒子和水晶之间预留了空间来放海绵。在盒子外面再加一层泡沫塑料,也是为了防止水晶磕磕碰碰。我们现在把这宝贝一边的宽度定位width:60px(可以假想为60cm),盒子里面的海绵厚度padding:15px(也就是说海绵厚度为15cm),盒子的皮厚border:5px(包装够结实——5cm厚),那需要的盒子边长就是60+2*15+2*5=100px(盒子的边长是100cm),水晶盒子外面的泡沫塑料是margin:10px(外面再包10cm厚的泡沫,结实!盒模型的问题和它无关,先把他撕下来扔掉好了-__-)

对于标准的盒模型来说:他们的盒子是看到的实际的盒子,是包含了海绵和水晶的盒子。但是早期的IE看到的只是字面意思上的width。
解决方案:
在HTML页面里面加入完整的<!DOCTYPE>,IE6会切换到近似乎标准的模式,这样IE6就会正确的解释盒模型。如果你不这样做,也可以在定义了width的元素里面不用padding和border,在被封闭的元素里面随意的运用。
我一般解决这个问题的方法是,不在boxes里面用只在layout用.如果box里面有文字在
标签里,我会在p元素直接用padding,跳过这个问题,但是这是可行的。——css-tricks
双边距问题(Double-Margin)
几乎所有的有些经验但经验不足的同学都遇到过这个悲剧的现象,浮动div嵌套着用的不亦乐乎,margin-padding此起彼伏。定了个div想和外部的div保持距离,就在里面的div来个margin,这时候就产生了传说中丑名远播的双边距问题:
未修正代码:
#selector{
width:200px;
height:50px;
float:left;
margin:5px 20px;
border:#00a6cc;
}

修正代码:
#selector{
width:200px;
height:50px;
float:left;
margin:5px 20px;
border:#00a6cc;
display:inline;/*hi,-___-kill the double margin bug*/
}
在做BI十周年的时候我在父元素用了padding,在IE6标准模式下这样做也是一种办法。
最小/大宽/高(min-width/max-width and min-height/max-height)
IE6不能解释最小最大宽高,其实我觉得这用的不太多。对图片在站点中的重要问题有很多不知道,以后会慢慢学习。很多时候缩略图都是生成的图片,大幅图片直接缩小感觉会比较糟糕。
但是IE6会像标准浏览器解释min-width(min-height)一样解释width(height),所以可以利用IE6不能识别的!important或者其他IE6不能识别的高级选择符来hack:
#selector{
min-width:100px;
width:auto !important;/*IE6区分无法识别*/
width:100;
}
#selector{
min-width:100px;
width:100;
}
html>body #slector{/*IE6区分无法识别-IE7?*/
height:auto;
}
因为IE6把width/height处理了min-width/min-height,所以max-width/max-height没办法这样做了,所幸IE有自己的私有属性expressions,但是这个东西严重影响浏览器性能,但是还是摘来看看:
/*写给 IE6 的max-width*/
* html div.max-width {
width: expression(document.body.clientWidth > 499 ? "500px" : "auto");
}
/*写给标准浏览器的 max-width*/
div.max-width {
max-width: 500px;
}
max-width
/*写给 IE6 的max-height*/
* html div.max-height {
height: expression(this.scrollHeight > 499 ? "500px" : "auto");
}
/*写给标准浏览器的 max-height*/
div.max-height {
max-height: 500px;
}
max-height
高级选择符可参考之前的一些文章
清除浮动
首先我们来看看什么时候会遇到这个问题,来看初始的html结构和css(下面的测试将会在Firefox3.5以及IETester中的IE6和win系统版IE8/IE7兼容模式进行):
body{
color:#da444f;/*为了让字变色*/
}
*{
margin:0;
padding:0;/*一个小小的cssReset*/
}
.wrap{
border:1px solid #da444f;
background:#e4faff;
width:350px;/*添加不添加这个宽度呢,先填上*/
padding:10px;/*添加这个是为了边框和内容有点点距离*/
}
.column-left{
border:1px solid #00a6cc;
background:#ffdddf;
width:150px;
height:100px;
}
.column-right{
margin-left:10px;
border:1px solid #00a6cc;
background:#ffdddf;
width:150px;
height:100px;
}
column-leftcolumn-right
此时的显示无差异,均如下图所示:

不清楚浮动是怎么样的情况:
这个样子显然不是设计所需要的,两栏布局应该是一左一右并排才是。这时候不得不添加float:left;。在添加浮动我想多做一下测试,到底会有什么不同?单在左栏添加、单在右栏添加、两栏同时添加。
先看单在左栏添加的状况,此时左栏样式添加了float:left:
.column-left{
float:left;
border:1px solid #00a6cc;
background:#ffdddf;
width:150px;
height:100px;
}
这时候IE6显示如下:

IE7显示如下:

IE8和FF3.5显示和相同,如下:

可以看出IE67那抽风的样子,完全不可理喻,其他结论先不提。
下面再测试单在右栏添加float:left;:
.column-right{
float:left;
border:1px solid #00a6cc;
background:#ffdddf;
width:150px;
height:100px;
}
这次IE6显示如下:

(这里插播一则国际新闻:这个刚才为什么为什么这个和下面的不一样,包括刚才那个,其实呢,这个也是前文提到的双边距bug,这里只要在column-right加上display:inline;就可以解决了)
IE7显示:

IE8和FF3.5显示相同(实际上文字的字母的距离以及IE文字毛茸茸的样子是因为IE对字体进行了特殊的处理),如下

下面将测试左右栏都添加float:left;的情况:
IE6/7显示相同为:

IE8/FF显示为:

———————-休息一下,来个分割线———————-
有同学好奇的发现:在没有添加任何清除浮动的情况下,IE6/7显示的是正确的!只有FF3.5/IE8才有问题!这是因为另外一个应该被人知道的微软私有属性hasLayout搞的鬼。这里简单的介绍下:IE67支持这个东西,这个属性会被一些诸如width:*px的属性激活,激活这个东西IE会突然听话很多,更多介绍先推荐一篇翻译文章[译文]On having layout,其他的请看参考文章。这个属性到IE8就不支持了,所以上边最后的测试显示IE8,FF得到了我们预料的悲剧。我开始为了截图方便在.wrap添加了width:350px的属性。
下面再来看看没有这个width:350px的时候,左右都不添加浮动的情况,样式如下:
body{
color:#da444f;/*为了让字变色*/
}
*{
margin:0;
padding:0;/*一个小小的cssReset*/
}
.wrap{
border:1px solid #da444f;
background:#e4faff;
/*此处去掉width:350px*/
padding:10px;
}
.column-left{
border:1px solid #00a6cc;
background:#ffdddf;
width:150px;
height:100px;
}
.column-right{
margin-left:10px;
border:1px solid #00a6cc;
background:#ffdddf;
width:150px;
height:100px;
}
浏览器均显示为:

此时右栏在IE6并没有出现双边距问题,因为它不是浮动元素,其他单栏测试省略。
再来测试双栏添加float:left;wrap不设宽度,浏览器均如下所示:

再来测试双栏添加float:left;不设wrap宽度不设wrap内边距:(这样对比下,更直观)

说了这么多,自己越来越清晰,但不知道这样能不能讲明白,但是测试浮动会出很多状况。所以,传说浮动会产生一堆变态问题,那绝对是个事实!这个时候就会遇到怎么处理这些浮动的问题了。
解决方案——怎么清除浮动:
清除之后如图所示:
附加标签
W3C推荐的方法就是这个方法,这个方法在浮动元素末尾添加一个空标签:
或者div之类的也可以
这样添加额外的结构,如果不介意有些多余的结构也不会有任何问题。
clearfix
将下面代码写入css,在包含content的div加入clearfix:
.clearfix:after {
content: " ";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix { display: inline-table; }
/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
.clearfix { display: block; }
/* End hide from IE-mac */
像下面这样
column-leftcolumn-right
参考文章

每次看你博客都头好大好晕….. 不过还是感觉得出 你愈发的强大了….这是否意味着 我来这里游荡的次数会越来越少呢 哇哈哈哈哈
阿年呀,也许我会搞个更好玩的地方吧
还有一个用来解决很多ie让人无法理解的强hack:zoom没有提到哦,有时候还是很有用的哦。用来清除那些ie6下杀死脑细胞的浮动什么的很是管用,不过不知道有没有什么副作用……嘿嘿