• 2315阅读
  • 1回复

常见浏览器兼容性问题与解决方案ie浏览器兼容性测试

楼层直达
所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。 $ -<(geI  
c CDT27 @  
在学习浏览器兼容性之前,我想把前端开发人员划分为两类: =`|BofR  
D6?h 6`J  
第一类是精确按照设计图开发的前端开发人员,可以说是精确到1px的,他们很容易就会发现设计图的不足,并且在很少的情况下会碰到浏览器的兼容性问题,而这些问题往往都死浏览器的bug,并且他们制作的页面后期易维护,代码重用问题少,可以说是比较牢固放心的代码。 k*6"!J%A  
v9r.w-  
第二类是基本按照设计图来开发的前端开发人员,很多细枝末节差距很大,不如间距,行高,图片位置等等经常会差几px。某种效果的实现也是反复调试得到,具体为什么出现这种效果还模模糊糊,整体布局十分脆弱。稍有改动就乱七八糟。代码为什么这么写还不知所以然。这类开发人员往往经常为兼容性问题所困。修改好了这个浏览器又乱了另一个浏览器。改来改去也毫无头绪。其实他们碰到的兼容性问题大部分不应该归咎于浏览器,而是他们的技术本身了。 !idVF!xG  
z7:* ,X  
文章主要针对的是第一类,严谨型的开发人员,因此这里主要从浏览器解析差异的角度来分析兼容性问题。(相关文章推荐:主流浏览器CSS 3和HTML 5兼容清单) fUY05OMZ  
c;"e&tW  
浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同 T{^mh(3/"  
\ILNx^$EL  
问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。 _6h.<BR  
4[kyzz x  
碰到频率:100% J!~kqNI  
>jmHe^rH  
解决方案:CSS里    *{margin:0;padding:0;} ~4FzA,,  
k= 9+"4:  
备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符*来设置各个标签的内外补丁是0。 ^J hs/HV  
.s4v*bng  
浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大 7R79[:uwJ  
Q=DMfJ"  
问题症状:常见症状是IE6中后面的一块被顶到下一行 w[ 3a^  
/E\04Bs  
碰到频率:90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题) w nQy   
V{q*hQd_3  
解决方案:在float的标签样式控制中加入 display:inline;将其转化为行内属性 Pke8RLg2A  
V*2 * 5hx  
备注:我们最常用的就是div+CSS布局了,而div就是一个典型的块属性标签,横向布局的时候我们通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。 W" vkmk  
+p jB/#4  
浏览器兼容问题三:设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度 3!sZA?q  
80g}<Lwc  
问题症状:IE6、7和遨游里这个标签的高度不受控制,超出自己设置的高度 h/:LC 7  
)OFN0'  
碰到频率:60% :~W(#T,$E  
II _CT=  
解决方案:给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。 *Od?>z  
ZRw^< +  
备注:这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。 2g5 4<G*e  
>f^kp8`3{Y  
浏览器兼容问题四:行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug 1/ j >|  
A@d 2Ukv  
问题症状:IE6里的间距比超过设置的间距 7 u Q +]d  
Df2$2VU  
碰到几率:20% ,+OVRc  
)`Qr=DIsW  
解决方案:在display:block;后面加入display:inline;display:table; `<T4 En  
%$)Sz[=  
备注:行内属性标签,为了设置宽高,我们需要设置display:block;(除了input标签比较特殊)。在用float布局并有横向的margin后,在IE6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行内属性标签,所以我们再加上display:inline的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入display:talbe。 qJl DQc-  
0%HAa|L,,  
浏览器兼容问题五:图片默认有间距 n++ak\  
pV:44  
问题症状:几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。 q`z1ht nf  
~K|ha26W  
碰到几率:20% 7rGp^  
x2b t^!t.  
解决方案:使用float属性为img布局 +Qzl-eN/+  
|KPNl\%ID  
备注:因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。(我的一个学生使用负margin,虽然能解决,但负margin本身就是容易引起浏览器兼容问题的用法,所以我禁止他们使用) S @!z'$&  
, :KJ({wM  
浏览器兼容问题六:标签最低高度设置min-height不兼容 r@'~cF]m  
W_/$H_04+  
问题症状:因为min-height本身就是一个不兼容的CSS属性,所以设置min-height时不能很好的被各个浏览器兼容 4@ny%_/  
=&.9z 4A  
碰到几率:5% ].QzOV'  
awQB0ow'$P  
解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;} zY4y]k8D*  
j/ARTaO1]"  
备注:在B/S系统前端开时,有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。 brqmi<*9"[  
E( *CEW.V*  
浏览器兼容问题七:透明度的兼容CSS设置 :F"NF  
]yFO~4Nu  
做兼容页面的方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题。 ?xQm_ 91X^  
LTb#1JC  
/* CSS hack*/ Gch3|e  
我很少使用hacker的,可能是个人习惯吧,我不喜欢写的代码IE不兼容,然后用hack来解决。不过hacker还是非常好用的。使用hacker我可以把浏览器分为3类:IE6 ;IE7和遨游;其他(IE8 chrome ff safari opera等) uF D  
_.W;hf`  
◆IE6认识的hacker 是下划线_ 和星号 * {k'$uW `  
UH5A;SrTqR  
◆IE7 遨游认识的hacker是星号 * ZJjm r,1  
GgvMd~  
比如这样一个CSS设置: k/Ao?R=@gI  
]4 \6_J&  
height:300px;*height:200px;_height:100px; 0v3 8LBH)  
IE6浏览器在读到height:300px的时候会认为高时300px;继续往下读,他也认识*heihgt, 所以当IE6读到*height:200px的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,IE6还认识_height,所以他又会覆盖掉200px高的设置,把高度设置为100px; ECuNkmUI  
Z/e[$xT <  
IE7和遨游也是一样的从高度300px的设置往下读。当它们读到*height200px的时候就停下了,因为它们不认识_height。所以它们会把高度解析为200px,剩下的浏览器只认识第一个height:300px;所以他们会把高度解析为300px。因为优先级相同且想冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。
只看该作者 安逸沙发  发表于: 2014-08-11
兼容性处理要点 wjB:5~n50k  
1、DOCTYPE 影响 CSS 处理 RQ" ,3.R==  
Z o(rTCZX  
2、FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width H8}oIA"b  
T!)(Dv8@F  
3、FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式 FP4P|kl/9'  
lZKi'vg7  
4、div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行 T%*D~=fQ'  
3"~!nn0;  
5、在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法: }a(dyr`S  
R%[ c;i  
div{margin:30px!important;margin:28px;} lA8`l>I  
iSs:oH3l  
注意这两个margin的顺序一定不能写反,!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样: q9s=~d7  
V1B5w_^>h'  
div{maring:30px;margin:28px} tf`^v6m%]  
9V*qQS5<p  
重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important; i?^L/b`H  
smo~7;  
浏览器差异 oe-\ozJ0  
1、ul和ol列表缩进问题 &6nWzF  
sD#.Oq4&]y  
消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px; pIqeXY  
其中margin属性对IE有效,padding属性对FireFox有效。 r3UUlR/Do  
>tW#/\x{  
[注]经验证,在IE中,设置margin:0px可以去除列表的上下左右缩进、空白以及列表编号或圆点,设置padding对样式没有影响;在 Firefox 中,设置margin:0px仅仅可以去除上下的空白,设置padding:0px后仅仅可以去掉左右缩进,还必须设置list- style:none才 能去除列表编号或圆点。也就是说,在IE中仅仅设置margin:0px即可达到最终效果,而在Firefox中必须同时设置margin:0px、 padding:0px以及list-style:none三项才能达到最终效果。 gc$l^`+M  
X45%e!  
2、CSS透明问题 7J<5f)  
Wvf ^N(  
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。 z-)O9PV  
FF:opacity:0.6。 wz%Nb Ly-  
[注] 最好两个都写,并将opacity属性放在下面。 p0vVkdd  
;NITc  
3、CSS圆角问题 v` 1lxX'*  
j&qub_j"xX  
IE:ie7以下版本不支持圆角。 (SAs-  
FF: -moz-border-radius:4px,或者-moz-border-radius-topleft:4px;-moz- border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz- border- radius- bottomright:4px;。 $~T4hv :  
[注] 圆角问题是CSS中的经典问题,建议使用JQuery框架集来设置圆角,让这些复杂的问题留给别人去想吧。不过jQuery的圆角只看到支持整个区域的圆角,没有支持边框的圆角,不过这个边框的圆角可以通过一些简单的手段来实现,下次有机会介绍下。 S30%)<W  
'TB2:W3  
4、cursor:hand VS cursor:pointer 13x p_j  
1bwOm hkS  
问题说明:firefox不支持hand,但ie支持pointer ,两者都是手形指示。 j?4qO]_Wx+  
解决方法:统一使用pointer。 ;9QEK]@  
uQKT  
5、字体大小定义不同 O?#7N[7  
.HABNPNg(  
对字体大小small的定义不同,Firefox中为13px,而IE中为16px,差别挺大。 [ub e6  
7WzxA=*#  
解决方法:使用指定的字体大小如14px。 +9sQZB# (  
sc#qwQ#  
并列排列的多个元素(图片或者链接)的div和div之间,代码中的空格和回车在firefox中都会被忽略,而IE中却默认显示为空格(约3px)。 ?(_08O  
Z6MO^_m2  
6、CSS双线凹凸边框 <t!W5q  
IE:border:2px outset;。 5146kp|1  
FF: -moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080; ]JQULE)  
!&@615Vtw  
浏览器bug >9Vn.S  
1、IE的双边距bug xxQ;xI0+]  
p0eX{xm  
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。 (+hK%}K>  
9H1rO8k  
解决方案:在这个div里面加上display:inline; vtJJ#8a]  
SSzIih@u  
例如: %iqD5x$OA  
K3l95he  
<#div id=”imfloat”> hOK8(U0  
G=bCNn<  
相应的css为 3=V &K-  
b%c9oR's^  
以下为引用的内容: >/6 _ ^  
"d}Gp9+$VY  
复制代码代码如下:  4Wp=y  
#IamFloat{ M)(DZ}  
float:left; + >!;i6|  
margin:5px;/*IE下理解为10px*/ )QJUUn#  
display:inline;/*IE下再理解为5px*/ m(P]k'ZH?  
} pTuS*MYz  
#IamFloat{ ,`sv1xwd  
float:left; zKK9r~ M  
margin:5px;/*IE下理解为10px*/ IAyp2  
display:inline;/*IE下再理解为5px*/ -tU'yKhn  
} NX&_p!_V  
bhs _9ivw  
关于CSS中的问题实在太多了,甚至同样的CSS定义在不同的页面标准中的显示效果都是不一样的。一个合乎发展的建议是,页面采用标准XHTML标准编写,较少使用table,CSS定义尽量依照标准DOM,同时兼顾IE、Firefox、Opera等主流浏览器。很多情况下,FF和 Opera的CSS解释标准更贴近CSS标准,也更具有规范性。 u]G\H!Wk Q  
^kSqsT"  
2、IE选择符空格BUG 4{Z)8;QX  
今天在给博客的段落样式设置首字符样式的时候发现,原来一个空格也可以使样式失效。 MfkN]\Jyw  
J,6yYIq  
请看以下代码: @KUWxFak  
nT)vNWT=  
-%4,@ x`  
复制代码代码如下: ~bpgSP"  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> q75s#[<ap  
<html xmlns="//www.w3.org/1999/xhtml"> HtYwEjI  
<head> Dum9lj  
<title></title> |vzl. ^"-  
<style type="text/css"> e@YK@?^#N  
<!-- '}#9)}x!  
p{font-size:12px;} ;xn0;V'=  
p:first-letter{font-size:300%} Qe(:|q _  
--> 7Fsay+a  
</style> |! "eWTJ  
</head> }SCM I4\  
<body> (&x['IR  
Yu2Bkq+  
<p>对于世界而言,你是一个人;但是对于某个人,你是他的整个世界。纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。</p> ~WV"SaA)*U  
</body> IMONgFBS  
</html> }\k"n{!"  
[/code] ,~W|]/b<q  
Dv`c<+q(#  
X)3!_  
复制代码代码如下: ;gr9/Vl  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ^K@C"j?M/  
<html xmlns="//www.w3.org/1999/xhtml"> |LKXOU c  
<head> Nda *L|  
<title></title> `*KHS A  
<style type="text/css"> iAU@Yg`pt  
<!-- bA->{OPkT  
p{font-size:12px;} /&94 eC  
p:first-letter{font-size:300%} #>+HlT  
--> )K    
</style> ?6Y?a2 |  
</head> !C: $?oU  
<body> J7p),[>I<  
<p>对于世界而言,你是一个人;但是对于某个人,你是他的整个世界。纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。</p> M/K5#8Arj  
</body> ^J;bso`  
</html> %bfQ$a:  
uW36;3[f#1  
这段代码对<p>的首字符样式定义在IE6上看是没有效果的(IE7没测试),而在p:first-letter和{font-size:300%}加上空格,也就是p:first-letter {font-size:300%}后,显示就正常了。但是同样的代码,在FireFox下看是正常的。按道理说,p:first-letter{font-size:300%}的写法是没错的。那么问题出在哪里呢?答案是伪类中的连字符”-”。IE有个BUG,在处理伪类时,如果伪类的名称中带有连字符”-”,伪类名称后面就得跟一个空格,不然样式的定义就无效。而在FF中,加不加空格都可以正常处理。
快速回复

限100 字节
安逸网提示:如果您在写长篇帖子又不马上发表,建议存为草稿
 
认证码:
上一个 下一个