轩枫阁

首页 / Web前端 / CSS / CSS 和JavaScript 在ie6 ie7 ie8和Firefox下bug兼容解决记录

CSS 和JavaScript 在ie6 ie7 ie8和Firefox下bug兼容解决记录

居中问题

div里的内容,IE默认为居中,而FF默认为左对齐

可以尝试增加代码margin:auto

 

高度问题

两上下排列或嵌套的div,上面的div设置高度(height),如果div里的实际内容大于所设高度,在FF中会出现两个div重叠的现象;但在IE中,下面的div会自动给上面的div让出空间。

所以为避免出现层的重叠,高度一定要控制恰当,或者干脆不写高度,让他自动调节,比较好的方法是 height:100%;

但当这个div里面一级的元素都float了的时候,则需要在div块的最后,闭和前加一个沉底的空div,对应CSS是:

 

clear:both;

不想受到float浮动的,就在div中写入clear:both;

 

IE浮动 margin 产生的双倍距离

padding 问题

FF设置 padding 后,div会增加 height 和 width,但IE不会 (* 标准的 XHTML1.0 定义 dtd 好像一致了)

高度控制恰当,或尝试使用 height:100%;

宽度减少使用 padding

但根据实际经验,一般FF和IE的 padding 不会有太大区别,div 的实际宽 = width + padding ,所以div写全 width 和 padding,width 用实际想要的宽减去 padding 定义

 

div嵌套时 y 轴上 padding 和 marign 的问题

FF里 y 轴上 子div 到 父div 的距离为 父padding + 子marign

IE里 y 轴上 子div 到 父div 的距离为 父padding 和 子marign 里大的一个

FF里 y 轴上 父padding=0 且 border=0 时,子div 到 父div 的距离为0,子marign 作用到 父div 外面

 

padding,marign,height,width 的傻瓜式解决技巧

注意是技巧,不是方法:写好标准头

高尽量用padding,慎用margin,height尽量补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div

宽尽量用margin,慎用padding,width算准实际要的减去padding

 

ul 标签在FF中默认是有 padding 值的,而在IE中只有margin有值

先定义 ul {margin:0;padding:0;}

 

ul和ol列表缩进问题

消除ul、ol等列表的缩进时,样式应写成: {list-style:none;margin:0px;padding:0px;}

 

display:block,inline 两个元素

 display:block 块元素,元素的特点是:

  • 总是在新行上开始;
  • 高度,行高以及顶和底边距都可控制;
  • 宽度缺省是它的容器的100%,除非设定一个宽度
  • <div>,<p>,<h1>,<form>,<ul> 和 <li> 是块元素的例子

 

display:inline 就是将元素显示为行内元素,元素的特点是:

  • 和其他元素都在一行上;
  • 高,行高及顶和底边距不可改变;
  • 宽度就是它的文字或图片的宽度,不可改变。
  • <span>,<a>,<label>,<input>,<img>,<h2> 和 <em> 是 inline 元素的例子

 

鼠标手指状显示

全部用标准的写法 cursor: pointer;

 

背景、图片类background 显示问题

全部注意补齐 width,height 属性

 

背景透明问题

最好两个都写,并将opacity属性放在下面

 

document.form.item 问题

问题:

代码中存在 document.formName.item(“itemName”) 这样的语句,不能在FF下运行

解决方法:

改用 document.formName.elements[“elementName”]

 

集合类对象问题

问题:

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

解决方法:

改用 [] 作为下标运算,例:

 

window.event

问题:

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

解决方法:

FF的 event 只能在事件发生的现场使用,此问题暂无法解决。可以把 event 传到函数里变通解决:

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

问题:

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

解决方法:

使用对象变量时全部用标准的 getElementById(“idName”)

 

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

问题:

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

解决方法:

用 getElementById(“idName”) 代替 eval(“idName”)

 

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

问题:

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

解决方法:

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

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

 

event.x 与 event.y 问题

问题:

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

解决方法:

在FF中,与 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

 

关于frame

问题:

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

解决方法:

 

取得元素的属性

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

 

在FF中没有 parentElement,parement.children 而用 parentNode,parentNode.childNodes

问题:

childNodes 的下标的含义在IE和FF中不同,FF的 childNodes 中会插入空白文本节点

解决方法:

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

问题:

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

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

问题:

FF中节点自己没有 removeNode 方法

解决方法:

必须使用如下方法 node.parentNode.removeChild(node)

 

const 问题

问题:

在IE中不能使用 const 关键字

解决方法:

以 var 代替

 

body 对象

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

这会产生在IE下,文档没有载入完时,在body上appendChild会出现空白页面的问题

解决方法:

一切在body上插入节点的动作,全部在onload后进行

 

url encoding

问题:

一般FF无法识别js中的&

解决方法:

在js中如果书写url就直接写&不要写&

 

nodeName 和 tagName 问题

问题:

在FF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值,在IE中,nodeName 的使用有问题

解决方法:

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

 

元素属性

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

 

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

问题:

