CSS hack因为不一样厂商的浏览器,好比Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不一样版本,如IE6和IE7,对CSS的解析认识不彻底同样,所以会致使生成的页面效果不同,得不到咱们所须要的页面效果。 这个时候咱们就须要针对不一样的浏览器去写不一样的CSS,让它可以同时兼容不一样的浏览器,能在不一样的浏览器中也能获得咱们想要的页面效果。
简单的说,CSS hack的目的就是使你的CSS代码兼容不一样的浏览器。固然,咱们也能够反过来利用CSS hack为不一样版本的浏览器定制编写不一样的CSS效果。
CSS Hack大体有三种表现形式 :css
3.如何作
1.根据兼容需求选择技术框架/库(Bootstrap (>=ie8),jQuery 1 (>=ie6), jQuery 2 (>=ie9),Vue (>= ie9)
2.根据兼容需求选择兼容工具(html5shiv.js/respond.js/css reset/normalize.css/modernizr/postCSS)
3.条件注释/css Hack/js 能力检测作一些修补html
4.关于浏览器兼容的应对策略(渐进加强和优雅降级)
渐进加强 progressive enhancement:
概念:针对低版本浏览器进行构建页面,保证最基本的功能,而后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
观点:“渐进加强”观点认为应关注于内容自己。
内容是咱们创建网站的诱因。有的网站展现它,有的则收集它,有的寻求,有的操做,还有的网站甚至会包含以上的种种,但相同点是它们全都涉及到内容。这使得“渐进加强”成为一种更为合理的设计范例。这也是它当即被 Yahoo! 所采纳并用以构建其“分级式浏览器支持 (Graded Browser Support)”策略的缘由所在。
优雅降级 graceful degradation:
概念:一开始就构建完整的功能,而后再针对低版本浏览器进行兼容。
观点:“优雅降级”观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被认为“过期”或有功能缺失的浏览器下的测试工做安排在开发周期的最后阶段,并把测试对象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。
在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无妨 (poor, but passable)” 的浏览体验。你能够作一些小的调整来适应某个特定的浏览器。但因为它们并不是咱们所关注的焦点,所以除了修复较大的错误以外,其它的差别将被直接忽略。
区别:优雅降级是从复杂的现状开始,并试图减小用户体验的供给,而渐进加强则是从一个很是基础的,可以起做用的版本开始,并不断扩充,以适应将来环境的须要。降级(功能衰减)意味着往回看;而渐进加强则意味着朝前看,同时保证其根基处于安全地带。html5
属性前缀法(即类内部Hack)
例如 IE6能识别-, 下划线, 星号,IE7能识别星号*,但不能识别-, 下划线,IE6~IE10都认识\9,但firefox前述三个都不能认识webpack
box{
color: red; _color: blue; /*ie6*/ *color: pink; /*ie67*/ color: yellow\9; /*ie/edge 6-8*/ }
*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有效
条件注释法
这种方式是IE浏览器专有的Hack方式,微软官方推荐使用的hack方式web
<!--[if IE]> 这段文字只在IE浏览器显示 <![endif]--> <!--[if IE 6]> 这段文字只在IE6浏览器显示 <![endif]--> <!--[if gte IE 6]> 这段文字只在IE6以上(包括)版本IE浏览器显示 <![endif]--> <!--[if ! IE 8]> 这段文字在非IE8浏览器显示 <![endif]--> <!--[if !IE]> 这段文字只在非IE浏览器显示 <![endif]-->
条件注释
条件注释 是于HTML源码中被 IE 有条件解释的语句。条件注释可被用来向 IE提供及隐藏代码。 条件注释最初于微软的 Internet Explorer 5浏览器中出现,而且直至 Internet Explorer 9 均支持。微软已宣布于IE10中止支持。具体代码如上已给出。npm
IE Hack
针对IE浏览器编写不一样的CSS的让IE可以正常渲染的过程浏览器
js 能力检测
能力检测又称特性检测。能力检测的目的不是识别具体的浏览器,而是识别浏览器的能力。
能力检测的目的应该是根据你须要的特性来选择问题的解决方案,而不是检测用户在用什么浏览器。并且在检测时要保证你要用到的能力确实存在,本身不要作过多的推测,代码也不要作过多的判断。
两个重要的概念:
第一个概念是先检测达成目的的最经常使用的特性。先检测最经常使用的特性,能够保证代码最优化,由于在多数状况下均可以免测试多个条件。
第二个概念是必须测试实际要用到的特性。一个特性存在,不必定意味着另外一个特性也存在。安全
html5shiv.js
IE 9以前的版本几乎不支持HTML5元素和其它HTML5特性。
HTML5 Shiv支持在旧版Internet Explorer(IE9以前)中使用HTML5细分元素,并为Internet Explorer 6-9,Safari 4.x(和iPhone 3.x)和Firefox 3.x提供基本的HTML5样式。框架
normalize.css
normalize.css是reset.css的替代方案,保留有用的浏览器默认样式,同时进行一些bug的修复。相对平和工具
Modernizr
Modernizr是一套JavaScript 库,用来侦测浏览器是否支持 CSS3 或 HTML5 功能支持状况等。若是浏览器不支持,Modernizr会使用其余的解决方法来进行模拟。
Modernizr 会在页面加载后当即检测特性;而后建立一个包含检测结果的 JavaScript 对象,同时在 html 元素加入方便你调整 CSS 的 class 名。