- 什么是 CSS hack
由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。
这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到我们想要的页面效果。
- 属性前缀法(类内部hack)
例如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划线"_",IE6~IE10都认识"\9",但firefox前述三个都不能认识- 选择器前缀法(即选择器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*/
}- 常见属性兼容
inline-block: >=ie8
min-width/min-height: >=ie8
:before,:after: >=ie8
div:hover: >=ie7
inline-block: >=ie8
background-size: >=ie9
圆角: >= ie9
阴影: >= ie9
动画/渐变: >= ie10- inline-block的处理范例
.target{
display: inline-block;/*IE8及以上只生效该条语句*/
*display: inline;
*zoom: 1;/*IE6/7第一条语句不能识别先失效,然后分别识别下列2条语句,触发layout的特性,形成类似BFC的效果*/
}添加class处理浏览器兼容更加简洁明了
- 谈一谈浏览器兼容的思路
要不要做
产品的角度(产品的受众、受众的浏览器比例、效果优先还是基本功能优先)。
根据浏览器受众的比例,一般我们需要兼容的浏览器有IE6/7(针对政府部门的使用用户),如果需要兼容IE6/7,则需以基本功能优先,保证基本的功能的前提下进行其他效果框架的优化(渐进增强);如果是效果优先,比如受众为年轻人,网站为一些直播网站,视频播放网站,那我们一开始就可以使用先进的框架和效果,然后再针对低版本浏览器进行兼容(优雅降级)。
成本的角度 (有无必要做某件事)
如果IE6/7无法兼容的一些简单效果(阴影,圆角),实现起来很复杂,花费成本很高,产生的性价比很低,那我们就需要舍弃做这件事情。
做到什么程度
让某些浏览器支持某些效果
如何做
根据兼容需求选择技术框架/库(jquery),Bootstrap (>=ie8)
jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
Vue (>= ie9)
根据兼容需求选择兼容工具
(html5shiv.js、respond.js、css reset、normalize.css、Modernizr)
postCSS
条件注释、CSS Hack、js 能力检测做一些修补
- 列举5种以上浏览器兼容的写法
条件注释
<script>alert(1);</script>
/*在非IE上执行这段代码*/
项目 | 范例 | 说明 |
---|---|---|
! | [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版本执行不同代码
IE Hack:利用IE版本的不同BUG来实现我想要的CSS效果在不同IE版本的呈现
js 能力检测:也叫性能检测,目标不是识别特定的浏览器,而是识别浏览器的能力;能力检测对于想知道某个特性是否会按照适当方式行事非常有用。
html5shiv.js:用js语法创建一个在IE低版本中无法使用的类似功能的标签
respond.js:在IE6/7/8中模拟CSS3中的媒体查询
@media screen and (min-width: 480px){
/** ...styles for 480px and up go here **/
}
css reset:对默认样式进行重置;根据具体需求,适量裁剪和修改后再使用。CSS RESET 介绍用法链接地址
normalize.css:相比于传统的CSS Reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案。该方案在Github上
Modernizr:运行的时候它会在html元素上添加一批CSS的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性,支持的特性就直接显示该特性的名称作为一个class(例如:canvas,websockets),不支持的特性显示的class是“no-特性名称”(例如:no-flexbox)
postCSS:使用PostCSS插件实现跨浏览器的兼容性和CSS样式的压缩与优化,特别是对于IE老版本做降级处理。 - 一般在哪个网站查询属性兼容性?
这个网站查询不同CSS属性在浏览器的兼容情况
can i use
这个网站可以查询到不同浏览器不同版本的某些属性兼容的写法
browserhacks
这个网站可以看到当前市场上浏览器的使用比例和其他一些流量统计情况
百度统计网