前端开发浏览器兼容性问题

web前端开发php视频教程下载 黑马前端开发视频教程下载 前端开发flex教程

W3C对标准的推进,Firefox,Chrome,Safari,Opera的出现,结束了IE雄霸天下的日子。

然而,这对开发者来说,是好事,也是坏事。

说它是好事,是因为浏览器厂商为了取得更多的市场份额,会促使各浏览器更符合W3C标准,而得到更好的兼容性,并且,不同浏览器的扩展功能(例如 -moz,-webkit开头的样式),对W3C标准也是个推进;说它是坏事,因为,多个浏览器同时存在,这些浏览器在处理一个相同的页面时,表现有时会有差异。这种差异可能很小,甚至不会被注意到;也可能很大,甚至造成在某个浏览器下无法正常浏览。我们把引起这些差异的问题统称为“浏览器兼容性问题”。而正是这些“浏览器兼容性问题”,无形中给我们的开发增加了不少难度。

从浏览器内核的角度 来看,浏览器兼容性问题可分为以下三类:

  1. 渲染相关:和样式相关的问题,即体现在布局效果上的问题。(http://www.cnblogs.com/duanhuajian/archive/2012/09/23/2699119.html
  2. 脚本相关:和脚本相关的问题,包括JavaScript和DOM、BOM方面的问题。对于某些浏览器的功能方面的特性,也属于这一类。
  3. 其他类别:除以上两类问题外的功能性问题,一般是浏览器自身提供的功能,在内核层之上的。

在各个浏览器中都表现的不同,这就属于兼容性问题。

造成浏览器兼容性问题的根本原因就是浏览器各浏览器使用了不同的内核,并且它们处理同一件事情的时候思路不同。

现今常见的浏览器及其排版引擎(又称渲染引擎)及脚本引擎;

而造成浏览器兼容性问题的常见原因则是设计师写出了不规范的代码,不规范的代码会使不兼容现象更加突出。

例如:
不规则的嵌套:
[/p]html code<div> <li>新闻标题一</li> <li>新闻标题一</li> <li>新闻标题一</li></div>
[p]DIV 中直接嵌套 LI 元素是不合标准的,LI 应该处于 UL 内。此类问题常见的还有 P 中嵌套 DIV, TABLE等元素。

不规范的DOM接口和属性设置:[/p]JScript codedocument.all.a_name.style.top=35;

[p]上面代码中top的值,其实应该是一个字符串值,需有单位。例如:35px。

总之,人为的原因也占很大一部分。而人为造成兼容性问题的原因,除了粗心之外,大都源于浏览器bug的存在,和开发者对标准的不了解。

比如,如果要做一个功能,功能是想让鼠标悬停在 IMG 元素上方时,可以出现提示信息,经常针对 IE 做开发的人,可能会使用 IMG 元素的 “alt” 属性,但其他浏览器中就是不给 ‘alt’ 属性面子。因为 W3C 标准中规定要去做这件事的属性是 ”title“,大多浏览器符合标准,IE 不符合,这是 IE 浏览器内核的问题;开发者不知道 ”title“ 才是正解,不遵循标准去写代码,是开发者的问题。所以,一个问题分两半,浏览器和开发者都有责任。

既然都有责任,就都有义务去解决兼容性问题。那么,从浏览器的角度来讲,它的厂商应该修复浏览器的bug和不合标准的地方,当某一天 IE 的 ”alt“ 不能用于提示了,还有人用这个错误的属性去显示提示么? 从开发者角度来讲,多了解标准,了解浏览器兼容性问题,就可以在开发的过程中,有效的避开兼容性问题,让你的页面在所有浏览器中畅通无阻。

废话少说,下面就讲讲如何有效的避免一些兼容性问题。

概括来说,避免兼容性问题的有效途径就是:正确的使用 DTD,书写符合 W3C 规范的代码。

那什么叫做 DTD 呢,DTD是做什么的和为什么要写DTD呢?DTD 是 Document Type Definition 的缩写,是文档类型定义。定义上说“此标签可告知浏览器文档使用哪种 html 或 XHTML 规范”。

那其中所说的规范又是什么呢?我们平时所说的规范大部分情况下就指的是 W3C 制定的规范,做web前端开发的时候主要接触其中的HTML、css、DOM、XML部分。顺便说一下,W3C的网站现在已经提供可校验HTML和css 代码的工具了,不知道的同学可以看一下:http://validator.w3.org/ 这个是校验HTML和XHTML的,http://jigsaw.w3.org/css-validator/ 这是校验css样式表的。

DTDW3C校验浏览器解析 之间有啥关系?简单地说:W3C校验将检查DTD与文档内容是否匹配;浏览器将根据DTD决定启用何种渲染模式。

后面半句就是说,写了正确的DTD,浏览器就会按照标准方式(Standards mode)渲染和解析你的页面,那如果不写或者写错呢,那浏览器就会使用怪癖模式(Quirks mode)来渲染和解析你的页面。怪癖模式的产生的主要原因大概是为了向后兼容,就是为了使那些很早之前(IE 6之前的时代)的网页看上去跟原来的样子差不多。

下面有一个直观的例子。

其中,牌子是DTD,水果什么的是文档真实内容,对号和差是W3C代码检测,动植物是浏览器模式。

W3C校验将检查DTD与文档内容是否匹配,发现有的对不上号,会给出提示:

浏览器运行的时候,浏览器将根据DTD决定启用何种渲染模式,不会管你写的正确与否,按照你写的方式渲染:

如何判断一个DTD是写得对不对?或者想知道现在的DTD在各个浏览器下到底会触发哪种渲染模式?来这里http://hsivonen.iki.fi/doctype/ 核对一下就行。网页的靠下部分有个红红绿绿的表,自己对照一下好了。

另外补充两点个人经验:

  1. 正确的使用DTD,并书写符合W3C规范的代码,虽然现在你即使做到这两点也不能保证所有浏览器都会表现一直,但可以最大程度上避免很多兼容性问题。
  2. 推荐使用 HTML5 的 DTD,好写好记:<!DOCTYPE html>,可以触发各浏览器的 Standards Mode。但是,问题又来了,这样做一定就能解决问题了吗? 不一定,但是这样可以避免很多问题。比如,IE的盒模型bug等,都可以通过此手段避免。另外有一些是浏览器的bug,无法解决的。比如,在Firefox中,TABLE 里的绝对定位元素的定位问题,再比如IE早期版本对 ‘!important’ 的支持缺陷等。

    这时候,就要采取一些非凡的手段了。

    一种是在js里用浏览器判断,针对不同的浏览器做不同的处理;另一种,css hack。

    在使用css hack 的时候注意,css hack一定要是丑陋的,时刻提醒自己,那是不得已而为之的解决方式。

    总而言之,正确的使用DTD、并书写符合W3C规范的代码 + 使用其他手段……,这些都不能完全避免浏览器的不兼容问题。

    浏览器兼容性问题的“解决”需要浏览器开发商、W3C、开发者共同的努力才能实现。

    而作为开发者,我们要做的,就是尽量了解标准,熟悉各浏览器的Bug和特性,灵活设计页面功能,才可以避免出现浏览器兼容性问题。[/p]

[code]<font color=”#333333″><font face=”Arial”>做BS开发就难免会用到javascript,而每个浏览器对javascript的支持有不同。这就需要我们程序员去兼容他们,不然有些浏览器就无法运行我们的代码。就会造来客户的投诉,如果让BoSS知道了,这可不太好哦。下面是兼容IE和FF的js脚本做法和分解(部分选自网上):

.以下以 IE 代替 Internet Explorer,以 MF/FF 代替 Mozzila Firefox
//window.event
IE:有window.event对象
FF:没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event)
//鼠标当前坐标
IE:event.x和event.y。
FF:event.pageX和event.pageY。
通用:两者都有event.clientX和event.clientY属性。
//鼠标当前坐标(加上滚动条滚过的距离)
IE:event.offsetX和event.offsetY。
FF:event.layerX和event.layerY。
//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的兼容性问题。
//event.toElement问题
问题:
IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性
解决方法:
var target = e.relatedTarget || e.toElement;
//标签的x和y的坐标位置:style.posLeft 和 style.posTop
IE:有。
FF:没有。
通用:object.offsetLeft 和 object.offsetTop。
//窗体的高度和宽度
IE:document.body.offsetWidth和document.body.offsetHeight。注意:此时页面一定要有body标签。
FF:window.innerWidth和window.innerHegiht,以及document.documentElement.clientWidth和document.documentElement.clientHeight。
通用:document.body.clientWidth和document.body.clientHeight。
//添加事件
IE:element.attachEvent(“onclick”, function);。
FF:element.addEventListener(“click”, function, true)。
通 用:element.onclick=function。虽然都可以使用onclick事件,但是onclick和上面两种方法的效果是不一样的,onclick 只有执行一个过程,而attachEvent和addEventListener执行的是一个过程列表,也就是多个过程。例如:element.attachEvent(“onclick”, func1);element.attachEvent(“onclick”, func2)这样func1和func2都会被执行。
//标签的自定义属性
IE:如果给标签div1定义了一个属性value,可以div1.value和div1[“value”]取得该值。
FF:不能用div1.value和div1[“value”]取。
通用:div1.getAttribute(“value”)。
//document.form.item 问题
IE:现有问题:现有代码中存在许多 document.formName.item(“itemName”) 这样的语句,不能在 MF 下运行
FF/IE: document.formName.elements[“elementName”]
//集合/数组类对象问题
(1)现有问题:
现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
(2)解决方法:
改用 [] 作为下标运算。如:document.forms(“formName”) 改为 document.forms[“formName”]。
又如:document.getElementsByName(“inputName”)(1) 改为 document.getElementsByName(“inputName”)[1]
//HTML 对象的 id 作为对象名的问题
(1)现有问题
在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
(2)解决方法
用 getElementById(“idName”) 代替 idName 作为对象变量使用
//用idName字符串取得对象的问题
(1)现有问题
在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
(2)解决方法
用 getElementById(idName) 代替 eval(idName)。
//变量名与某 HTML 对象 id 相同的问题
(1)现有问题
在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
(2)解决方法
在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
//document.getElementsByName() 和 document.all[name] 的问题
现有问题:在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。
//document.all
Firefox可以兼容document.all, 但会生成一条警告。可以用getElementById(““) 或者 getElementByTagName(““)来代替
不过对于document.all.length等属性,则完全不兼容
//input.type属性问题
说明:IE下input.type属性为只读;但是Firefox下input.type属性为读写
//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来访问父窗口. 例如:var parWin = window.opener; parWin.document.getElementById(“Aqing”).value = “Aqing”;
//frame问题
以下面的frame为例:
<frame src=”xxx.html” mce_src=”xxx.html” id=”frameId” name=”frameName” />
(1)访问frame对象:
IE:使用window.frameId或者window.frameName来访问这个frame对象. frameId和frameName可以同名。
FF:只能使用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来访问父窗口。例如:window.parent.document.form1.filename.value=”Aqing”;
//body问题
Firefox的body在body标签没有被浏览器完全读入之前就存在;而IE的body则必须在body标签被浏览器完全读入之后才存在
//事件委托方法
IE:document.body.onload = inject; //Function inject()在这之前已被实现
FF:document.body.onload = inject();
//firefox与IE的父元素(parentElement)的区别
IE:obj.parentElement
FF:obj.parentNode
解决方法: 因为FF与IE都支持DOM,因此使用obj.parentNode是不错选择
//innerText在IE中能正常工作,但是innerText在FireFox中却不行. 需用textContent
//FireFox中设置HTML标签的style时,所有位置性和字体尺寸的值必须后跟px。这个ie也是支持的
//父节点、子节点和删除节点
IE:parentElement、parement.children,element.romoveNode(true)。
FF:parentNode、parentNode.childNodes,node.parentNode.removeChild(node)。
//对select的options集合操作
枚举元素除了[]外,SelectName.options.item()也是可以的, 另外SelectName.options.length, SelectName.options.add/remove都可以在两种浏览器上使用。
注意在add后赋值元素,否则会失败
动态删除select中的所有options:
document.getElementById(“ddlResourceType”).options.length=0;
动态删除select中的某一项option:
document.getElementById(“ddlResourceType”).options.remove(indx);
动态添加select中的项option:
document.getElementById(“ddlResourceType”).options.add(new Option(text,value));
IE FF 动态删除通用方法:
document.getElementById(“ddlResourceType”).options[indx] = null;
//捕获事件
问题:
FF没有setCapture()、releaseCapture()方法
解决方法:
IE:
obj.setCapture();
obj.releaseCapture();
FF:
window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
if (!window.captureEvents) {
o.setCapture();
}else {
window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
}
if (!window.captureEvents) {
o.releaseCapture();
}else {
window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
}

