做前端,总会涉及到浏览器兼容的问题,之所以存在浏览器兼容的问题,是因为各个浏览器的内核不同,相对应的同一套代码,不同的浏览器解析后,所呈现的页面效果也会存在一定的差异。

一 浏览器内核差异

  我们先来了解一下各个浏览器的内核(渲染引擎):

  Trident(IE内核):

    IE6、IE7、IE8(Trident 4.0)、IE9(Trident 5.0)、IE10(Trident 6.0)、360安全浏览器(1.0-5.0为Trident,6.0为Trident+Webkit,7.0为Trident+Blink)猎豹极轻浏览器,360极速浏览器(7.5之前为Trident+Webkit,7.5为Trident+Blink)猎豹安全浏览器(1.0-4.2版本为Trident+Webkit,4.3及以后版本为Trident+Blink)猎豹极轻浏览器,傲游浏览器(傲游1.x、2.x为IE内核,3.x为IE与Webkit双核)、百度浏览器(早期版本)、世界之窗浏览器[2]

  Gecko(Firefox内核):

    Mozilla Firefox、Mozilla SeaMonkey、waterfox(Firefox的64位开源版)、Iceweasel、Epiphany(早期版本)、Flock(早期版本)、K-Meleon。

  Presto(Opera前内核) (已废弃):

    Opera12.17及更早版本曾经采用的内核,现已停止开发并废弃。

  Webkit(Safari内核,Chrome内核原型,开源):

    傲游浏览器3、[1]

  Blink:

    这一渲染引擎是开源引擎WebKit中WebCore组件的一个分支,并且在Chrome(28及往后版本)、Opera(15及往后版本)和Yandex浏览器中使用。

  浏览器内核的区别,我们只做了解即可,感兴趣的同学,可以自己去搜搜啊~

二 兼容问题处理细则

  1、浏览器默认会有一些自己独有的属性,像内外边距啦,图片边框啊、input自带的样式啊等等,当我们用到这些标签及样式时,就需要手动的清楚浏览器默认样式,比如清除补丁和边距:*{margin:0;padding:0;},像这样使用通配符强制将补丁和边距置为零,简单粗暴,但是这样处理比较消耗性能,我一般倾向于使用一些CSS样式重置库,常见的有以下几种,大家可以根据实际需求来选择:

  Neat.css:解决Bug,特别是低级浏览器的常见Bug;统一效果,但不盲目追求重置为0;向后兼容;考虑响应式;考虑移动设备。

       http://thx.github.io/cube/doc/neat

  Reset.css:对浏览器样式的重置(杀伤力偏大)

         http://meyerweb.com/eric/tools/css/reset/

  Normalize.css:修复浏览器样式

          https://yuilibrary.com/yui/docs/cssnormalize/

  除了这些,大家还可以借鉴百度、淘宝的样式重置表。


  2、块级元素浮动后,又使用margin来控制相邻块级元素的间距的情况下,在IE6下,margin值要比我们设置的值大,这样,后面浮动的元素就会被挤到下面去,解决方案是:将浮动的块级元素的display属性值设为inline-block。


  3、设置标签的高度小于10px的时候,在IE6,IE7,遨游中标签的高度会超出自己设置高度。解决方案:给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。


  4、行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,ie6间距bug。解决方案:在display:block;后面加入display:inline;display:table;。


  5、几个img标签放在一起的时候,有些浏览器会有默认的间距。解决方案:使用float属性为img布局。


  6、min-height设置标签最小高度的时候不兼容。解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}


  7、CSS Hack技巧

  条件注释法:

    <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->
    <!--[if IE]> 所有的IE可识别 <![endif]-->
    <!--[if IE 6]> 仅IE6可识别 <![endif]-->
    <!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]-->
    <!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->
    <!--[if IE 7]> 仅IE7可识别 <![endif]-->
    <!--[if lt IE 7]> IE7以及IE7以下版本可识别 <![endif]-->
    <!--[if gte IE 7]> IE7以及IE7以上版本可识别 <![endif]-->
    <!--[if IE 8]> 仅IE8可识别 <![endif]-->
    <!--[if IE 9]> 仅IE9可识别 <![endif]-->

  类内属性前缀法+选择器前缀法:

    在标准模式中:

    “-″减号是IE6专有的hack
    “\9″ IE6/IE7/IE8/IE9/IE10都生效
    “\0″ IE8/IE9/IE10都生效,是IE8/9/10的hack
    “\9\0″ 只对IE9/IE10生效,是IE9/10的hack
    *html *前缀只对IE6生效
    *+html *+前缀只对IE7生效
    @media screen\9{...}只对IE6/7生效
    @media \0screen {body { background: red; }}只对IE8有效
    @media \0screen\,screen\9{body { background: blue; }}只对IE6/7/8有效
    @media screen\0 {body { background: green; }} 只对IE8/9/10有效
    @media screen and (min-width:0\0) {body { background: gray; }} 只对IE9/10有效
    @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {body { background: orange; }} 只对IE10有效

  代码示例:

