浏览器兼容问题

全部浏览器 通用
height: 100px;

IE6 专用
_height: 100px;

IE6 专用
*height: 100px;

IE7 专用
*+height: 100px;

IE七、FF 共用
height: 100px !important;css

 


程序代码

height:100px;
*height:120px;
_height:150px;

下面我简单解释一下各浏览器怎样理解这三个属性:

在FF下,第二、3个属性FF不认识,因此它读的是 height:100px;

在IE7下,第三个属性IE7不认识,因此它读第一、2个属性,又由于第二个属性覆盖了第一个属性,因此IE7最终读出的是第2个属性 *height:120px;

在IE6下,三个属性IE6都认识,因此三个属性均可以读取,又由于第三个属性覆盖掉前2个属性,因此IE6最终读取的是第三个属性。html


 

1.为何在不一样的浏览器显示效果不同? 
由于不一样浏览器对于css样式表的解析不同,因此致使样式乃至层布局发生变化。例如,ff中设置padding属性时,div会相应增长height和width,而ie的解析是不会的,再例如ff对盒模型的解析和ie相差两个象素。浏览器

2.设计时要作到全部浏览器都兼容吗? 
根据“设计诉说”的站点统计小样本结果显示,6225个访问者中有72.1%使用IE6.0;12.7%使用IE7.0;7.9%在使用FF2.0,剩余的不一样版本的浏览器占的百分比都不到1% 。因此我认为只要作到IE6 FF2.0 以及新出的IE7.0兼容便可,顶多向下兼容一下IE5.5,彻底没有必要为了那些个小数点费劲脑子。若是有必要能够另外设计css文件,而后经过js判断浏览器版本进行选择相应的文件。app

3.css样式的优先级是怎么样的? 
在正常的IE中,若是你在css中重复定义一个属性时,浏览器解析的是后面的属性,布局

示例:box {height:100px;height:200px;height:400px;height:300px;}性能


<1> 区分三款浏览器简单方法: 
#example { color: #333; } /* Moz FF */ 
* html #example { color: #f0f; } /* IE6 */ 
*+html #example { color: #0ff; } /* IE7 */ 
在兼容IE7的*+html的hack必定要在顶部加入DTD声明,不然无效。测试

 

<2> ie7.0与ie6.0的之间不兼容 
ie7与ie6 在div+css出现宽度定义不一样,在宽度定义上出现宽度的解释不一样ui

IE7宽度在IE6上要宽一些,正是这个缘由网页可能会出现溢出问题, 还好这个问题能够经过更改数值或者修改一下百分比解决.。编码

ie7.0修复了!important这个bug。 url

先前因为ie6.0对!important识别存在bug, 在firefox和IE中的BOX模型解释不一致致使相差2px,大部分网页标准设计师经过这个bug来兼容 ie6.0和firefox,

即采用:div {margin:30px!important;margin:28px;}。

可是ie7.0把这个bug给修复了,因此问题又出现了,怎么兼容 ie.7.0的同时又能兼容ie6.0和firefox?

不过ie7 也能识别!important 也能够经过这个来区分IE6。 ie7.0对不少不规范的css再也不支持,对js语法要求更严格规范。 不少在IE6下正常显示的js页面,在IE7下均不能正常显示,而且尚未提示错误。

ie7.0对js语法要求更严格规范,只是这个规范彷佛并无说明,也没有明白的告诉你们,他们是怎么“规”怎么“范”的 .

 

<3> 如何作到让IE6.0与FF兼容? 
最经常使用的一种方法了,也是屡试不爽的——“!important”,这个字段是用来提升优先级的,而IE6.0对于找个字段是没法识别的,因而FF与 IE6.0就能够分开解析。

 

注意事项: 
一、float的div必定要闭合。 
例如:(其中floatA、floatB的属性已经设置为float:left;) 
< #div id="floatA" > 
< #div id="floatB" > 
< #div id="NOTfloatC" > 
这里的NOTfloatC并不但愿继续平移,而是但愿往下排。这段代码在IE中毫无问题,问题出在FF。缘由是NOTfloatC并不是float标签,必须将 float标签闭合。

在 
< #div class="floatB"> 
< #div class="NOTfloatC"> 
之间加上 
< #div class="clear"> 
这个div必定要注意声明位置,必定要放在最恰当的地方,并且必须与两个具备float属性的div同级,之间不能存在嵌套关系,不然会产生异常。

此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;

当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性,用zoom:1;能够作到,这样就达到了兼容。

例如某一个wrapper以下定义:colwrapper{overflow:hidden;zoom:1;margin:5px auto;}

 

二、margin加倍的问题 
设置为float的div在ie下设置的margin会加倍,这是一个ie6都存在的bug。

解决方案是在这 个div里面加上display:inline

相应的css为 
#IamFloat{ 
                   float:left; 
                   margin:5px;/*IE下理解为10px*/ 
                   display:inline;/*IE下再理解为5px*/}

 

三、关于容器的包涵关系 
不少时候,尤为是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。

必定要用Photoshop或者Firework量取像素级的精度。

 

