这篇东西写了很久,大概半个月了,开始想详尽的写完所有的IEbug,但是要回家了,暂时先把这些放出来吧。写的过程参考了很多文章,比以前明白了很多东西,也发现了很多不知道的问题,如果您看完了,发现任何错误疑点、任何意见观点可以评论或者给我。
命中注定总有一个浏览器作为复仇女神来到世界各地的开发者中,在web标准运动初期,这个角色是Netscape Navigator 4,垂死挣扎就是不肯死去,阻碍着现代标准的进程;今天这个角色被Internet Explorer 6这位邪恶的坏同学代替了。——
盒模型(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不能解释最小{zd0}宽高,其实我觉得这用的不太多。对图片在站点中的重要问题有很多不知道,以后会慢慢学习。很多时候缩略图都是生成的图片,大幅图片直接缩小感觉会比较糟糕。
但是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
高级选择符可参考之前的一些文章
xx浮动
首先我们来看看什么时候会遇到这个问题,来看初始的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; }
此时的显示无差异,均如下图所示:
不清楚浮动是怎么样的情况:
这个样子显然不是设计所需要的,两栏布局应该是一左一右并排才是。这时候不得不添加float:left;
。在添加浮动我想多做一下测试,到底会有什么不同?单在左栏添加、单在右栏添加、两栏同时添加。
先看单在左栏添加的状况,此时左栏样式添加了float:left:
.column-left{ float:left; border:1px solid #00a6cc; background:#ffdddf; width:150px; height:100px; }
这时候IE6显示如下:
IE7显示如下:
IE8和FF3.5显示和相同,如下:
可以看出IE67那抽风的样子,xx不可理喻,其他结论先不提。
下面再测试单在右栏添加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显示为:
———————-休息一下,来个分割线———————-
有同学好奇的发现:在没有添加任何xx浮动的情况下,IE6/7显示的是正确的!只有FF3.5/IE8才有问题!这是因为另外一个应该被人知道的微软私有属性hasLayout搞的鬼。这里简单的介绍下:IE67支持这个东西,这个属性会被一些诸如width:*px的属性xx,xx这个东西IE会突然听话很多,更多介绍先推荐一篇翻译文章,其他的请看参考文章。这个属性到IE8就不支持了,所以上边{zh1}的测试显示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内边距:(这样对比下,更直观)
说了这么多,自己越来越清晰,但不知道这样能不能讲明白,但是测试浮动会出很多状况。所以,传说浮动会产生一堆变态问题,那{jd1}是个事实!这个时候就会遇到怎么处理这些浮动的问题了。
解决方案——怎么xx浮动:
xx之后如图所示:
附加标签
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 */
像下面这样
参考文章