浏览器兼容问题产生的原因
- 同一产品,版本越老,bug越多。
- 同一产品,版本越新,功能越多。
- 不同产品,不同标准,不同实现方式。
相关网站
- 浏览器市场份额统计
- cansiuse.com:查看css属性兼容
- browserhacks:查Hack的写法
处理兼容问题的思路:
- 要不要做
- 产品的角度(产品的受众、受众的浏览器比例,效果优先还是基本功能优先)
- 成本的角度
- 做到什么程度
- 让哪些浏览器支持
- 如何做
- 根据兼容需求选择技术框架/库(jquery)
- 根据兼容需求选择兼容工具(html5shiv.js,respond.js,css reset,normalize.css,Modernizr)
- postCSS
- 条件注释、css hack 、JS能力检测做一些修补
渐进增强和优雅降级
- 渐进增强(
progressive enhancement
):针对低版本浏览器进行构建页面,保证最基本的功能,然后在针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。 - 优雅降级(
graceful degradation
):一开始就构建完整的功能,然后针对低版本的浏览器进行兼容。
处理兼容问题的方法
合适的框架
-
Bootstrap
(>=ie8). -
jQuery 1.~
(>=ie6),jQuery 2.~
(>=ie9). -
Vue
(>=ie9). - ....
IE条件注释
条件注释(conditional comment
)是HTML源码中被IE有条件解释的语句。条件注释被用来像IE提供及隐藏代码。
<!--[if IE 6]>
<p>You are using Internet Explorer 6.</p>
<![endif]-->
<!--[if !IE]><!-->
<script>alert(1);</script>
<!--<![endif]-->
<!--[if IE 8]>
<link href="ie8only.css" rel="stylesheet">
<![endif]-->
使用了条件注释的页面在 Windows Internet Explorer 9 中可正常工作,但在 Internet Explorer 10 中无法正常工作。 IE10不再支持条件注释
css hack
由于不同的厂商的浏览器或者同一厂商的浏览器的不同版本,对css的解析认识不完全一样,因此导致生成的页面效果不一样,得不到我们所需要的页面效果。
这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到想要的页面效果。
- CSS hack大致有三种表现形式,
CSS属性前缀法
、选择器前缀法
以及IE条件注释法
(即HTML头部引用if IE)Hack,实际项目中CSS Hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。
- 属性前缀法(即类内部Hack):例如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划线"",IE6~IE10都认识"\9",但firefox前述三个都不能认识。(例如*body,_body)
- 选择器前缀法(即选择器Hack)
- 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*/
<!–-[if IE 7]>
<link rel="stylesheet" href="ie7.css" type="text/css" />
<![endif]–->
常见兼容处理范例
.clearfix:after{
content: '';
display: block;
clear: both;
}
.clearfix{
*zoom: 1; /* 仅对ie67有效 */
}
,,,,
.target{
display: inline-block;
*display: inline;/*使元素具有inline属性*/
*zoom: 1;/*触发bfc,就可以设置width和height*/
}
三者的顺序不能改变,因为浏览器的优先级。
浏览器兼容开发利器
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
- 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太暴力,所以它产生。
- 保护有用的浏览器默认样式而不是完全去掉它们
- 一般化的样式:为大部分HTML元素提供
- 修复浏览器自身的bug并保证各浏览器的一致性
- 优化CSS可用性:用一些小技巧,Normalize.css 是模块化的
- 解释代码:Normalize.css 拥有详细的文档
-
Modernizr:国外网站比较常见,用于处理浏览器兼容问题。
Modernizr is a JavaScript library that detects HTML5 and CSS3 features in the user’s browser
给HTML添加很多class,之后给class添加属性。
通过能力检测,进行兼容;执行过程中,会自动检测。
<html class = "no-boxshadow">
.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;
}