浏览器兼容性问题及解决方案(二)

本文详细介绍了浏览器兼容性问题,如CSS样式、JavaScript事件处理等方面的差异,并提供了针对IE6-8等老版本浏览器的解决策略,包括清除浮动、最小高度、透明度、行内样式等问题的修复方法。此外,还涵盖了浏览器内核如Trident、Webkit等的使用情况。
摘要由CSDN通过智能技术生成

简述
所谓的浏览器兼容性问题,是指因为不同的浏览器对同⼀段代码有不同的解析,造成页⾯显⽰效果不统⼀的情况。
常见的浏览器内核(渲染引擎)
四种内核: Trident、Gecko、Blink、Webkit


  浏览器                      内核
IE浏览器             Trident 内核,也成为 IE 内核
Chrome浏览器   Webkit 内核,现在是 Blink 内核
Firefox浏览器     Gecko 内核,俗称 Firefox 内核
Safari浏览器       Webkit 内核
Opera浏览器      最初是⾃⼰的 Presto 内核,后来加⼊⾕歌⼤军,从Webkit⼜到了Blink内核
360浏览器           Trident + Blink 双内核
猎豹浏览器          Trident + Blink 双内核
百度浏览器          Trident 内核
QQ浏览器            Trident(兼容模式)+ Webkit(⾼速模式)


CSS兼容性问题
1. 不同浏览器的标签默认的外边距 ( margin ) 和内边距 ( padding ) 不同
解决⽅案⼀: css ⾥增加通配符 * { margin: 0; padding: 0; }
解决⽅案⼆: body,h1,h2,h3,ul,li,input,div,span,a,form …… { margin: 0; padding: 0; }
2. 在 IE6及以下版本中设置了 float,同时⼜设置 margin,就会出现双边距浮动问题
问题描述:任何浮动的元素上的外边距加倍
解决⽅案:在 float 的标签样式控制中加⼊ display: inline; 将其转化为⾏内属性
3. IE6下默认有⾏⾼
解决⽅案:overflow: hidden;或 font-size: 0; 或 line-height: xx px;
4. 图⽚默认有间距
解决⽅案:使⽤ float 属性为 img 布局
5. IE6及以下版本,不⽀持最⼩⾼度 min-height
问题描述:IE6不⽀持 min-height 属性。即使定义了元素⾼度,如果内容超过元素的⾼度,IE6在解析时,会⾃动延长元素的⾼度
解决⽅案:利⽤ IE6 不识别 !important,给元素设置固定⾼度,并且设置元素⾼度⾃动。height: auto !important; height: 300px; min-
height: 300px; IE7 及其其他浏览器都识别 !important,虽然定义了 height: 300px,但是 !important 的优先级最⾼。所以内容超过
300px 时,还是会⾃动延长。
6. IE8及以下版本不⽀持 opacity
解决⽅案:

opacity: 0.5; 
filter: alpha(opacity = 50); 
-ms-filter: “progid:DXImageTransform.Microsoft.Alpha(opacity = 80)”;

7. IE6以下的 3 像素问题
问题描述:两个相邻的 div 之间有3个像素的空隙,⼀个 div 使⽤了 float,⽽另⼀个没有使⽤产⽣的。
解决⽅案⼀:对另⼀个 div 也使⽤ float
解决⽅案⼆:给浮动的 div 添加属性 margin-right: –3px,但是这样写,在其他浏览器⼜会不正常,所以我们需要添加 IE6 的 hack,在
属性 margin-right 前添加下划线 margin-right: –3px。( IE6 以及更低版本的 hack,是在属性前⾯添加下划线)
8. 块级元素上下边距合并问题
问题描述:当上下相邻元素都设置了 margin 边距时,margin 将取最⼤值,舍弃⼩值
解决⽅案:可以给⼦元素添加⼀个⽗元素,并设置该⽗元素:overflow: hidden;
9. IE9 以下浏览器不识别 HTML5 新增标签问题
解决⽅案:

<!--[if lt IE 9]>
  <script type="text/javascript" src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->

