1.什么是 CSS hack?
同一份代码,在不同的浏览器,甚至同一浏览器的不同版本中,对CSS的解析认识不一样,导致生成的页面效果不一致,写出针对不同浏览器CSS code就称为CSS hack
为什么会有浏览器兼容问题?
同一产品,版本越老 bug 越多
同一产品,版本越新,功能越多
不同产品,不同标准,不同实现方式
由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。
这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能在不同的浏览器中也能得到我们想要的页面效果
2.谈一谈浏览器兼容的思路?
- 从产品的角度:(产品的受众、受众的浏览器比例、效果优先还是基本功能优先)
- 成本的角度: (有无必要做某件事)
- 做到什么程度: 想让哪些浏览器支持哪些效果
- 以上3点是为了确定是否为这几种浏览器以及这些浏览器的旧版本做适配,是否需要写更多的css hack代码做个工作量权衡.
- 如何做根据兼容需求选择技术框架/库(jquery)
根据兼容需求选择兼容工具(html5shiv.js、respond.js、css reset、normalize.css、Modernizr)
postCSS - 条件注释、CSS Hack、js 能力检测做一些修补
渐进增强
- (progressive enhancement): 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验
优雅降级
- (graceful degradation): 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
3.列举5种以上浏览器兼容的写法?
- 条件注释
条件注释 (conditional comment) 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
- 例如第一句,在IE 6浏览器里,会有p标签那句话"You are using Internet Explorer 6",其他浏览器其他IE版本都不会有.
- 条件注释放在HTML头部引用
<!--[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]-->
- 条件注释
项目 | 范例 | 说明 |
---|---|---|
! | [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 |
加一种 '|' (或符合):
| [if (IE 6)|(IE 7)] | IE6或者IE7```
- 2 属性前缀法(即类内部Hack):
例如 IE6能识别下划线""和星号" * ",IE7能识别星号" * ",但不能识别下划线"",IE6~IE10都认识"\9",但firefox前三个都不能认识
box{
color: red;
_color: blue; /ie6/
color: pink; /ie67/
color: yellow\9; /ie/edge 6-8*/
}
- 3 选择器前缀法(即选择器Hack)
IE条件注释法(即HTML条件注释Hack):
针对所有IE(注:IE10+已经不再支持条件注释):
针对IE6及以下版本:
这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效
*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有效等等
- 4.条件注释结合类选择器整体优化
<!DOCTYPE html><html dir="ltr" lang="en-US" class="no-js">
这样在CSS中就不用在属性前面加等一些乱七八糟的前缀*
- 5.
利用Modernizr工具**Modernizr**当你在网页中嵌入Modernizr的脚本时,它会检测当前浏览器是否支持CSS3的特性,比如 @font-face、border-radius、 border-image、box-shadow、rgba() 等,同时也会检测是否支持HTML5的特性——比如audio、video、本地储存、和新的 标签的类型和属性等。在获取到这些信息的基础上,你可以在那些支持这些功能的浏览器上使用它们,来决定是否创建一个基于JS的fallback,或者对那些不支持的浏览器进行简单的优雅降级。另外,Modernizr还可以令IE支持对HTML5的元素应用CSS样式,这样开发者就可以立即使用这些更富有语义化的标签了。[参考文章](http://www.osmn00.com/translation/221.html)可以直接使用Modernizr在元素里生成的class名称,在你的css文件里定义相应的属性以便支持当前浏览器。例如,下面的代码,在支持shadow阴影的浏览器显示shadow,不支持的浏览器显示标准的边框:
.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;}
**书写顺序**
因为CSS只要是同一级别,出现重复属性设置,后出现的会覆盖前面出现的,所以在书写的时候一般把识别能力强的写前面,看个例子
_background-color:red;
background-color:green; ```
如果希望DIV在IE6上是红色,其它是绿色,上面的写法可不可以呢?试一下发现所有浏览器上都是绿色,因为在IE6解析的时候,第一句能够识别,背景设为红色,但是第二句所有浏览器都识别,IE6也不例外,背景颜色又被设为绿色,所以得反过来写
background-color:green;
_background-color:red;```
总结出的规律就是:先一般,再特殊。有兴趣的同学可以试试试试下面CSS,看看和你想的效果是否一样
background-color:blue; /所有浏览器/
background-color:red\9;/所有的ie/
background-color:yellow\0; /* ie8+/
+background-color:pink; /+ ie7*/```
参考资料:
撒玛利亚人博客:css hack
CSS hack一览
4.以下工具/名词是做什么的?
- 条件注释:
- 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
(注:IE10不再支持条件注释)
IE Hack:
针对IE浏览器编写不同的CSS的让IE能够正常渲染的过程
js 能力检测:
能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力。采用这种方式不必顾及特定的浏览器如何如何,只要确定浏览器支持特定的能力,就可以给出解决方案
html5shiv.js:
htnl5shiv主要解决HTML5提出的新的元素不被IE6-8识别,这些新元素不能作为父节点包裹子元素,并且不能应用CSS样式。让CSS 样式应用在未知元素上只需执行 document.createElement(elementName) 即可实现,html5shiv就是根据这个原理创建的.
respond.js:
Respond.js是一个快速、轻量的脚本(3kb minified / 1kb gzipped),它的目标是使得那些不支持CSS3 Media Queryes特性的浏览器能够支持响应性设计,尤其是小于等于8的ie浏览器。它是用这样的方式,尽可能的修补那些不支持的浏览器来支持.
css reset:
为什么会有CSS Reset的存在呢?
那是因为早期的浏览器支持和理解的CSS规范不同,导致渲染页面时效果不一致,会出现很多兼容性问题CSS reset的作用是让各个浏览器的CSS样式有一个统一的基准,而这个基准更多的就是“清零”!normalize.css:
Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性。相比于传统的CSS reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案.
为什么使用它?
保护有用的浏览器默认样式而不是完全去掉它们;
一般化的样式:为大部分HTML元素提供;
修复浏览器自身的bug并保证各浏览器的一致性;
优化CSS可用性:用一些小技巧;
解释代码:用注释和详细的文档来.
参考Modernizr:
Modernizr 是一个很小的用来检测下一代 Web 技术原生实现可用性的 JavaScript 库。
HTML5 和 CSS3 都引入了各自的新特性,但是同时也有很多浏览器不支持这些新特性。
Modernizr 提供了一种简单的方式检测任意新特性,从而让我们可以采取相应的操作
参考postCSS:
PostCSS 是一个使用 JS 插件来转换 CSS 的工具。这些插件可以支持使用变量,混入(mixin),转换未来的 CSS 语法,内联图片等操作。
PostCSS 可以将 CSS 转变成 JavaScript 可以操作的数据格式。基于 JS 写的插件可以完成上面所说的那些操作。PostCSS 本身不会对 CSS 代码作任何修改,她只是为插件提供了一些接口,方便插件完成它们各自的功能
5. 一般在哪个网站查询属性兼容性?
- 输入属性比如block,再点击查看所有(showall)