浏览器兼容 hack

虚拟机virtualbox

1、谈一谈浏览器兼容的思路

确定要不要做

  1. 产品的角度(产品的受众、受众的浏览器比例、效果优先还是基本功能优先)
  2. 成本的角度 (有无必要做某件事)

做到什么程度

  • 综合考量需要做到什么浏览器什么版本的兼容,比如兼容到IE7 还是IE6

如何做

  1. 根据兼容需求选择技术框架/库(jquery)
  2. 根据兼容需求选择兼容工具(html5shiv.jsrespond.jscss resetnormalize.cssModernizr)
  3. postCSS
  4. 条件注释、CSS Hack、js 能力检测做一些修补

渐进增强和优雅降级

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

2、什么是 CSS hack

由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。
这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到我们想要的页面效果。

CSS Hack大致有3种表现形式:
  1. 属性前缀法(即类内部Hack):
    例如 IE6能识别下划线"_"和星号" * ";
    IE7能识别星号" * ",但不能识别下划线"*;
    IE6~IE10都认识"\9";
    但firefox前述三个都不能认识。
.box{
        color: red;  /*所有浏览器都支持*/
        color:red !important;   ⁄* Firefox、IE7支持 *⁄
        _color: blue; /*ie6支持*/
       *color: pink; /*ie6、7支持*/
        color: yellow\9;  /*ie/edge 6-8*/
}
  1. 选择器前缀法(即选择器Hack)
    *html *前缀只对ie6生效
    *+html *+前缀只对ie7生效

  2. IE条件注释法(即HTML条件注释Hack,IE10+已经不再支持条件注释):
    针对所有IE:

    针对IE6及以下版本:
    ``;
    这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效

3、列举5种以上浏览器兼容的写法

处理兼容问题的手段:

  1. 合适的框架
Bootstrap (>=ie8)
jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
Vue (>= ie9)
  1. 条件注释
<!--[if IE 6]>
<p>You are using Internet Explorer 6.</p>
<![endif]-->
  1. CSS hack
.box{
        color: red;  /*所有浏览器都支持*/
        color:red !important;   ⁄* Firefox、IE7支持 *⁄
        _color: blue; /*ie6支持*/
       *color: pink; /*ie6、7支持*/
        color: yellow\9;  /*ie/edge 6-8*/
}
  1. 使用兼容工具
  2. 常见兼容处理范例
.clearfix:after{
  content: '';
  display: block;
  clear: both;
}
.clearfix{
  *zoom: 1; /* 仅对ie67有效 */
}

4、以下工具/名词是做什么的

  • 条件注释(conditional comment)
    是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
    IE10不再支持条件注释。
项目 范例 说明
[if !IE] 非IE
lt [if lt IE 5.5] 小于IE 5.5
lte [if lte IE 6] 小于等于IE6
gt [if gt IE 5] 大于 IE5
gte [if gte IE 7] 大于等于IE7
  • IE Hack
    针对IE浏览器编写不同的CSS的让IE能够正常渲染的过程

  • js 能力检测
    检测浏览器是否支持某种特定的能力,然后给出特定的解决方案。

  • html5shiv.js参考资料
    用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题。

  • respond.js
    让不支持css3 Media Query的浏览器包括IE6-IE8等其他浏览器支持查询。

  • css reset参考资料
    早期的CSS Reset的作用就是清除所有浏览器默认样式,这样更易于保持各浏览器渲染的一致性。暴力清零带来的问题:
    1.*{ margin:0; padding:0; }会带来性能问题
    2.使用通配符存在隐性问题
    3.过渡的标签重置等于画蛇添足
    4.过渡的标签重置导致语言元素失效

  • normalize.css
    是一个可定制的 CSS 文件,使浏览器呈现的所有元素,更一致和符合现代标准;是在现代浏览器环境下对于CSS reset的替代。
    该项目依赖于研究浏览器默认元素风格之间的差异,精确定位需要重置的样式。相比于传统的CSS Reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案。Normalize.css现在已经被用于Twitter Bootstrap、HTML5 Boilerplate、GOV.UK、Rdio、CSS Tricks 以及许许多多其他框架、工具和网站上。
    作用:
    1.保护有用的浏览器默认样式而不是完全去掉它们
    2.为大部分HTML元素提供一般化的样式
    修复浏览器自身的bug并保证各浏览器的一致性
    3.用一些小技巧优化CSS可用性
    4.用注释和详细的文档来解释代码

  • Modernizr参考资料
    Modernizr.js既能给老版本浏览器打补丁,又能保证新浏览器渐进增强的用户体验。

  • postCSS
    PostCSS 是一个使用 JS 插件来转换 CSS 的工具。这些插件可以支持使用变量,混入(mixin),转换未来的 CSS 语法,内联图片等操作。

5、一般在哪个网站查询属性兼容性?

浏览器市场份额查询
CSS属性兼容查询
Hack 的写法

6、常见属性的兼容情况

属性 兼容
div:hover >=ie7
inline-block >=ie8
min-width/min-height >=ie8
:before,:after >=ie8
background-size >=ie9
border-radius圆角 >= ie9
box-shadow阴影 >= ie9
transform动画/渐变 >= ie10

推荐阅读更多精彩内容

  • 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况。基于此,某些情况我们会极不情愿的...
    大女表哥阅读 435评论 0 9
  • 一、如何调试 IE 浏览器? 在IE7以上的版本中可以通过按快捷键F12调出开发人员调试框,如下图IE7以上调试工...
    dengpan阅读 171评论 0 2
  • 一、问答部分 1. 如何调试 IE 浏览器 IE7及以上版本有调试台,可以按F12启动。Paste_Image.p...
    _hello__world_阅读 97评论 0 1
  • 1. 如何调试 IE 浏览器? IE7及以上版本有调试台,可以按F12启动:优点:权威;缺点:不方便,正常情况下只...
    饥人谷_阿群阅读 270评论 0 3
  • 一、如何调试 IE 浏览器 IE7以上版本自带的开发者工具,IE6可以用border的方法;例:IE11的开发者工...
    吴天乔阅读 748评论 2 15