论:浏览器兼容

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): 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

stackoverflow-渐进增强和优雅降级的区别

3.列举5种以上浏览器兼容的写法?

    1. 条件注释

条件注释 (conditional comment) 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。

  • 例如第一句,在IE 6浏览器里,会有p标签那句话"You are using Internet Explorer 6",其他浏览器其他IE版本都不会有.
  • 条件注释放在HTML头部引用
    
    
    
    
    


  • 条件注释
项目 范例 说明
[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.条件注释结合类选择器整体优化

这样在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. 一般在哪个网站查询属性兼容性?

caniuse.com

  • 输入属性比如block,再点击查看所有(showall)

你可能感兴趣的:(论:浏览器兼容)