什么是 CSS hack
CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。
简单的说,CSS hack的目的就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用CSS hack为不同版本的浏览器定制编写不同的CSS效果。
谈一谈浏览器兼容的思路
-
为什么会有浏览器兼容问题
- 同一浏览器,版本越老 bug 越多;
- 同一浏览器,版本越新,支持的特性越多;
- 不同浏览器,标准不同,实现方式也有差异。
-
处理兼容问题的思路
- 要不要做
- 产品的角度(产品的受众、受众的浏览器比例、效果优先还是基本功能优先);
- 成本的角度 (有无必要做某件事)
- 做到什么程度
让哪些浏览器支持哪些效果; - 如何做
- 根据兼容需求选择技术框架/库(如jquery 1.x.x);
- 根据兼容需求选择兼容工具:html5shiv、Respone.js、CSS Reset、normalize.css、Modernizr.js、postcss。
- 条件注释、CSS Hack、js 能力检测做一些修补
-
渐进增强和优雅降级
- 渐进增强(progressive enhancement): 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验
- 优雅降级`(graceful degradation): 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
列举5种以上浏览器兼容的写法
#box{
color:red; ⁄* 所有浏览器都支持 *⁄
color:red !important; ⁄* Firefox、IE7支持 *⁄
_color:red; ⁄* IE6支持 *⁄
*color:red; ⁄* IE6、IE7支持 *⁄
*+color:red; ⁄* IE7支持 *⁄
color:red \9; ⁄* IE6、IE7、IE8支持 *⁄
color:red \0; ⁄* IE8支持 *⁄
}
* , ie6,ie7可以识别;
_和- , ie6可以识别;
!important ,表示高优先级,ie7及以上,firefox都支持,ie6认识带!important的样式属性,但不认识!important的优先级;
-webkit- ,针对safari,chrome浏览器的内核CSS写法
-moz-,针对firefox浏览器的内核CSS写法
-ms-,针对ie内核的CSS写法
-o-,针对Opera内核的CSS写法
以下工具/名词是做什么的
- 条件注释
是HTML源码中被 Microsoft Internet Explorer有条件解释的语句。条件注释可被用来向 Internet Explorer 提供及隐藏代码。 - IE Hack
处理各个浏览器兼容问题。 - js 能力检测
浏览器的能力检测目标不是检测特定的浏览器,而是检测浏览器的能力。这样,只需要检测浏览器是否支持特定的能力,就可以给出特定的解决方案。这一部分检测是解决浏览器兼容问题的主要检测。 - html5shiv.js
由于IE6/IE7/IE8还有很大一部分用户,为了让网站浏览者都能正常的访问HTML5网站,解决方案就有下面:- 使用Javascript来使不支持HTML5的浏览器支持HTML标签。目前大多网站采用的这种方式(Bootcss官方例子也是如此)。
- 利用脚本document.createElement(“”)创建对应的脚本,CSS选择器便可正确应用到该标签。
- 考虑到IE9是支持html5的,所以直接在HTML页面的head标签中添加脚本引用即可。
- respond.js
Respond.js 是一个快速、轻量的 polyfill,用于为 [IE]6-8 以及其它不支持 CSS3 Media Querie 的浏览器提供媒体查询的 min-width 和 max-width 特性,实现响应式网页设计(Responsive Web Design)。 - css reset
将浏览器的默认样式全部去掉,更准确说就是通过重新定义标签样式。“覆盖”浏览器的CSS默认属性。最最简单的说法就是把浏览器提供的默认样式覆盖掉!这就是CSS reset。 - normalize.css
Normalize.css 是一个可以定制的CSS文件,它让不同的浏览器在渲染网页元素的时候形式更统一。
- 保留有用的默认值,不同于许多 CSS reset 的简单粗暴。
- 标准化的样式,适用范围广的元素。
- 纠正错误和常见的浏览器的不一致性。
- 一些细微的改进,提高了易用性。
- 使用详细的注释来解释代码。
- Modernizr
Modernizr 是一个很小的用来检测下一代 Web 技术原生实现可用性的 JavaScript 库。
HTML5 和 CSS3 都引入了各自的新特性,但是同时也有很多浏览器不支持这些新特性。
Modernizr 提供了一种简单的方式检测任意新特性,从而让我们可以采取相应的操作。比如,浏览器还不支持视频特性,那么我们可以显示一个简单的页面。
我们还可以基于某个特性的可用性来创建 CSS 规则,如果浏览器不支持某个新特性,那么这些规则将会自动应用到网页上。 - postCSS
它可以被理解为一个平台,可以让一些插件在上面跑,它提供了一个解析器,可以将CSS解析成抽象语法树,通过PostCSS这个平台,我们能够开发一些插件,来处理CSS。热门插件如autoprefixer,它可以帮我们处理兼容问题,只需正常写CSS,autoprefixer可以帮我的自动生成兼容性代码。