.csshack {
    width: 100px;
    height: 100px;
    background-color: green;/* 全部识别 */
    .background-color: #ccc\9;/*IE6、7、8识别*/
    +background-color: #fff;/*IE6、7识别*/
    _background-color:#1e0bd1;/*IE6识别*/
}
.csshack, x:-moz-any-link, x:default{background-color:#00ff00;}/*IE7 firefox3.5及以下 识别 */
@-moz-document url-prefix(){.csshack{background-color:#00ff00;}}/* 仅firefox 识别 */
* +html .csshack{background-color:#a200ff;}/* 仅IE7 识别 */
@media screen and (-webkit-min-device-pixel-ratio:0){.csshack{background-color:#f1ee18}}{} /*safari(Chrome) 有效 */
@media all and (min-width: 0px){ 
    .csshack{
        background-color:#f1ee18;/*opera and Safari(Chrome) and firefox*/ 
        background-color:#4cac70\0;/* 仅 Opera 有效 */ 
        }
    }

  8、!important

ie6下,同一个大括号里对同一个样式属性定义,其中一个加important 则important标记是被忽略的,例:{background:red!important; background:green;} ie6下解释为背景色green,其它浏览器解释为背景色red;如果这同一个样式在不同大括号里定义,其中一个加important 则important发挥正常作用,例:div{background:red!important} div{background:green},这时所有浏览器统一解释为背景色red。


  9、点击超链接后,hover、active样式不生效。解决方案,css属性排列为L-V-H-A。


 

  10、给块级元素设置高度高度的时候,最好也同时设置上line-height属性值。


  11、去除超链接虚线边框的问题。当点击超链接时,ff、ie6、ie7、ie8会出现虚线边框。

中 设置为a {blr:expression_r(this.onFocus=this.blur()) }

和 ff 都不支持expression 在ie8 、ff中设置为  :focus { outline: none; }


  12、css滤镜的问题:ff、safari、chrome、opera使用opacity属性,ie使用设置filter:alpha(opacity=50)时,ie6/7失效,还要设置zoom:1width:100%。


  13、IE8不兼容Bootstrap框架的解决方案。

    引入respond.min.js库,兼容响应式布局。不过需要注意的是,这个库不能放在本地路径下(Fill://),要用静态资源链接或者放在服务器上才能生效。


  14、不兼容H5标签的解决方法:引入html5shiv.min.js文件。


  15、不兼容rem单位的解决方法:引入html5shiv.min.js文件。引入rem.min.js文件,不过这个文件的引入位置要放在页面最下方。


  16、IE8下,父级div或者兄弟div有浮动或定位属性的时候,div模块设置背景颜色会失效,或者div本身有浮动属性,设置背景色也可能会失效,此时注意布局的方法,我遇到过的是第一种情况,我的解决方法时给父级div设置相对定位,相邻div不设置定位或浮动,本身使用绝对定位,到想要去的位置,可以让背景颜色生效。


  在制作页面的时候,我们都会遇到各种各样的问题,但是代码规范,遵循大家都使用的准则,兼容的问题就能少一些,这里只列举了一部分,以后有其他的内容我也会继续补充~