您的位置:首页 > Web前端 > CSS

XHTML+CSS兼容性解决方案集

2010-12-16 19:19 225 查看
E6.0,ie7.0与Firefox的CSS兼容性问题

      1.DOCTYPE 影响 CSS 处理

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

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

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

  5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式,值得注意的是,一定要将xxxx !important 这句放置在另一句之上

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

  7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以

     8.FF:    链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和    menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

  9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;}

  注意这两个margin的顺序一定不能写反,!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:div{maring:30px;margin:28px}

  重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;

  10.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}

  11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义ul{margin:0;padding: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同级,之间不能存在嵌套关系,否则会产生异常。

  并且将clear这种样式定义为为如下即可:.clear{

clear:both;}

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

  当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。

  例如某一个wrapper如下定义:.colwrapper{

overflow:hidden;

zoom:1;

margin:5px auto;}

  2、margin加倍的问题。

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

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

例如:

<#div id=/"imfloat/">

  相应的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则会忽略.如下.tabd1{

background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/

background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}

  值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过 IE7.0出来了,对CSS的支持又有新问题。浏览器多了,网页兼容性更差了,疲于奔命的还是我们 ,为解决IE7.0的兼容问题,找来了下面这篇文章:

现在我大部分都是用!important来hack,对于ie6和firefox测试可以正常显示,但是ie7对!important可以正确解释,会导致页面没按要求显示!搜索了一下,找到一个针对IE7不错的hack方式就是使用“*+html”,现在用IE7浏览一下,应该没有问题了。

现在写一个CSS可以这样:

#example { color: #333; } /* Moz */

* html #example { color: #666; } /* IE6 */

*+html #example { color: #999; } /* IE7 */

那么在firefox下字体颜色显示为#333,IE6下字体颜色显示为#666,IE7下字体颜色显示为#999,他们都互不干扰。
区分三款浏览器简单方法:

#example { color: #333; } /* Moz FF */

* html #example { color: #f0f; } /* IE6 */

*+html #example { color: #0ff; } /* IE7 */

马上试了一下,效果很好,不过有句要补充一下!

在兼容IE7的*+html的hack一定要在顶部加入DTD声明,否则无效

将下面这句声明加入下面可运行的html的顶部,就可以看到效果拉~当然要保证你的浏览器是IE7

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 

关于脚本,在xhtml1.1中不支持language属性,只需要把代码改为:

<script    type="text/javascript">

 

======================================================

区分三款浏览器简单方法:
#example { color: #333; } /* Moz FF */
* html #example { color: #f0f; } /* IE6 */
*+html #example { color: #0ff; } /* IE7 */

马上试了一下,效果很好,不过有句要补充一下!
在兼容IE7的*+html的hack一定要在顶部加入DTD声明,否则无效
将下面这句声明加入下面可运行的html的顶部,就可以看到效果拉~当然要保证你的浏览器是IE7
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 

效果不一样?
因为不同浏览器对于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;
}
重复定义盒模型的高度属性,越后面优先级越高,所以浏览器解析出的结果就是高度为300px。

4.如何做到让IE6.0与FF兼容?
最常用的一种方法了,也是屡试不爽的——“!important”,这个字段是用来提高优先级的,而IE6.0对于找个字段是无法识别的,于是FF与IE6.0就可以分开解析了。例如,在IE下显示red,FF下显示blue,只需要这么写
color {
background-color:blue !important;
background-color:red;
}
“!important”FF可以识别,blue那行提高优先级,因此在FF中blue优先级高于red,显示为蓝色

IE6.0将上面的样式识别成
color {
background-color:blue;
background-color:red;
}
red优先级高,所以显示为红色。

切记,上下两句的位置一定不能颠倒。问为什么的再好好看看上两个问题,再不明白就面壁去....

5.如何做到让更低版本IE兼容?
其实我认为做到IE6.0与FF2.0已经足够,5.5的兼容用“ /**/” 5.0的兼容用“>”,具体我就不说了,说实在我也不大懂,大家可以去google一下

6.如何做到IE7.0兼容?
这个问题我也要问大家,大家有答案的告诉我,因为新版的IE7.0对于“!important”具有识别能力,可是对于盒以及padding等的解析却和IE6.0差不多,于是乎,完全兼容了IE6.0和FF2.0的就似乎兼容不了IE7.0,捣腾了好久,还是不知道怎么办。请大家帮帮忙!

7.css对浏览器兼容应做到完全一致吗?
个人认为在满足可读性的原则和不影响整体布局的前提下,界面有些许的位置不同是可以允许的,要在不同浏览器下做到一模一样,那真是太费劲了。
区分三款浏览器简单方法:
#example { color: #333; } /* Moz FF */
* html #example { color: #f0f; } /* IE6 */
*+html #example { color: #0ff; } /* IE7 */

马上试了一下,效果很好,不过有句要补充一下!
在兼容IE7的*+html的hack一定要在顶部加入DTD声明,否则无效
将下面这句声明加入下面可运行的html的顶部,就可以看到效果拉~当然要保证你的浏览器是IE7
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 

