CSS-浏览器兼容

浏览器兼容问题产生的原因

  • 同一产品,版本越老,bug越多。
  • 同一产品,版本越新,功能越多。
  • 不同产品,不同标准,不同实现方式。

相关网站

  • 浏览器市场份额统计
  • cansiuse.com:查看css属性兼容
  • browserhacks:查Hack的写法

处理兼容问题的思路:

  • 要不要做
  1. 产品的角度(产品的受众、受众的浏览器比例,效果优先还是基本功能优先)
  2. 成本的角度
  • 做到什么程度
  1. 让哪些浏览器支持
  • 如何做
  1. 根据兼容需求选择技术框架/库(jquery)
  2. 根据兼容需求选择兼容工具(html5shiv.js,respond.js,css reset,normalize.css,Modernizr)
  3. postCSS
  4. 条件注释、css hack 、JS能力检测做一些修补

渐进增强和优雅降级

  • 渐进增强(progressive enhancement):针对低版本浏览器进行构建页面,保证最基本的功能,然后在针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
  • 优雅降级(graceful degradation):一开始就构建完整的功能,然后针对低版本的浏览器进行兼容。

处理兼容问题的方法

合适的框架

  1. Bootstrap(>=ie8).
  2. jQuery 1.~(>=ie6),jQuery 2.~(>=ie9).
  3. Vue(>=ie9).
  4. ....

IE条件注释

条件注释(conditional comment)是HTML源码中被IE有条件解释的语句。条件注释被用来像IE提供及隐藏代码。

    
    
    
    
    

使用了条件注释的页面在 Windows Internet Explorer 9 中可正常工作,但在 Internet Explorer 10 中无法正常工作。 IE10不再支持条件注释

1.png

css hack

由于不同的厂商的浏览器或者同一厂商的浏览器的不同版本,对css的解析认识不完全一样,因此导致生成的页面效果不一样,得不到我们所需要的页面效果。

这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到想要的页面效果。

  • CSS hack大致有三种表现形式,CSS属性前缀法选择器前缀法以及IE条件注释法(即HTML头部引用if IE)Hack,实际项目中CSS Hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。
  1. 属性前缀法(即类内部Hack):例如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划线"",IE6~IE10都认识"\9",但firefox前述三个都不能认识。(例如*body,_body)
  2. 选择器前缀法(即选择器Hack)
  3. IE条件注释法(即HTML条件注释Hack):针对所有IE(注:IE10+已经不再支持条件注释):,针对IE6及以下版本:。这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效
  • 常见hack写法
.box{
  color: red;
  _color: blue; /*ie6*/
  *color: pink; /*ie67*/
  color: yellow\9;  /*ie/edge 6-8*/
}
*.box{}/*ie67*/; _.box{}/*ie6*/



常见兼容处理范例

.clearfix:after{
  content: '';
  display: block;
  clear: both;
}
.clearfix{
  *zoom: 1; /* 仅对ie67有效 */
}

,,,,

.target{
  display: inline-block;
  *display: inline;/*使元素具有inline属性*/
  *zoom: 1;/*触发bfc,就可以设置width和height*/
}
三者的顺序不能改变,因为浏览器的优先级。

浏览器兼容开发利器

 
  • html5shiv.js:作用:创建一个标签,让页面渲染标签。
  • respond.js:模拟css3的媒体查询。
  • css reset:去除一些默认样式或者给一些基础的东西。
刚开始的时候
/* undohtml.css */
/* (CC) 2004 Tantek Celik. Some Rights Reserved.             */
:link,:visited { text-decoration:none }
ul,ol { list-style:none }
h1,h2,h3,h4,h5,h6,pre,code { font-size:1em; }
ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote,
fieldset,input{ margin:0; padding:0 }
a img,:link img,:visited img { border:none }
address { font-style:normal }

进化到后来
* { margin:0; padding:0; }等等

  • normalize.css:因为CSS reset太暴力,所以它产生。
  1. 保护有用的浏览器默认样式而不是完全去掉它们
  2. 一般化的样式:为大部分HTML元素提供
  3. 修复浏览器自身的bug并保证各浏览器的一致性
  4. 优化CSS可用性:用一些小技巧,Normalize.css 是模块化的
  5. 解释代码:Normalize.css 拥有详细的文档
  • Modernizr:国外网站比较常见,用于处理浏览器兼容问题。Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser给HTML添加很多class,之后给class添加属性。
    通过能力检测,进行兼容;执行过程中,会自动检测。

.boxshadow #MyContainer {
    border: none;
    -webkit-box-shadow: #666 1px 1px 1px;
    -moz-box-shadow: #666 1px 1px 1px;
}   
.no-boxshadow #MyContainer {
    border: 2px solid black;
}

参考文章

你可能感兴趣的:(CSS-浏览器兼容)