10. margin 塌陷问题
问题描述:如果⼀个⼤盒⼦中包含⼀个⼩盒⼦, 给⼩盒⼦设置 margin-top ⼤盒⼦会⼀起向下平移
解决⽅案⼀:给⽗盒⼦加⼀个边框 border: 1px solid black;
解决⽅案⼆:给⽗盒⼦加 padding-top: xx px;
解决⽅案三:给⽗盒⼦设置属性 overflow: hidden;
解决⽅案四:给⽗盒⼦设置浮动 float: left;
解决⽅案五:给⽗盒⼦设置为⾏内块 display: inline-block;
11. 清除浮动
问题描述:浮动元素撑不开⽗级容器
解决⽅案⼀:额外标签法。在浮动的盒⼦内部最后,再放⼀个块级标签,在这个标签内使⽤ clear: both;
解决⽅案⼆:使⽤ overflow 清除浮动。在⽗元素中添加⼀个属性 overflow: hidden;
解决⽅案三:使⽤伪元素清除浮动。

.clearfix::after {
 content: "";      /* 伪元素必须给这个content='' */
    display: block;   /* 必须块级才能清除 */
    clear: both;      /* 核⼼代码 */
    /* 保证伪元素在页⾯中看不到 */
 height:0;
    line-height:0;
 visibility:hidden;
}
/* 兼容 IE 67 */
.clearfix {
  *zoom: 1;
}


解决⽅案四:给⽗盒⼦设置⾼度

浏览器CSS兼容前缀

-o-transform:rotate(7deg);// Opera
-ms-transform:rotate(7deg);// IE
-moz-transform:rotate(7deg);// Firefox
-webkit-transform:rotate(7deg);// Chrome
transform:rotate(7deg);// 统⼀标识语句  

JS兼容性问写法
1. 获取⽹页宽和⾼的兼容性问题

var winW = document.body.clientWidth || document.documentElement.clientWidth   // ⽹页可见区域宽
var winH = document.body.clientHeight || document.documentElement.clientHeight // ⽹页可见区域宽
// 以上为不包括边框的宽⾼,如果是 offsetWidth 或者 offsetHeight 的话包括边框
var winWW = document.body.scrollWidth || document.documentElement.scrollWidth   // 整个⽹页的宽
var winHH = document.body.scrollHeight || document.documentElement.scrollHeight // 整个⽹页的⾼
var screenH = window.screen.height // 屏幕分辨率的⾼
var screenW = window.screen.width  // 屏幕分辨率的宽
var screenX = window.screenLeft    // 浏览器窗⼝相对于屏幕的x坐标(除了Firefox)
var screenXX = window.screenX      // FireFox相对于屏幕的X坐标
var screenY = window.screenTop     // 浏览器窗⼝相对于屏幕的y坐标(除了Firefox)
var screenYY = window.screenY      // FireFox相对于屏幕的y坐标

2. 获取滚动条距离的兼容性问题

var scrollTop = document.body.scrollTop || document.documentElement.scrollTop // ⽹页被卷去的⾼
var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft // ⽹页左卷的距离

3. 获取⾏外样式 currentStyle 和 getComputedStyle 的兼容性问题

function getStyle(el, name){
    if(el.currentStyle) {
        // IE
        return el.currentStyle[name]
    } else {
        // Chrom, Firefox
  return getComputedStyle(el, false)[name]
 }
}

4. ⽤ “索引” 获取字符串每⼀项的兼容性问题

var str = 'abcdefg'
alert(str[0])  // 低版本的浏览器IE6, 7不兼容
alert(str.charAt(0))  // 兼容所有浏览器

5. 使⽤ event 对象时的兼容性问题

document.oncilck = function(ev) {
    var e = ev || window.event
    alert(e.clientX)
}

6. 阻⽌事件冒泡的兼容性问题

document.oncilck = function(ev) {
    var e = ev || window.event
    if (e.stopPropagation) {
        e.stopPropagation()    // W3C标准
    } else {
     e.cancelBubble = true  // IE..
    }
}

7. 阻⽌事件默认⾏为的兼容性问题

document.oncilck = function(ev) {
    var e = ev || window.event
    if (e.preventDefault) {
        e.preventDefault()      // W3C标准
    } else {
     e.returnValue = false   // IE..
    }
}

8. 获取事件⽬标对象的兼容性问题

document.oncilck = function(ev) {
    var e = ev || window.event
    var target = e.target || e.srcElement         // 获取 target 的兼容写法,后⾯的为 IE
    var from = e.relatedTarget || e.formElement   // ⿏标来的地⽅,同样后⾯的为 IE...
    var to = e.relatedTarget || e.toElement       // ⿏标去的地⽅
}

9. 获取键盘按键码的兼容性问题

document.onkeydown = function(ev) {
 var e = ev || window.event
 var code = e.keyCode || e.which || e.charCode
 console.log(code)
}

10. 设置监听事件的兼容性问题

// 设置监听事件
function addEvent(el, type, fn) {        // 添加事件监听,三个参数分别为对象、事件类型、事件处理函数,默认为 false
    if (el.addEventListener) {
        el.addEventListener(type, fn, false)    // ⾮IE
    } else {
        el.attachEvent('on' + type, fn)     // IE,这⾥已经加上on,传参的时候注意不要重复加了
    }
}
// 删除事件监听
function removeEvent(el, type, fn) {  
    if (el.removeEventListener) {
        el.removeEventListener(type, fn, false)    // ⾮IE
    } else { 
        el.detachEvent('on' + type, fn)    // IE,这⾥已经加上on,传参的时候注意不要重复加了
    }
}

11. 获取DOM节点的兼容性问题

// DOM节点相关,主要兼容IE 6 7 8
// 获取下⼀个兄弟节点
function nextnode(el) {
    if (el.nextElementSibling) {
        return el.nextElementSibling  // ⾮IE6 7 8 ⽀持
    } else{
        return el.nextSibling  // IE6 7 8 ⽀持
    }
}
// 获取上⼀个兄弟节点
function prenode(el) {
    if (el.previousElementSibling) {
        return el.previousElementSibling   // ⾮IE6 7 8 ⽀持
    } else{
        return el.previousSibling     // IE6 7 8 ⽀持
    }
}
// 获取第⼀个⼦节点
function firstnode(el) {
    if (el.firstElementChild) {
        return el.firstElementChild   // ⾮IE6 7 8 ⽀持
    } else{
        return el.firstChild    // IE6 7 8 ⽀持
    }
}
// 获取最后⼀个⼦节点
function lastnode(el) {
    if (el.lastElementChild) {
        return el.lastElementChild    // ⾮IE6 7 8 ⽀持
    } else{
        return el.lastChild     // IE6 7 8 ⽀持
    }
}

12. 监听⿏标的滑轮滚动事件的兼容性问题

// 给页⾯绑定⿏标滑轮滚动事件
var scrollFunc = function(e) {
 var e = e || window.event
    if (e.wheelDelta) {     // 判断浏览器 IE, Chrome滑轮事件
        // 当滑轮向上滚动时
     if (e.wheelDelta > 0) {
      console.log("滑轮向上滚动")
      console.log(e.wheelDelta)
     }
     // 当滑轮向下滚动时
     if (e.wheelDelta < 0) {
         console.log("滑轮向下滚动")
         console.log(e.wheelDelta)
     }
    } else if (e.detail) {   // Firefox滑轮事件
     // 当滑轮向上滚动时
     if (e.detail> 0) {  
      console.log("滑轮向上滚动")
      console.log(e.detail)
     }
     // 当滑轮向下滚动时
     if (e.detail < 0) { 
   console.log("滑轮向下滚动")
   console.log(e.detail)
     }
    }
}
// Firefox 使⽤ DOMMouseScroll 绑定滑轮事件
if(document.addEventListener) {
 document.addEventListener('DOMMouseScroll', scrollFunc, false)
}
// W3C标准   IE/Opera/Chrome 
window.onmousewheel = document.onmousewheel = scrollFun

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值