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

网页设计-[ie与firefox的css兼容问题整理!]

2008-11-17 12:04 639 查看
以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox

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

  关于这个/**/是什么我也不太明白,只知道ie5和firefox都支持但ie6不支持,如果有人理解的话,请告诉我一声,谢了!:)

  11.ul标签在mozilla中默认是有padding值的,而在ie中只有margin有值所以先定义ul{margin:0;padding:0;}就能解决大部分问题。

常见兼容问题2:

ie box-model这个臭名昭著的bug存在于ie6/win以前的每一只版本,这个虫子直到tantak发布了流传最为广泛的那个hack才开始被驯服
http://www.tantek.com/css/examples/boxmodelhack.html
ie5.x/win对box-model的解析是一样的,他们认为width包括了边框(border)和补白(padding),幸运的是这个情况在ie6中有了好转,但是ie6在向后兼容的同时也包容了以前的错误,ie6其实有两个核心,在旧的页面前他仍旧表现出对错误的宽容,只有在文档中严格地加上文档类型(doctype)声明,ie6才能够接受正确的box-model

所以,tantak的hack必须和正确的doctype同时包含在文档中才能够正常工作

div.content {
width:400px; //这个是错误的width,所有浏览器都读到了
voice-family: “\”}\””; //ie5.x/win忽略了”\”}\””后的内容
voice-family:inherit;
width:300px; //包括ie6/win在内的部分浏览器读到这句,新的数值(300px)覆盖掉了旧的
}
html>body .content { //html>body是css2的写法
width:300px; //支持css2该写法的浏览器有幸读到了这一句
}

现在回到主题,我们经常看到!important和(空格)/**/:组合在一起使用,这个写法有什么奥妙呢?

看刚才那个写法,我这里可以提供另一种写法也能达到这样的效果

div.content {
width:300px !important; //这个是正确的width,大部分支持!important标记的浏览器使用这里的数值
width(空格)/**/:400px; //ie6/win不解析这句,所以ie6/win仍然认为width的值是300px;而ie5.x/win读到这句,新的数值(400px)覆盖掉了旧的,因为!important标记对他们不起作用
}
html>body .content { //html>body是css2的写法
width:300px; //支持css2该写法的浏览器有幸读到了这一句
}

同样,这个方法仍必须依靠正确的文档类型声明才能够正常工作,原因在前面已经说过。

文档类型声明就像一个开关,打开向后兼容的未来,而错误使用的话,就是一个pandora box

注意事项:
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 这句放置在另一句之上,上面已经提过。

其他:
注:ie都能识别*;标准浏览器(如firefox,opera,netscape)不能识别*;ie6能识别*,但不能识别 !important,ie7能识别*,也能识别!important;ff不能识别*,但能识别!important;

写两句代码来控制一个属性,区别firefox与ie6:
background:orange;*background:blue;

//这一句代码写出来时,你用firefox或其它非ie浏览时,会发现,写了该代码的区域背景是橙色的,如果用ie浏览,却是蓝色的,这是因为ie都能识别*;标准浏览器(如firefox,opera,netscape)不能识别*;

写两句代码来控制一个属性,区别ie7与ie6:
background:green !important;background:blue;

//这一句代码写出来时,你用ie7浏览,会发现,写了该代码的区域背景是绿色的,如果用ie6浏览,却是蓝色的,这是因为ie7能识别!important*,一但识别了,就执行,忽略了后面的那一句,但ie6却不能识别!important,所以前面部分跳过,直接执行了后半部份。

写两句代码来控制一个属性,区别firefox与ie:
background:orange; *background:green;

//这一句代码写出来时,你用firefox浏览,会发现背景是橙色的,而ie里却是绿色的,很简单,因为firefox不能识别*,而ie6,ie7都可以识*

写三句代码来控制一个属性,区别firefox,ie7,ie6:
background:orange;*background:green !important;*background:blue;

