浏览器兼容

  • 什么是CSS hack?

不同厂商的浏览器,或同一厂商不同版本的浏览器,对css的解析识别是不一样的,因此同样的一份css代码,在不同浏览器下会有不一样的表现。这时为了达到我们想要页面效果,就要为不同的浏览器写不一样的css代码,让它能兼容不同的浏览器,在不同的浏览器上得到我们想要的效果,这就是CSS hack。
简单的说,CSS hack的目的就是使你的CSS代码兼容不同的浏览器。

  • 谈一谈浏览器兼容的思路。

1.要不要做兼容?
对于一个网站,我们要大致了解它的受众人群,受众的浏览器,要确定这个网站是效果优先还是基本功能优先,里面的有些效果是否有必要实现等等,通过这些来确定浏览器是否要做兼容。
2.做到什么程度?
兼容IE6?兼容IE7?还是都兼容?
3.选择合适的工具进行开发
根据兼容需求选择技术框架/库(jquery等);
根据兼容需求选择兼容工具(html5shiv.js、respond.js、css reset、normalize.css、Modernizr
postCSS);
条件注释、CSS Hack、js 能力检测做一些修补。

总结:
渐进增强(progressive enhancement): 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验;
优雅降级 (graceful degradation): 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

  • 列举5种以上浏览器兼容的写法。

1.条件注释
条件注释是在HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
条件注释对IE的版本和IE非IE有优秀的区分能力,是web设计中常用的hack方法。

    <!--[if IE 6]> /*如果是IE6,则<p>生效*/
    <p>You are using Internet Explorer 6.</p>
    <![endif]-->
    <!--[if !IE]><!--> /*如果是非IE,则<script>生效*/
    <script>alert(1);</script>
    <!--<![endif]-->
    <!--[if IE 8]> /*如果是IE8,则<link>生效*/
    <link href="ie8only.css" rel="stylesheet">
    <![endif]-->

注意:IE10以后不再支持条件注释。

项目 示例 说明
<if !IE> 非IE
lt <if lt IE6> 小于IE6
lte <if lte IE6> 小于等于IE6
gt <if gt IE6> 大于IE6
gte <if gte IE6> 大于等于IE6

2.css属性前缀法
IE6能识别下划线""和星号" * ",IE7能识别星号" * ",但不能识别下划线"",IE6~IE10都认识"\9",但firefox前述三个都不能认识。因此我们可以利用这些特性,针对不同浏览器添加只有该浏览器能识别的css代码,完成hack
示例:

/*在不同浏览器下有不一样的颜色表现*/
.box{
  color: red;
  _color: blue; /*ie6*/
  *color: pink; /*ie67*/
  color: yellow\9;  /*ie/edge 6-8*/
}
/*在firefox总是绿色的,IE6总是红色的*/
div{
background:green;/*forfirefox*/
*background:red;/*forIE6*/(bothIE6&&IE7)
}

3.选择器前缀法
与属性前缀法类似,针对一些页面表现不一致或者需要特殊对待的浏览器,在CSS选择器前加上一些只有某些特定浏览器才能识别的前缀进行hack。

/*常见的选择器hack*/
*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.使用Mordernizr.js
Modernizr 是一个用来检测浏览器功能支持情况的 JavaScript 库,运行的时候它会在html元素上添加一批CSS的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性,支持的特性就直接显示该天特性的名称作为一个class(例如:canvas,websockets),不支持的特性显示的class是“no-特性名称”(例如:no-flexbox),下面这段代码是运行在Chrome下的效果:

<html class=" js flexbox canvas canvastext webgl no-touch geolocation postmessage 
              websqldatabase indexeddb hashchange history draganddrop websockets 
        rgba hsla multiplebgs backgroundsize borderimage borderradius 
        boxshadow textshadow opacity cssanimations csscolumns cssgradients
        cssreflections csstransforms csstransforms3d csstransitions fontface 
         generatedcontent video audio localstorage sessionstorage webworkers 
              applicationcache svg inlinesvg smil svgclippaths">

它显示了chrom浏览器下支持和不支持的特性。
下面是它的一个运用示例,在支持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;
}