在IE中,getElementsByName()、document.all[name] 均不能用来取得 div 元素

是否还有其它不能取的元素还不知道(这个问题还有争议,还在研究中)

 

调用子框架或者其它框架中的元素的问题

框架问题的前端设计师曾做过详细的讲解,简单来说,在IE中,可以用如下方法来取得子元素中的值

在FF中则需要改成如下形式来执行,与IE兼容:

 

对象宽高赋值问题

问题:

FireFox中类似 obj.style.height = imgObj.height 的语句无效

解决方法:

统一使用 obj.style.height = imgObj.height + “px”;

 

innerText的问题

问题:

innerText 在IE中能正常工作,但是 innerText 在FireFox中却不行

解决方法:

在非IE浏览器中使用textContent代替innerText

 

event.srcElement和event.toElement问题

问题:

IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性

解决方法:

 

禁止选取网页内容

问题:

FF需要用CSS禁止,IE用JS禁止

解决方法:

 

捕获事件

问题:

FF没有setCapture()、releaseCapture()方法

解决方法:

IE:

FF:

自定义属性问题

说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;Firefox下,只能使用getAttribute()获取自定义属性.

解决方法:统一通过getAttribute()获取自定义属性.

 

eval(“idName”)问题

说明:

IE下,,可以使用eval(“idName”)或getElementById(“idName”)来取得id为idName的HTML对象;Firefox下只能使用getElementById(“idName”)来取得id为idName的HTML对象.

解决方法:

统一用getElementById(“idName”)来取得id为idName的HTML对象.

 

变量名与某HTML对象ID相同的问题

说明:

IE下,HTML对象的ID可以作为document的下属对象变量名直接使用;Firefox下则不能.Firefox下,可以使用与HTML对象ID相同的变量名;IE下则不能。

解决方法:

使用document.getElementById(“idName”)代替document.idName.最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var,以避免歧义.

 

const问题

说明:

Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量.

解决方法:

统一使用var关键字来定义常量.

 

input.type属性问题

说明:

IE下input.type属性为只读;但是Firefox下input.type属性为读写.

 

window.event问题

说明:

window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用. Firefox必须从源处加入event作参数传递。Ie忽略该参数,用window.event来读取该event。

解决方法:

IE&Firefox:

event.srcElement问题

说明:

IE下,event对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.

解决方法:

使用obj(obj = event.srcElement ? event.srcElement : event.target;)来代替IE下的event.srcElement或者Firefox下的event.target. 请同时注意event的兼容性问题。

 

window.location.href问题

说明:

IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location.

解决方法:

使用window.location来代替window.location.href.

 

模态和非模态窗口问题

说明:

IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能.

解决方法:

直接使用window.open(pageURL,name,parameters)方式打开新窗口。

如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口. 例如:

 

frame问题

以下面的frame为例:

<frame src=”xxx.html” id=”frameId” name=”frameName” />

(1)访问frame对象:

IE:使用window.frameId或者window.frameName来访问这个frame对象. frameId和frameName可以同名。

Firefox:只能使用window.frameName来访问这个frame对象.

另外,在IE和Firefox中都可以使用window.document.getElementById(“frameId”)来访问这个frame对象.

(2)切换frame内容:

在IE和Firefox中都可以使用window.document.getElementById(“testFrame”).src = “xxx.html”或window.frameName.location = “xxx.html”来切换frame的内容.

如果需要将frame中的参数传回父窗口(注意不是opener,而是parent frame),可以在frme中使用parent来访问父窗口。例如:parent.document.form1.filename.value=”Aqing”;

 

body问题

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

 

事件委托方法

 

firefox与IE的父元素(parentElement)的区别

 解决方法:

因为firefox与IE都支持DOM,因此使用obj.parentNode是不错选择.

 

cursor:hand VS cursor:pointer

firefox不支持hand,但ie支持pointer

解决方法: 统一使用pointer

 

innerText在IE中能正常工作,但是innerText在FireFox中却不行. 需用textContent。

解决方法:

FireFox中设置HTML标签的style时,所有位置性和字体尺寸的值必须后跟px。这个ie也是支持的。

 

ie,firefox以及其它浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。

解决方法:

//向table追加一个空行:

 

padding 问题

padding 5px 4px 3px 1px FireFox无法解释简写,必须改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;

 

消除ul、ol等列表的缩进时

样式应写成:list-style:none;margin:0px;padding:0px;

其中margin属性对IE有效,padding属性对FireFox有效

 

CSS透明

 

CSS圆角

 

CSS双线凹凸边框

 

对select的options集合操作

枚举元素除了[]外,SelectName.options.item()也是可以的, 另外SelectName.options.length, SelectName.options.add/remove都可以在两种浏览器上使用。注意在add后赋值元素,否则会失败(本人试验如此)。

 

XMLHTTP的区别

innerHTML的区别

转载自:武方博博客

421/456
423/456

相关文章

文章评论

  • 暂无评论

纸飞机许愿

x

钢琴节奏

请选择弹奏的曲谱

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2

    [返回曲谱列表]