//禁止选取网页内容
问题:
FF需要用CSS禁止,IE用js禁止
解决方法:
IE: obj.onselectstart = function() {return false;}
FF: -moz-user-select:none;

//画图
IE:VML。
FF:SVG。
//CSS:透明
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
FF:opacity:0.6。
//CSS:圆角
IE:不支持圆角。
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;。
//CSS:双线凹凸边框
IE:border:2px outset;。
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;。
</font></font>[/code]
[color=rgb(51, 51, 51)]初学html和css时,每天切图,总会遇到很多浏览器兼容性问题。最近一直关注移动平台开发,就html和css来说,不用考虑那么多浏览器兼容性问题。到现在,以至于很多浏览器兼容性几乎忘光了。今天把以前总结的知识拿来分享一下,顺便自己也复习一下。当然,其中肯定有很多不足,望指正啊。

1 ie6.0横向margin加倍产生因素:块属性、float、有横向margin。
解决方法:display:inline;
2 ie6.0下默认有行高解决方法:overflow:hidden;或font-size:0;或line-height:xx px;
3 在各个浏览器下img有空隙(原因是:回车。)解决方法:让图片浮动。
4 一个父标签与几个子标签嵌套,父标签不浮动,子标签float,子标签不撑开父的高度。解决方法:a 在子标签最后清浮动{<div style=”height:0;clear:both;”>&nbsp;</div>}
b 父标签添加{overflow:hidden;}
c 给父标签设置高度
5 Ie6下,不识别最大宽、高度和最小宽高度,意即min-width/height和 Max-width/height在ie6中没效果,解决方法:(1):.abc{border:1px blue solid;width:200px;height:200px;}
html>body .abc{width:auto;height:auto;min-width:200px;min-height:200px;}
(2):.abc{width:200px;height:200px;_width:200px;_height:200px;}(因为ie6有一个特征,当定义一个高度时,如果内容超过高度,元素会自动调整高度。)
6 Ie6里面:如li设宽、高,并且li里面的标签浮动,那么li之间会有间距解决方法:li不设宽、高或者li内的标签不浮动
7 当li浮动,ul/ol没有浮动且ul/ol设置padding-top时,li之间会有间距,间距值为padding-top的值。解决方法:让ul/ol浮动,或者为ul/ol设置高度值。
8 3像素问题:ie6下,当浮动元素与流动元素并列显示时,他们之间会存在三像素问题。 解决方法:用hack技术, 例如:所有浏览器通用 height:100px;
ie6专用_height:100px;
ie7专用+height:100px;
ie6/ie7共用
height:100px;
9 当定义行内元素为包含框时,且包含框包含的绝对定位元素以百分比为单位进行定位时,会出现混乱。 解决方法:在行内元素里加入{zoom:1;}
10 当多个浮动元素中间夹杂着HTML注释语句时,如果浮动元素宽度为100%,则在下一行多显示一个上一行最后一个字符。 解决办法:给浮动元素添加display:inline;。
11 opacity 定义元素的不透明度 filter:alpha(opacity=80);/ie支持该属性/
opacity:0.8;/支持css3的浏览器/
[/color]
12 两个块元素,竖向的margin值不增加,会重叠,其间距为最大margin值。**13 优先级:被!important 注明的css属性具有最高优先级(.abc{color:red !important;})。但在ie6中!important具有一个bug:在同一组css属性中,!important不起作用。**14 火狐不识别background-position-y 或background-position-x;

