浏览器兼容问题
所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。
浏览器内核主要分为两种:渲染引擎
和js引擎
简单来说就是:不同浏览器的内核不尽相同,所以各个浏览器对网页的解析存在一定的差异。
浏览器 | 内核(渲染引擎) |
---|---|
Chrome谷歌 | 之前Webkit,已改Blink内核 |
FireFox火狐 | Gecko |
Safari苹果 | Webkit |
IE | Trident |
Opera欧朋 | 现已改用Google Chrome的Blink内核 |
一、css兼容问题
1:不同浏览器的标签默认的margin和padding不同
问题描述: 随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。
解决方案:
*{mardin: 0 ; padding: 0;}
- 引入.css文件重置
2:css3新属性,加浏览器前缀兼容早期浏览器
-moz-
/* 火狐浏览器 /
-webkit-
/ Safari, 谷歌浏览器等使用Webkit引擎的浏览器 /
-o-
/ Opera浏览器(早期) /
-ms-
/ IE */
那些c3属性需要加
定义关键帧动画 @keyframes
css3中的变形(transform)、过渡(transtion)、动画(animation)
border-radius 圆角
box-shadow 盒子阴影
flex 弹性布局
....
加之后
.myClass {
-webkit-animation-name: fadeIn;
-moz-animation-name: fadeIn;
-o-animation-name: fadeIn;
-ms-animation-name: fadeIn;
animation-name: fadeIn; /* 不带前缀的放到最后 */
}
/* 复杂属性 keyframes */
@-webkit-keyframes fadeIn {
0% { opacity: 0; } 100% { opacity: 0; }
}
@-moz-keyframes fadeIn {
0% { opacity: 0; } 100% { opacity: 0; }
}
@-o-keyframes fadeIn {
0% { opacity: 0; } 100% { opacity: 0; }
}
@-ms-keyframes fadeIn {
0% { opacity: 0; } 100% { opacity: 0; }
}
/* 不带前缀的放到最后 */
@keyframes fadeIn {
0% { opacity: 0; } 100% { opacity: 0; }
}
3:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大
症状描述: 常见症状是IE6中后面的一块被顶到下一行.
解决方案: 在float的标签样式控制中加入 display:inline;将其转化为行内属性
<divid=”imfloat”>
相应的css为
# imfloat{
float:left;
margin:5px;//IE下理解为10px
display:inline;//IE下再理解为5px
}
4、设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度
问题描述:设置div高度小于10px,IE6、7和遨游里div的高度,超出自己设置的10px。
解决方案:
- 给超出高度的标签设置overflow:hidden;
- 或者设置行高line-height 小于你设置的高度。
5、行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug
问题描述: IE6里的间距比超过设置的间距。
解决方案: 在display:block;后面加入display:inline;display:table;
行内属性标签,为了设置宽高,我们需要设置display:block;(除了input/img标签比较特殊)。在用float布局并有横向的margin后,在IE6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行内属性标签,所以我们再加上
display:inline
的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入display:talbe
。
6、IE浏览器div最小宽度和高度的问题
问题描述: IE浏览器div最小宽度和高度不生效(IE不识别-min-width
和max-height
)
解决方案:
#box{
width: 80px;
height: 35px;
}
html>body #box{
width: auto;
height: auto;
min-width: 80px;
min-height: 35px;
}
7、图片默认有间距
问题描述:几个img标签放在一起的时候,有些浏览器会有默认的间距,通配符清除间距也不起作用。
解决方案:使用float属性为img布局(所有图片左浮)
因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。
8、css hack解决浏览器兼容性
不同浏览器,识别不同的样式,csshack本身就是处理浏览器兼容的。
下面是css hack写法:
background-color:yellow0; 0 是留给ie8的
+background-color:pink; + ie7定了;
_background-color:orange; _专门留给神奇的ie6;
9、超链接访问过后hover样式就不出现的问题
被点击访问过的超链接样式不在具有hover和active了,很多人应该都遇到过这个问题,解决技巧是改变CSS属性的排列顺序:L-V-H-A
<style type="text/css">
a:link {}
a:visited {}
a:hover {}
a:active {}
</style>
二、js兼容
1、事件绑定
IE:dom.attachEvent();
标准浏览器:dom.addEventListener(‘click',function(event){},false);
标准浏览器采用事件捕获的方式对应IE的事件冒泡机制(即标准由最外元素至最内元素或者IE由最内元素到最外元素)最后标准方亦觉得IE这方面的比较合理,所以便将事件冒泡纳入了标准,这也是addEventListener第三个参数的由来,而且事件冒泡作为了默认值第三值默认false,表示事件冒泡方式。
var x = document.getElementById("myBtn");
if (x.addEventListener) { //所有主流浏览器,ie9+
x.addEventListener("click", myFunction);
} else if (x.attachEvent) { // IE 8 及更早 IE 版本
x.attachEvent("onclick", myFunction);
}
2、事件对象event以及event.srcElement(对象事件源)
document.onclick=function(ev){//谷歌火狐的写法,IE9以上支持,往下不支持;
var e=ev;
console.log(e);
}
document.onclick=function(){//谷歌和IE支持,火狐不支持;
var e=event;
console.log(e);
}
document.onclick=function(ev){//兼容写法;
var e=ev||window.event;
var mouseX=e.clientX;//鼠标X轴的坐标
var mouseY=e.clientY;//鼠标Y轴的坐标
}
IE: event对象有srcElement
属性,但是没有target
属性;
Firefox: event对象有target
属性,但是没有srcElement
属性。
srcObj = event.srcElement?event.srcElement:event.target;
3、阻止事件冒泡传播:
//js阻止事件传播,这里使用click事件为例
document.onclick=function(e){
var e=e||window.event;
if (e.stopPropagation) {
e.stopPropagation();//W3C标准
}else{
e.cancelBubble=true;//IE....
}
}
4、 阻止事件默认行为::
//js阻止默认事件 一般阻止a链接href,form表单submit提交
document.onclick=function(e){
var e=e||window.event;
if (e.preventDefault) {
e.preventDefault();//W3C标准
}else{
e.returnValue='false';//IE..
}
}