1.兼容性产生的原因
市场上浏览器种类很多,不同浏览器的内核也不尽相同,所以各个浏览器对网页的解析存在一定的差异。
2.浏览器的内核
浏览器内核主要分为两种,一是渲染引擎,另一个是js 引擎,内核更加倾向于说渲染引擎。
常见的浏览器内核:
常见的浏览器内核可以分四种:Trident、Gecko、Blink、Webkit
IE浏览器 Trident内核,也成为IE内核
Chrome浏览器 Webkit内核,现在是Blink内核
Firefox浏览器 Gecko内核,俗称Firefox内核
Safari浏览器 Webkit内核
Opera浏览器 最初是自己的Presto内核,后来加入谷歌大军,从Webkit又到了Blink内核;
360浏览器 IE+Chrome双内核
猎豹浏览器 IE+Chrome双内核
百度浏览器 IE内核
QQ浏览器 Trident(兼容模式)+Webkit(高速模式)
3.常见的兼容性问题
1、不同浏览器的标签默认的外补丁( margin )和内补丁(padding)不同
解决方案: css 里增加通配符 * { margin: 0; padding: 0; }
2、IE6双边距问题;在 IE6中设置了float , 同时又设置margin , 就会出现边距问题
解决方案:设置display:inline;
3、当标签的高度设置小于10px,在IE6、IE7中会超出自己设置的高度
解决方案:超出高度的标签设置overflow:hidden,或者设置line-height的值小于你的设置高度
4、图片默认有间距
解决方案:使用float 为img 布局
5、IE9一下浏览器不能使用opacity
解决方案:
opacity: 0.5;filter: alpha(opacity = 50);filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50);
6、边距重叠问题;当相邻两个元素都设置了margin 边距时,margin 将取最大值,舍弃最小值;
解决方案:为了不让边重叠,可以给子元素增加一个父级元素,并设置父级元素为overflow:hidden;
7、cursor:hand 显示手型在safari 上不支持
解决方案:统一使用 cursor:pointer
8、两个块级元素,父元素设置了overflow:auto;子元素设置了position:relative ;且高度大于父元素,在IE6、IE7会被隐藏而不是溢出;
解决方案:父级元素设置position:relative
各浏览器之间的差异
1.在js中修改元素background-size样式
火狐:obj.style[‘backgroundSize’]=’XXX’;
谷歌及其他:obj.style[‘background-size’]=’XXX’; 或obj.style[‘backgroundSize’]=’XXX’;
2.火狐无法再JS中操作float,需要在样式表中写。
3.360浏览器这个傻逼用useragent检测出来是chrome,但是它的内核调用却是safari,太屎了!
4.Array对象支持差异
(1)join方法
假设有一个数组:arr={‘a’,’b’,’c’}
其他浏览器:arr.join(undefind); //a,b,c
IE7:arr.join(undefind);//aundefindbundefindc
(2)indexof和lastIndexof方法
IE8及以下不支持该方法。
5.IE和FF差异
(1) window.event:
表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象
(2) 获取事件源
IE用srcElement获取事件源,而FF用target获取事件源
(3) 添加,去除事件
IE:element.attachEvent(“onclick”, function) element.detachEvent(“onclick”, function)
FF:element.addEventListener(“click”, function, true) element.removeEventListener(“click”, function, true)
(4) 获取标签的自定义属性
IE:div1.value或div1[“value”]
FF:可用div1.getAttribute(“value”)
(5) document.getElementByName()和document.all[name]
IE;document.getElementByName()和document.all[name]均不能获取div元素
FF:可以
(6) input.type的属性
IE:input.type只读
FF:input.type可读写
(7) innerText textContent outerHTML
IE:支持innerText, outerHTML
FF:支持textContent
(8) 是否可用id代替HTML元素
IE:可以用id来代替HTML元素
FF:不可以
(9)document appendChild的问题
IE:直接document.appendChild就可以了。
FF:必须是document.body.appendChild
(10)
IE:var a=function abc(){alert(‘aa’);}; a(); abc();都会弹出aa,但是 a!=abc
FF:var a=function abc(){alert(‘aa’);}; a(); abc(); a会弹出aa,abc会提示这个函数没有定义,但是 a==abc却成立。
(11)
IE:var tt=eval; tt(‘foo=1’); 如果该eval在局部作用域中且局部作用域中有foo变量且有全局变量foo,foo就会改变这个局部foo变量的值.
FF:var tt=eval;tt(‘foo=1’); 如果该eval在局部作用域中且局部作用域中有foo变量且有全局变量foo,foo就会改变这个全局foo变量的值.
6.标签的onload支持
IE下支持标签的onreadystatechange事件而不支持onload事件,且readyState有 loading loaded complete三个值。
其余浏览器支持onload事件而不支持onreadystatechange事件
opera则都支持。
7.自定义属性支持
IE:如果是自定义属性,写在行间也是没有问题的,如
除IE内核之外的浏览器:OPERA FF CHROME 不支持行间自定义属性, 只有写在javascript里,如 : oImg[“ff”]=1;
8.input button 标签去border后的样式
chrome:为了显示按钮的立体感,它会故意把按钮向规定的坐标下置1px
ff 和 IE 的脚本兼容问题
1 | 1、在 IE 下和火狐下事件冒泡不一样 |