Board logo

标题: ie firefox 兼容CSS的问题 [打印本页]

作者: admin    时间: 2008-1-25 02:44     标题: ie firefox 兼容CSS的问题

CSS对浏览器的兼容性具有很高的要求,通常情况下IE和Firefox(简称FF)存在很大的解析差异,这里介绍一下兼容要点。
4 \" p' `" b( U
% h& N- Y; D, n! V  R9 R9 l  常见的兼容问题:; v- T3 b- l5 b+ \/ v
  H4 h$ G5 g9 ]% ~; x2 b4 p
  1.DOCTYPE 影响 CSS 处理
% |3 j4 y  x1 J7 m5 I
8 M' K7 H! |+ B8 z  2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行$ X' k) V8 k' M4 W- z2 Z1 ]

# R" A, n% E: N( N6 ~; L6 c; \  3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中6 V, h8 e- |0 ]+ _% m. |
; ~3 v  z! u7 U
  4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width; \$ K7 j( O/ I# D
$ F& h1 M, F# W( N8 D- }* o, B
  5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式
0 ?) t" |3 O# C( q  [7 d( F
' Z* R7 O0 m8 }+ Y# Y; w7 G  6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行1 v; P% l3 _) i2 q, m, _5 e
  |! O# z7 H8 n9 F4 v; f. n" m) ]
  7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以$ j) ^: G9 U- ]

2 T. N2 M# {8 P" W6 ^) f3 ~- B% N  8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。  N6 S9 S5 K% R( o

+ C" p2 e# q# F1 f; V0 k  9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法: div{margin:30px!important;margin:28px;}
0 @2 o* H% K) _* N( ~  注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样: div{maring:30px;margin:28px}5 W+ S3 U& g8 ]" D. b' b& \$ N4 `
  重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;
# h  T4 A; ^- F* F: F- J" [5 V" i1 t) Q4 [, c9 l9 m
  10.IE5 和IE6的BOX解释不一致
+ H8 H  j# t5 i$ ], ~4 ~! y  IE5下 div{width:300px;margin:0 10px 0 10px;}# S& q  @* f: Q$ M' s! c0 [  m
  div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改 div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
! A3 n0 c$ a; h& [3 V0 E  关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持
( ^" U- j: w. x' g4 h/ {! ]; }6 {7 i2 ?6 z4 e( W6 G) P8 x
  11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义 ul{margin:0;padding:0;} 就能解决大部分问题
/ G+ h' \: Y! ~7 p% w1 s/ C
1 t- t( q5 E* K% c& H  注意事项:0 I* M2 t& u5 \& h: p7 _8 w

4 V( _# v" o% }) B% T6 M0 @( \  1、float的div一定要闭合。' k. Q& q4 y8 ?3 Z6 ]/ M$ s" c% e

% |3 q" d) m6 L" E. `8 Z) h  例如:(其中floatA、floatB的属性已经设置为float:left;)
# M9 a* g+ E0 f+ k$ S0 ]; Q<#div id="floatA" ></#div>. j) o% M0 u  ]; A
<#div id="floatB" ></#div>9 K: p4 `: u9 c* B4 k
<#div id="NOTfloatC" ></#div>$ S4 j! h$ o/ _6 p) F- ?0 g
  这里的NOTfloatC并不希望继续平移,而是希望往下排。, Y. M* K  w) `7 B
  这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
* S- g; Q4 ?. R1 i, p  在 <#div class="floatB"></#div>
0 D; \' I& z! o) Y, m<#div class="NOTfloatC"></#div>% U# m  p; H7 U2 I+ g" U2 G4 ^. m
  之间加上 <#div class="clear"></#div>
; |2 `+ b9 r* D6 B8 L  这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
. E2 E5 ^* B0 P, Z( S2 t% D  并且将clear这种样式定义为为如下即可: .clear{
, w" @# v+ t: Bclear:both;}8 D9 _1 Z0 d! s% K- k
  此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;9 Z( `  w  t# v! T2 ~
  当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
+ T/ V! [4 L: }- q7 O7 [  例如某一个wrapper如下定义: .colwrapper{% Y3 X) b& I% P3 r
overflow:hidden;2 G: `7 q: U, o4 ~7 N6 ]6 j
zoom:1;
6 ~2 D1 g& X: a7 n. Q" kmargin:5px auto;}
" X& Z7 l  p9 W" @  d, S( E. W7 m9 ?2 Z( U, d+ a5 z+ V6 G" C$ y/ M
  2、margin加倍的问题。$ \3 X- g6 |5 _$ r
/ W8 U6 H% n& f$ Y3 k* R7 C, k
  设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
4 ]% K. |' O( q/ l( @: D* ]- Z/ i  解决方案是在这个div里面加上display:inline;
1 R8 F9 }$ E- v. I例如:
8 D4 x0 H7 f' c( z" j<#div id="imfloat"></#div>5 R& o; n8 }0 j& J/ h9 R& ?
8 t  J0 r" k: y( L

( K& {/ X2 ^; k$ x9 j4 B  相应的css为& r  I; y% j: Z! _
#IamFloat{4 `* c- h9 {9 a/ p' H$ @
float:left;
; I  V; Z  {/ w+ A. g% R5 t( Imargin:5px;/*IE下理解为10px*/
4 `5 s% }4 B3 L. y: e$ s2 I, @display:inline;/*IE下再理解为5px*/}$ A- o1 U  e- E6 _
* q. h- L! h) c) R+ A9 X9 _
  3、关于容器的包涵关系+ L! i5 F, \7 n/ o! b* F" T

- J) d) g$ l) b, t* L  H* I1 i  很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。4 `+ g5 V+ h- F% c/ i
  U5 f0 u8 i0 @' \
  4、关于高度的问题  Y( X8 H9 \( E2 D( I
9 [2 b6 q6 D3 q2 q1 @5 R+ n; D+ v
  如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)* j  J6 ~8 Q% m. r
- q% e4 H; K9 h' N
  5、最狠的手段 - !important;
+ P" Y+ I+ C. f6 |2 m" b

# d  e1 w, `4 u$ K+ t  如果实在没有办法解决一些细节问题,可以用这个方法.FF对于"!important"会自动优先解析,然而IE则会忽略.如下 .tabd1{1 j' Y! M: B8 y
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/$ s$ k% O9 j; t: ^% ~0 L- h
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}9 S1 w- H, Y& w9 K6 i
  值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2