//这一句会使在firefox在,背景呈橙色,ie7中为绿色,ie6中为蓝色,道理和前面一样,firefox不能识别*,所以后面两句都不执行,直接执行第一句,ie7当然也能执行第一行代码,但是因为第二句,他也能识别,所以就执行了第二句代码,把前面的效果给过滤了,而最后一句,ie7是不能识别的。ie6不能识别!imprtant,本来运行了第一句代码了,第二句不能识别,那就理所当然的执行了最后一句。

以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox

  1. document.form.item 问题

  (1)现有问题:

  现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 MF 下运行

  (2)解决方法:

  改用 document.formName.elements["elementName"]

  (3)其它

  参见 2

  2. 集合类对象问题

  (1)现有问题:

  现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。

  (2)解决方法:

  改用 [] 作为下标运算。如:document.forms("formName") 改为 document.forms["formName"]。

  又如:document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]

  (3)其它

  3. window.event

  (1)现有问题:

  使用 window.event 无法在 MF 上运行

  (2)解决方法:

  MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:

  原代码(可在IE中运行):

<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>

  新代码(可在IE和MF中运行):

<input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>

  此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。

 4. HTML 对象的 id 作为对象名的问题

  (1)现有问题

  在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。

  (2)解决方法

  用 getElementById("idName") 代替 idName 作为对象变量使用。

  5. 用idName字符串取得对象的问题

  (1)现有问题

  在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。

  (2)解决方法

  用 getElementById(idName) 代替 eval(idName)。

  6. 变量名与某 HTML 对象 id 相同的问题

  (1)现有问题

  在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。

  (2)解决方法

  在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。

  此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。

  (3)其它

  参见 问题4

  7. event.x 与 event.y 问题

  (1)现有问题

  在IE 中,event 对象有 x, y 属性,MF中没有。

  (2)解决方法

  在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。

  故采用 event.clientX 代替 event.x。在IE 中也有这个变量。

  event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。

  如果要完全一样,可以稍麻烦些:

  mX = event.x ? event.x : event.pageX;

然后用 mX 代替 event.x

  (3)其它

  event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。

8. 关于frame

  (1)现有问题

  在 IE中 可以用window.testFrame取得该frame,mf中不行

  (2)解决方法

  在frame的使用方面mf和ie的最主要的区别是:

  如果在frame标签中书写了以下属性:

  <frame src="xx.htm" id="frameId" name="frameName" />

  那么ie可以通过id或者name访问这个frame对应的window对象

  而mf只可以通过name来访问这个frame对应的window对象

  例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问

  ie: window.top.frameId或者window.top.frameName来访问这个window对象

  mf: 只能这样window.top.frameName来访问这个window对象

  另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签

  并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容

  也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容

 关于frame和window的描述可以参见bbs的‘window与frame’文章

  以及/test/js/test_frame/目录下面的测试

  9. 在mf中,自己定义的属性必须getAttribute()取得

  10.在mf中没有 parentElement parement.children 而用

  parentNode parentNode.childNodes

  childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。

  一般可以通过node.getElementsByTagName()来回避这个问题。

  当html中节点缺失时,IE和MF对parentNode的解释不同,例如

  <form>
  <table>
  <input/>
  </table>
  </form>

  MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

  MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

  11.const 问题

  (1)现有问题:

  在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。

  (2)解决方法:

  不使用 const ,以 var 代替。

  12. body 对象

  MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

  13. url encoding

  在js中如果书写url就直接写&不要写&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';

  frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器

  一般会服务器报错参数没有找到

  当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&

  一般MF无法识别js中的&

  14. nodeName 和 tagName 问题

  (1)现有问题:

  在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象

  有问题(具体情况没有测试,但我的IE已经死了好几次)。

  (2)解决方法:

  使用 tagName,但应检测其是否为空。

15. 元素属性

  IE下 input.type属性为只读,但是MF下可以修改

  16. document.getElementsByName() 和 document.all[name] 的问题

  (1)现有问题:

  在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: