zoukankan      html  css  js  c++  java
  • 浏览器兼容性问题

     浏览器常用的前缀有:

    • -moz代表firefox浏览器私有属性
    • -ms代表IE浏览器私有属性
    • -webkit代表chrome、safari私有属性
    • -o代表opera私有属性

    一、html部分

    H5新标签在IE9以下的浏览器识别

    <!--[if lt IE 9]>

     <script type="text/javascript" src="js/html5shiv.js"></script>

    <![endif]-->

     html5shiv.js下载地址

    https://github.com/aFarkas/html5shiv/releases

     

    二、CSS样式的兼容性

    css的hack问题:主要针对IE的不同版本,不同的浏览器的写法不同  IE的条件注释hack:  <!--[if IE 6]>此处内容只有IE6.0可见<![endif]-->            <!--[if IE 7]>此处内容只有IE7.0可见<![endif]-->

    常见CSS属性兼容

    • inline-block: >=ie8
    • min-width/min-height: >=ie7
    • :before,:after: >=ie8
    • div:hover: >=ie7
    • inline-block: >=ie8
    • background-size: >=ie9
    • 圆角: >= ie9
    • 阴影: >= ie9
    • 动画/渐变: >= ie10

    list-style-image准确定位的问题

    问题:

           li前设置图片时,图片与其后的文字对齐问题

    解决:

    1、采用背景定位 和 字符缩进的方法

    background:url() no-repeat left center;text-index:16px;

    2、采用相对定位方法

    li 设置list-style:url();

    li的子元素position:relative;top:-5px;

      

    单选框、复选框与后面的文字对不齐

    问题:

         单选框、复选框与后面的文字对不齐。

    解决:

    .align{font-size:12px;}

    .align input{ display:block; float:left;}

    .align label{ display:block; float:left;padding-top:3px; *padding-top:5px;}

    图片默认有间距

    问题症状:几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。

    解决方案:使用float属性为img布局

    备注:因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。(有人使用负margin,虽然能解决,但负margin本身就是容易引起浏览器兼容问题的用法,所以尽量不要使用)

    标签最低高度设置min-height不兼容

    问题症状:因为min-height本身就是一个不兼容的CSS属性,所以设置min-height时不能很好的被各个浏览器兼容解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-h

    eight:200px; height:auto !important; height:200px; overflow:visible;}

    备注:在B/S系统前端开时,有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。  

    li中内容超过长度后以省略号显示

    此技巧适用与IE、Opera、safari、chrom浏览器,FF暂不支持。

    <style type="text/css">
    li { 
    200px; 
    white-space:nowrap; 
    text-overflow:ellipsis; 
    -o-text-overflow:ellipsis; 
    overflow: hidden; 
    }

    为什么无法定义1px左右高度的容器

    IE6下这个问题是因为默认的行高造成的,解决的技巧也有很多:

    例如:overflow:hidden  zoom:0.08  line-height:1px 

    chrome浏览器下不支持字体小于12像素

    通过-webkit-text-size-adjust: none;来解决

    字体大小定义不同

    问题表现:对字体大小small定义不同,Firefox为13px,而IE为16px,差别比较大

    解决方法:使用指定的字体大小如14px或者使用em

    常见的兼容性问题?

    不同浏览器的标签默认的margin和padding不一样。 *{margin:0;padding:0;}

    渐进识别的方式,从总体中逐渐排除局部。首先,巧妙的使用“9”这一标记,将IE浏览器从所有情况中分离出来。接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。 {background-color:#f1ee18;/*所有识别*/.background-color:#00deff9; /*IE6、7、8识别*/+background-color:#a200ff;/*IE6、7识别*/_background-color:#1e0bd1;/*IE6识别*/}

    设置较小高度标签(一般小于10px),在IE6,IE7中高度超出自己设置高度。hack:给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。

    IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用getAttribute()获取自定义属性;Firefox下,只能使用getAttribute()获取自定义属性。解决方法:统一通过getAttribute()获取自定义属性。

    超链接访问过后hover样式就不出现了,被点击访问过的超链接样式不再具有hover和active了。解决方法是改变CSS属性的排列顺序:L-V-H-A ( love hate ): a:link {} a:visited {} a:hover {} a:active {}

    三、JavaScript的兼容性

    事件绑定方法函数不同:标准的事件绑定方法函数为addEventListener,但IE下是attachEvent;

    事件的捕获方式不一致:标准浏览器是由外至内,而IE是由内到外,但是最后的结果是将IE的标准定为标准window.event获取的;

    获取目标元素的方法不同:标准浏览器是event.target,而IE下是event.srcElement

    ajax的实现方式不同:这个我所理解的是获取XMLHttpRequest的不同,IE下是activeXObject 

    获得DOM节点的父节点、子节点的方式不同: 其他浏览器:parentNode  parentNode.childNodes   IE:parentElement parentElement.children

    鼠标坐标:e.pageX, e.pageY VS window.event.x, window.event.y

    原生ajax中低版本ie不支持xmlhttprequest对象

    解决方法是做一个判断,如果有xmlhttprequest方法,则调用,若没有,则改用ie浏览器的ActiveXobject方法:

    if(window.XMLHttpRequest){
      var oAjax=window.XMLHttpRequest
    }else{
      var oAjax=new ActiveXObject('Microsoft.XMLHTTP');
    } 

    低版本浏览器不支持getElementByClassName

    解决方法是重写一个getByClass()函数:

    function getByClass(obj,sClass){
        var aResult = [];
        if(obj.getElementsByClassName){
            aResult = obj.getElementsByClassName(sClass);
        }else{
            var aEle = obj.getElementsByTagName('*');
            for(var i=0;i<aEle.length;i++){
                var aClass = aEle[i].className.split(' ');
                if(findInArr(aClass,sClass)){   //调用自定义的findArr方法
                    aResult.push(aEle[i]);
                }
            }
        }
        return aResult;
    }
    function findInArr(arr,sClass){
        for(var i=0;i<arr.length;i++){
            if(arr[i]==sClass){
                return true;
            }
        }
        return false;
    }

     

  • 相关阅读:
    每天一个linux命令(54):sftp命令
    每天一个linux命令(53):wget命令
    每天一个linux命令(52):scp命令
    每天一个linux命令(51):rcp命令
    每天一个linux命令(50):telnet命令
    每天一个linux命令(49):ss命令
    每天一个linux命令(48):netstat命令
    每天一个linux命令(46):ping命令
    Springmvc常见问题
    MP实战系列(十)之SpringMVC集成SpringFox+Swagger2
  • 原文地址:https://www.cnblogs.com/leftJS/p/11097181.html
Copyright © 2011-2022 走看看