如果浏览器支持boxshadow,Modernizr就会在html上添加class=boxshadow,对应到css中生成阴影,如果不支持,则生成class=no-boxshadow,对应到css中生成边框。

  • 以下工具/名词是做什么的?

条件注释

条件注释是在HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码。
条件注释对IE的版本和IE非IE有优秀的区分能力,是web设计中常用的hack方法。

    <!--[if IE 6]> /*如果是IE6,则<p>生效*/
    <p>You are using Internet Explorer 6.</p>
    <![endif]-->
    <!--[if !IE]><!--> /*如果是非IE,则<script>生效*/
    <script>alert(1);</script>
    <!--<![endif]-->
    <!--[if IE 8]> /*如果是IE8,则<link>生效*/
    <link href="ie8only.css" rel="stylesheet">
    <![endif]-->

IE hack

针对IE,对css进行hack,保证css能在IE下被正常解析识别。

JS 能力检测

用JS对浏览器支持什么特性进行检测,针对某些特性,给出特定的解决方案,这是解决浏览器兼容的一种检测。

html5shiv.js

IE浏览器由于对html5不能很好的支持(IE9以上部分支持,IE6/IE7/IE8不支持),导致许多用html5编写的网站不能用IE正常访问。html5shiv.js是一个js库,它通过模拟的方式,使IE可以正常访问html5编写的页面。

respond.js

IE6-IE8不支持媒体查询,使用respond.js可以使IE6-IE8支持媒体查询。

css reset

对浏览器的默认样式进行重置

normalize.css

normalize.css是css reset发展的产物,如果说reset是把浏览器的一切默认样式都进行重置,那么normalize.css的理念则是尽量保留浏览器的默认样式,不进行太多的重置。

Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性。相比于传统的CSS Reset,Normalize.css是一种现代的、为HTML5准备的优质替代方案。Normalize.css现在已经被用于Twitter Bootstrap、HTML5 Boilerplate、GOV.UK、Rdio、CSS Tricks 以及许许多多其他框架、工具和网站上。

Modernizr

Modernizr 是一个用来检测浏览器功能支持情况的 JavaScript 库,运行的时候它会在html元素上添加一批CSS的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性,支持的特性就直接显示该天特性的名称作为一个class(例如:canvas,websockets),不支持的特性显示的class是“no-特性名称”(例如:no-flexbox),下面这段代码是运行在Chrome下的效果:

<html class=" js flexbox canvas canvastext webgl no-touch geolocation postmessage 
              websqldatabase indexeddb hashchange history draganddrop websockets 
        rgba hsla multiplebgs backgroundsize borderimage borderradius 
       boxshadow textshadow opacity cssanimations csscolumns cssgradients
      cssreflections csstransforms csstransforms3d csstransitions fontface 
        generatedcontent video audio localstorage sessionstorage webworkers 
              applicationcache svg inlinesvg smil svgclippaths">

postCSS

postCSS可以理解为后编译器,它提供了一个平台,在平台上我们可以用js开发一些插件(如autoprefixer)来处理我们的css文件,我们只要正常的编写css,postcss就可以帮我们自动生成具有兼容性的css。

  • 一般在哪个网站查询属性兼容性?

caniuse.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 什么是 CSS hack CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什...
    怎么昵称阅读 378评论 0 1
  • CSS Hack 不同的浏览器对某些CSS代码解析会存在一定的差异,因此就会导致不同浏览器下给用户展示的页面效果不...
    zx9426阅读 376评论 0 0
  • 一、如何调试 IE 浏览器? 在IE7以上的版本中可以通过按快捷键F12调出开发人员调试框,如下图IE7以上调试工...
    dengpan阅读 541评论 0 2
  • 一、问答部分: 1. 如何调试 IE 浏览器? 如果是IE7版本以上可以使用自带的开发者工具,按F12,即可打开:...
    小木子2016阅读 516评论 0 0
  • 扶栏遥望双亭,千帆始渡粼波里。 两河交汇,商旅云聚,盛唐景气。 诗圣挥情,岷山雪照,东吴踪迹。 却道迎送往,陆翁所...
    冰熙舍人阅读 751评论 4 12