四、关于高度的问题 
若是是动态地添加内容,高度最好不要定义。浏览器能够自动伸缩,然而若是是静态的内容,高度最好定好。

 

五、最狠的手段 —— !important; 
若是实在没有办法解决一些细节问题,能够用这个方法。FF对于”!important”会自动优先解析,然而IE则会忽略,

值得注意的是,必定要将 xxxx !important 这句放置在另外一句之上.

 

6.DOCTYPE 影响 CSS 处理

 

7.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行.

 

8.FF: body 设置 text-align 时, div 须要设置 margin: auto(主要是 margin-left,margin-right) 方可居中.

 

9.FF: 设置 padding 后, div 会增长 height 和 width, 但 IE 不会, 故须要用 !important 多设一个 height 和 width.

 

10.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式

 

11.div 的垂直居中问题: vertical-align:middle; 将行距增长到和整个DIV同样高 line-height:200px; 而后插入文字,就垂直居中了 。缺点是要控制内容不要换行

 

12.cursor: pointer 能够同时在 IE FF 中显示游标手指状, hand 仅 IE 能够.

 

13.FF: 连接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。

    参照 menubar, 给 a 和 menubar 设置高 度是为了不底边显示错位, 若不设 height, 能够在 menubar 中插入一个空格。

 

14.在mozilla firefox和IE中的BOX模型解释不一致致使相差2px解决方法:

div{margin:30px!important;margin:28px;}

注意这两个margin的顺序必定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器能够识别。

因此在IE下其实解释 成这样: 

div{maring:30px;margin:28px} 
重复定义的话按照最后一个来执行,因此不能够只写margin:XXpx!important; 
  

15.IE5 和IE6的BOX解释不一致 

IE5下 :div{width:300px;margin:0 10px 0 10px;} 

div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其余浏览器上宽度则是以300px+10px(右填 充)+10px(左填充)=320px来计算的。

这时咱们能够作以下修改:
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px} 

16.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值,

因此先定义 :ul{margin:0;padding:0;}     就能解决大部分问题

 

17.ff下父容器的高度自适应 
  height:100%; overflow:auto

 

18.各浏览器padding兼容 
padding:0px;  /*ff*/ 
*padding:0px; /*ie7.0*/ 
_padding:0px; /*ie6.0 */

 

19.img 下的留白

你们看这段代码有啥问题: 
<div> 
<img src=”" mce_src=”" /> 
</div> 
把div的border打开,你发现图片底部不是紧贴着容器底部的,是img后面的空白字符形成,要消除必须这样写 
<div> 
<img src=”" mce_src=”" /></div> 

 

20. 失去line-height

<div style=”line-height:20px”><img />文字</div>,很遗憾,在ie6下单行文字 line-height 效果消失了。

缘由是<img />这个inline-block元素和inline元素写在一块儿了。解决方案:让img 和文字都 float起来 


21 .IE 5.x/Win
在此咱们指Windows平台上的IE 5.0和IE 5.5。CSS的支持依然很糟糕,可是比起NN 4.x已经有了长足的改变。

它们臭名昭著错误的盒状模型(Box model)多是致使CSS界第一个hack的出现。咱们先来看看盒状模型。

W3C规范的盒子,可使用“相加”来描述,即,一个元素的实际盒子宽度是由内容宽度(content width),边框(border),边距(padding)堆积起来的。

而IE 5.x/Win则能够用“相减”来描述,也被称为边框盒状模型(border box model),一个元素的实际宽度就是该元素的width设值,边框,边距都从中减去。

 

来看一个例子:
div { width: 200px; margin: 20px; padding: 20px; border: 5px;}

依照W3C规范,这个div实际所占宽度是5px + 20px + 200px + 20px + 5px。

而对IE5.x/Win的边框盒状模型来讲,这个div实际宽度就是200px,而内容宽度被压迫到只有150px:200px - 5px - 20px - 20px - 5px。这时候,出现了Box Model Hack.

该hack使用了IE 5.x/Win不支持的voice-family,并在值中设置一些CSS转义引号(CSS-escape quotes)欺骗IE 5.x/Win认为规则块(declaration block)已经闭合。

div { /*为了更好说明,width调了一下写做习惯*/ margin: 20px; padding: 20px; border: 5px; width: 240px;           /* 1. IE 5.x/Win须要的宽度 */ voice-family: "\"}\"";  /* 2. IE

5.x/Win看见了},认为规则已经结束了 */ voice-family: inherit;  /* 3. 可以正确解析的浏览器重置该值 */ width: 200px;           /* 4. 这才是咱们须要的真正宽度 */}  

 

21.图片下方出现几像素的空白间隙
问题说明:这个问题在ie6和ff(火狐)下常常见到。

例如 <div><img src=""/></div>这个图片下面会有一条空白间隙。

解决方法:给图上一个垂直方向的属性如:vertical-align: top(任意一个就行middle);

这个问题从而延伸到——object(视频)和textarea在火狐下也会出现相似的问题,解决方法同样。

