浏览器兼容问题
所有浏览器 通用
height: 100px;
IE6 专用
_height: 100px;
IE6 专用
*height: 100px;
IE7 专用
*+height: 100px;
IE7、FF 共用
height: 100px !important;
程序代码
height:100px;
*height:120px;
_height:150px;
下面我简单解释一下各浏览器怎样理解这三个属性:
在FF下,第2、3个属性FF不认识,所以它读的是 height:100px;
在IE7下,第三个属性IE7不认识,所以它读第1、2个属性,又因为第二个属性覆盖了第一个属性,所以IE7最终读出的是第2个属性 *height:120px;
在IE6下,三个属性IE6都认识,所以三个属性都可以读取,又因为第三个属性覆盖掉前2个属性,所以IE6最终读取的是第三个属性。
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判断浏览器版本进行选择相应的文件。
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出现宽度定义不同,在宽度定义上出现宽度的解释不同
IE7宽度在IE6上要宽一些,正是这个原因网页可能会出现溢出问题, 还好这个问题可以通过更改数值或者修改一下百分比解决.。
ie7.0修复了!important这个bug。
先前由于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就可以分开解析。
注意事项:
1、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;}
2、margin加倍的问题
设置为float的div在ie下设置的margin会加倍,这是一个ie6都存在的bug。
解决方案是在这 个div里面加上display:inline
相应的css为
#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}
3、关于容器的包涵关系
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。
一定要用Photoshop或者Firework量取像素级的精度。
4、关于高度的问题
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。
5、最狠的手段 —— !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格式的图片,一般采用这种方法。