效果不一样?
因为不同浏览器对于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;
}
重复定义盒模型的高度属性,越后面优先级越高,所以浏览器解析出的结果就是高度为300px。

4.如何做到让IE6.0与FF兼容?
最常用的一种方法了,也是屡试不爽的——“!important”,这个字段是用来提高优先级的,而IE6.0对于找个字段是无法识别的,于是FF与IE6.0就可以分开解析了。例如,在IE下显示red,FF下显示blue,只需要这么写
color {
background-color:blue !important;
background-color:red;
}
“!important”FF可以识别,blue那行提高优先级,因此在FF中blue优先级高于red,显示为蓝色

IE6.0将上面的样式识别成
color {
background-color:blue;
background-color:red;
}
red优先级高,所以显示为红色。

切记,上下两句的位置一定不能颠倒。问为什么的再好好看看上两个问题,再不明白就面壁去....

5.如何做到让更低版本IE兼容?
其实我认为做到IE6.0与FF2.0已经足够,5.5的兼容用“ /**/” 5.0的兼容用“>”,具体我就不说了,说实在我也不大懂,大家可以去google一下

6.如何做到IE7.0兼容?
这个问题我也要问大家,大家有答案的告诉我,因为新版的IE7.0对于“!important”具有识别能力,可是对于盒以及padding等的解析却和IE6.0差不多,于是乎,完全兼容了IE6.0和FF2.0的就似乎兼容不了IE7.0,捣腾了好久,还是不知道怎么办。请大家帮帮忙!

7.css对浏览器兼容应做到完全一致吗?
个人认为在满足可读性的原则和不影响整体布局的前提下,界面有些许的位置不同是可以允许的,要在不同浏览器下做到一模一样,那真是太费劲了。
IE6和FF中用! important声明可以提高优先级别,但在IE6中的!important声明并不是绝对的,它会被之后的同名属性定义所替换。也就是说在上面的例子中,IE6所应用的是最后一个背景色的值,即“blue”;而在FF中背景色的值为“red”。根据这一点,我们就可以把FF和IE的样式分离开。

E1{
background-color: red;
>background-color: blue;
}

     在FF中得到的是背景色红色,而在IE中得到的背景色是蓝色,根据样式重定义的规则,如果浏览器可以识别“>”,则应该得到的蓝色的背景,因此可以知道“>”只有IE可以识别,这点是很重要的哦!在后面大家就会知道了。(注:我测试过其它的一些符号,如“~”、“`”、“<”等,都只有IE可以识别,在此为了感谢首次发现者嘟嘟,推荐使用“>”)

E1{
>/*IE only*/background-color: black;
>/*IE only*/background-color /*IE5.5*/: green;
}

这个例子在IE6中得到了黑色的背景;而在IE5.5中得到的绿色的背景;在IE5中也得到了黑色的背景。这就说明了第二句定义只有IE5.5能识别,这是个很早就公布的HACK,可以在网上找到相关的资料,要注意的就是在属性名之后是有一个空格的。到此我们已经把FF、IE5.5、IE6分离出来了,那IE5呢?其实现在我们只要把IE5跟IE6分开就OK了,来看看例子:

E1{
>/*IE only*/background-color: red;/*IE5*/
}
E1/*IE5.5+*/{
>/*IE only*/background-color: black;
}

这里我们又用到一个HACK,就是“E1/**/{}”,这个定义在IE5以上的版本才能识别出来。这个例子得到的结果是,在IE5中的背景色为红色;在IE5以上版本中得到的是黑色背景。
终于把不同版本的浏览器都分离出来了,这样我们就可以为不同的浏览器定义不同的样式了。来看个完整的例子:

E1{
width: 500px;
height: 50px;
background-color: red !important;/*FF*/
background-color: blue;/*IE5*/
text-align:center;
}
E1/*IE5.5+*/{
>/*IE only*/background-color: black;/*IE6*/
>/*IE only*/background-color /*IE5.5*/: green;
}

需要注意的是,在上面例子中“background-color”定义的顺利不能改变,即FF-IE5-IE6-IE5.5。对于IE的定义在属性前要加“>”,因为“E1/**/{}”这个HACK在FF中可以识别。也许你会想,上面的例子不是可以写成:

E1{
width: 500px;
height: 50px;
background-color: red;/*FF*/
>background-color: blue;/*IE5*/
text-align:center;
}
E1/*IE5.5+*/{
>/*IE only*/background-color: black;/*IE6*/
>/*IE only*/background-color /*IE5.5*/: green;
}

这样不就又可以省下几个字节?是没错,可是HACK不是标准,如果滥用HACK,那只会离标准越来越远!

一句话总结:IE6和FF中用!important提升优先级;
            IE5以上的版本要加/**/;
            IE5.5在属性名后加空格;
            IE认识特殊符号(> . <等)


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  css xhtml ie 浏览器 html div