重置代码里就有这样一个全局定义:object,textarea,img{vertical-align: top;}


22.IE6双倍margin的BUG(双边距)
问题说明:这是ie6一个著名的bug,当一个元素向一边浮动时,其它同一个方向若是有margin的话,ie6就会产生双倍的margin。

例如:<div style="float: left;margin-left: 10px;"></div>在ie6下显示会有margin-left:20px的距离

解决方法:加个_display:inline:属性

例如<div style="float: left;margin-left: 10px;_display: inline;"></div>


23.ie6下的浮动元素和非浮动元素间出现3像素BUG
问题说明:这也是ie6一个著名的bug,当一个元素浮动时,同级别的文字没有浮动,在ie6下它们之间就会产生3个像素的bug。

例如:<div><img style="float: left;" src=""/>摘要摘要摘要摘要</div>,图片和文字就会出现3像素

解决方法:方法一,两个元素都浮动,

如:<div><img style="float: left;" src=""/><span style="float: left;">摘要摘要摘要摘要</span></div>;

方法二,这种设计时通常图片和文字要有间隙的,作个ie6的hack就行,

如:<div><img style="float: left;" src=""/><span style="margin-right: 5px; _margin-right: 2px;">摘要摘要摘要摘要</span></div>


24.li在IE中底部空行
问题说明:当li里面有两个以上的浮动元素时,li的下面就会产生一条空白间隙,

例如:<ul class="tlist"><li><span style="float: left;">栏目</span><a style="float: left;" href="#" target="_blank">标题标题标题</a></li></ul>

解决方法:这个问题和第一个问题很类似,解决方法也是同样,在li上加个垂直方向的属性,

例如:<ul class="tlist"><li style="vertical-align: top;"><span style="float: left;">栏目</span><a style="float: left;" href="#" target="_blank">标题标题标题</a></li></ul>

 

25.IE6样式中文注释后引起失效

问题说明:这是ie6 出现的奇怪现象。这是因为css 和html 的编码不一样所引致,知足下面条件就会引发注释下面的样式不起做用:

1). css有中文注释

2). css为ANSI编码

3). html为utf-8编码

解决方法:
1). 去掉中文注释,用英文注释或者多打几个“*”,这是ahuing在以前的教程里提到的,例如: /*** 注释 ***/
2). 统一css 和 html 的编码
建议采用第二种解决方法。ps: css为uft-8  html 为ANSI ,貌似不会出现失效的状况。



26
.IE6出现重复字符(文字溢出)


问题说明:一个容器包含2两个具备“float”样式的子容器,第二个容器的宽度大于父容器的宽度,或者父容器宽度减去第二个容器宽度的值小于3,在第二个容器前存在注释(这也是为何此bug也叫作“IE6注释bug”的缘由)。

例以下列代码:

 1 <!DOCTYPE html PUBLIC "-//W3C//liD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/liD/xhtml1-transitional.lid">  2  3 <html xmlns="http://www.w3.org/1999/xhtml">  4  5 <head>  6  7 <meta http-equiv="Content-Type" content="text/html; charset=gbk" />  8  9 <title>标题</title> 10 11 <style> 12 13 *{ 14  margin: 0;padding: 0;font-size: 12px; 15 } 16  .a{width:205px;} 17 .b{ 18  float: left; 19  width: 50px; 20  background: black;color: #fff;margin-right: 5px; 21  overflow: hidden; 22 } 23 .c{ 24  float: left; 25  width: 150px; 26  background: red; 27 } 28 </style> 29 </head> 30 <body> 31 <div class="a"> 32 <div class="b">测试测试测试测试测试测试测试111111111111</div> 33 <!-- 注释 --> 34 <div class="c">测试测试测试测试测试测试测试2222222222</div> 35 </div> 36 </body> 37 </html>

 

解决方法:

为什么会出现重复文字,谁也没说清楚,包括官方,这个问题,我的认为,ie6将注释也当成内容存在。如何消灭重复文字,只要让上面任何一个条件不知足便可。

改变结构,不出现【一个容器包含2两个具备“float”样式的子容器】的结构。


1).减少第二个容器的宽度,使父容器宽度减去第二个容器宽度的值大于3。

2).去掉全部的注释。
3).在第二个容器后面加一个或者多个<div style="clear"></div>来解决。 
4).给溢出文字的标签加position: relative;属性 

27.png图片在IE6下出现透明或背景变灰的bug;

问题说明:这里的png图片是指32位和24位的,8位的png图片透明ie6是支持的。

解决方法:
1)使用滤镜,语法以下
.image-style 
{ background-image: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="filename.png", sizingMethod="scale"); }

注意:使用滤镜须要损耗性能。

2)给IE6单独制做一张.gif图片(或者8位的png图片),打上hack
.image-style{ background:transparent url("filename.png") no-repeat scroll 0 0;_background-image:url("filename.gif"); }

这种方法只须要在切图时多存储一份.gif格式的图片,通常采用这种方法。


参考:http://www.javashuo.com/article/p-zhjeuvhw-gv.html

相关文章
相关标签/搜索