15 ie6 不支持 fixed

/对于非IE6可以这样写/#top{ position:fixed; bottom:0; right:20px; } /但是IE6是不支持fixed定位的,需要另外重写/#top{ position:fixed; _position:absolute; top:0; right:20px; _bottom:auto; _top:expression(eval(document.documentElement.scrollTop));} /使用hack使IE6实现该效果,但这个东东会闪烁,需要以下代码/html{ background-image:url(about:blank); background-attachment:fixed; } /使固定在顶部/#top{ _position:absolute; _bottom:auto; _top:expression(eval(document.documentElement.scrollTop)); } /固定在底部/#top{ _position:absolute; _bottom:auto; _top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop)||0)-(parseInt(this.currentStyle.marginBottom)||0))); } /垂直居中/#top{ position:fixed; top:50%; margin-top:-50px; _position:absolute; _top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight/2)); }

16 解决 ie6 最大、最小宽高 hack方法
/ 最小宽度 /.min_width{ min-width:300px; _width:expression(parseInt(this.clientWidth) < 300 ? “300px” : this.clientWidth);}/ 最大宽度 /.max_width{ max-width:600px; _width:expression(parseInt(this.clientWidth) > 600 ? “600px” : this.clientWidth);}/ 最小高度 /.min_height{ min-height:200px; _height:expression(parseInt(this.clientHeight) < 200 ? “200px” : this.clientHeight);}/ 最大高度 */.max_height{ max-height:400px; _height:expression(parseInt(this.clientHeight) > 400 ? “400px” : this.clientHeight);}

17 z-index不起作用的 bug1)ie6下 首先讲讲第一种z-index无论设置多高都不起作用情况。这种情况发生的条件有三个:1、父标签position属性为relative;2、问题标签含有浮动(float)属性。
2)所有浏览器:它只认第一个爸爸
层级的高低不仅要看自己,还要看自己的老爸这个后台是否够硬。用术语具体描述为:
父标签position属性为relative或absolute时,子标签的absolute属性是相对于父标签而言的。而在IE6下,层级的表现有时候不是看子标签的z-index多高,而要看它们的父标签的z-index谁高谁低。

18 ie各个版本hack
/类内部hack:/ .header {_width:100px;} / IE6专用/ .header {+width:100px;} / IE7专用/ .header {width:100px;} / IE6、IE7共用/ .header {width:100px;} / IE8、IE9共用/ .header {width:100px9;} / IE6、IE7、IE8、IE9共用/ .header {width:330px9;} / IE9专用//选择器Hack:/ html .header{} /IE6/ +html .header{} /IE7/

前端开发免费视频教程下载 前端开发教程\\ 哪里有前端开发的免费视频教程

赞(0)
前端开发者 » 前端开发浏览器兼容性问题
64K

评论 抢沙发

评论前必须登录!