浏览器兼容与CSS技巧

1.如何调试 IE 浏览器

<li> IE7以上(包括Edge)自带开发者工具。
Edge:

Edge开发者工具

<li>安装虚拟机,安装各种不同版本的IE来调试。
<li>使用IEtest来模拟运行不同的IE版本。


2.什么是CSS hack?在 CSS 和 HTML里如何写 hack?在 CSS 中 ie6、ie7的 hack 方式?

hack指的是利用浏览器的一个bug来解决另一个bug,CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的,CSS hack就是让你记住这个标准),例如加上 " * " 和" _ " 只有ie6可以识别,其他浏览器默认不会识别这段代码,就做到了只对ie6单独设置的效果。

通过浏览器识别字符标准对应表可以得知:
<li>大部分特殊字符IE浏览器支持,其他主流浏览器firefox,chrome,opera,safari不支持 (opera可识别除外)。
<li>\9 :所有IE浏览器都支持
<li>_和- :仅IE6支持
<li>* :IE6、E7支持
<li>\0 :IE8、IE9支持,opera部分支持
<li>\9\0 :IE8部分支持、IE9支持
<li>\0\9 :IE8、IE9支持

根据此对应表,可以得知:

1.区别IE和非IE浏览器
<li>#tip{ background:blue;非IE背景蓝色 因为所有浏览器都能解释
<li>background:red\9;IE6、IE7、IE8、IE9背景紅色

2.区别IE6,IE7,IE8,FF
<li>#tip{ background:blue;Firefox}背景变蓝色 所有浏览器都支持
<li>background:red\9;IE8背景变红色 IE6、7、8、9支持覆盖上面样式
<li> *background:black;/E7背景变黑色 IE6、7支持又一次覆盖上面样式
<li> _background:orange;IE6背景变橘色,仅IE6支持又一次覆盖上面样式

【说明】:"*"因为IE系列浏览器可读「\9」,而IE6和IE7可读「*」(米字号),另外IE6可辨识「_」(底线),因此可以依照顺序写下来,就会让浏览器正确的读取到自己看得懂得CSS语法,所以就可以有效区分IE各版本和非IE浏览器(像是Firefox、Opera、GoogleChrome、Safari等)。

3.区别IE6、IE7、Firefox
<li>#tip{ background:blue;Firefox背景变蓝色
<li>*background:black;IE7背景变黑色
<li> _background:orange;IE6背景变橘色

【说明】:IE7和IE6可读「*」(米字号),IE6又可以读「_」(底线),但是IE7却无法读取「_」,至于Firefox(非IE浏览器)则完全无法辨识「*」和「_」,因此就可以透过这样的差异性来区分IE6、IE7、Firefox

hack只是解决兼容问题的一种手段,在实际项目过程中,应尽量减少hack的使用,根据不同的项目要求,在编码过程中最好就可以提前考虑到兼容问题。


3.列举几种 浏览器兼容问题

1.IE6、IE7不识别inline-block但可以触发块元素。其它主流浏览器均支持inline-block。
<li>解决IE6、IE7兼容性的方法:
1.首先设置inline-block触发块元素,具有了layout的特性,然后设置display:inline使块元素呈现内联元素,此时layout的特性不会消失。
2.直接设置display:inline,使用zoom:1触发layout。
兼容所有浏览器的方法是:

*display:inline;
*zoom:1;
}```

2.min-height在IE7以下不支持,一般采用把高度写死来解决这个问题。

3.opacity是用来设定元素透明度的, 是CSS 3里的一个属性,IE8以下不支持,包括一些老版本的浏览器也不支持。

.opacity{
filter:alpha(opacity=50); /* IE /
-moz-opacity:0.5; /
老版Mozilla /
-khtml-opacity:0.5; /
老版Safari /
opacity: 0.5; /
支持opacity的浏览器*/
}```


4.针对兼容、多浏览器覆盖有什么看法?渐进增强优雅降级是什么意思?

具体做不做兼容, 兼容到什么程度,不能一概而论,应该根据不同项目来具体调整,主要是项目面向的用户使用各浏览器所占的百分比,一般来说,某个浏览器的用户使用量超过 5% 的时候,就应该对该浏览器进行兼容处理了,反之,为了个别用户量极小的浏览器而特地花费了大量的时间与精力来做兼容,是不可取的;甚至某些通过hack解决的兼容问题会带来其他一些难以预料到的问题,得不偿失。一般来说,兼容程度大致分为三个级别:
A: 好看又好用。
B:好用但不好看,好用但有些外观无法识别。
C:不好看,但功能可以勉强使用。
我们应对于不同的项目要求和不同的浏览器版本灵活选择这三种兼容程度。

渐进增强指的是先在较低版本的、兼容性较差的浏览器上进行编码,以保证正常使用,然后再对其他高版本、兼容性强的浏览器做出一些功能较为强大的编码。

优雅降级渐进增强相反,先在高版本、兼容性强的浏览器实现功能,然后根据要求对低版本浏览器进行兼容处理。

【区别】:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。


5.reset.css和normalize.css分别是做什么的?为什么推荐使用nomalize.css?

<li>reset.css是通过重新定义标签样式,把浏览器的默认样式覆盖掉,以便保持个浏览器渲染的一致性,相对暴力;但是reset仍有自己的优点和应用场景:
1.商业产品,建议使用CSS reset。原因就是浏览器版本迭代越来越快,对设计的还原要求较高的产品,如果浏览器版本升级而影响WEB界面发生细微变化,这是无法接受的。
2.多人协作项目,建议使用CSS reset,为了省事,高效,规范团队。
3.个人项目,比如博客、文档,完全不需要CSS reset。
<li>Normalize 相对「平和」,注重通用的方案,重置掉该重置的样式,保留有用的 user agent 样式,同时进行一些 bug 的修复。Normalize 实际上就是一段CSS代码,通过在HTML开头的引用来达到类似与reset的目的。

创造normalize.css有下面这几个目的:

1.保护有用的浏览器默认样式而不是完全去掉它们
2.一般化的样式:为大部分HTML元素提供
3.修复浏览器自身的bug并保证各浏览器的一致性
4.优化CSS可用性:用一些小技巧
5.解释代码:用注释和详细的文档

Normailze.css的优点:

  1. Normalize.css 保护了有价值的默认值
    Reset通过为几乎所有的元素施加默认样式,强行使得元素有相同的视觉效果。相比之下,Normalize.css保持了许多默认的浏览器样式。这就意味着你不用再为所有公共的排版元素重新设置样式。当一个元素在不同的浏览器中有不同的默认值时,Normalize.css会力求让这些样式保持一致并尽可能与现代标准相符合。

  2. Normalize.css 修复了浏览器的bug
    它修复了常见的桌面端和移动端浏览器的bug。这往往超出了Reset所能做到的范畴。关于这一点,Normalize.css修复的问题包含了HTML5元素的显示设置、预格式化文字的font-size问题、在IE9中SVG的溢出、许多出现在各浏览器和操作系统中的与表单相关的bug。

  3. Normalize.css 不会让你的调试工具变的杂乱
    使用Reset最让人困扰的地方莫过于在浏览器调试工具中大段大段的继承链,如下图所示。在Normalize.css中就不会有这样的问题,因为在我们的准则中对多选择器的使用时非常谨慎的,我们仅会有目的地对目标元素设置样式。

  4. Normalize.css 是模块化的
    这个项目已经被拆分为多个相关却又独立的部分,这使得你能够很容易也很清楚地知道哪些元素被设置了特定的值。因此这能让你自己选择性地移除掉某些永远不会用到部分(比如表单的一般化)。

  5. Normalize.css 拥有详细的文档
    Normalize.css的代码基于详细而全面的跨浏览器研究与测试。这个文件中拥有详细的代码说明并在Github Wiki中有进一步的说明。这意味着你可以找到每一行代码具体完成了什么工作、为什么要写这句代码、浏览器之间的差异,并且你可以更容易地进行自己的测试。
    这个项目的目标是帮助人们了解浏览器默认是如何渲染元素的,同时也让人们很容易地明白如何改进浏览器渲染。

如何使用 normalize.css

首先,安装或从Github下载Normalize.css,接下来有两种主要途径去使用它。
策略一:将normalize.css
作为你自己项目的基础CSS,自定义样式值以满足设计师的需求。
策略二:引入normalize.css
源码并在此基础上构建,在必要的时候用你自己写的CSS覆盖默认值。

<li>引用:来,让我们谈一谈 Normalize.css


6.IE盒模型和标准盒模型有什么区别? 怎样使 IE678使用标准盒模型?box-sizing:border-box有什么作用

盒模型一共有两种模式,一种是标准模式,另一种就是怪异模式。无论使用哪种模式完整定义DOCTYPE,都会触发标准模式,而如果DOCTYPE缺失则在ie6,ie7,ie8下将会触发怪异模式(quirks 模式)。对于盒模型的详细解答在前面的文章盒模型基础中。
box-sizing:border-box其实就是在声明doctype的情况下对盒模型使用怪异模式。
使用场景:
一般来说,百分比为宽度的容器设置padding时,容器的宽度就会像外扩展相应的padding值,要使宽度不被撑开,那么就是用box-sizing:border-box;会控制这种情况。在这种情况下,使用box-sizing:border-box;比较好。
推荐写法:

html {
  box-sizing: border-box;
}
*, *:before, *:after {
 box-sizing: inherit;
}```
【说明】:选择器 * 无法覆盖到伪元素,所以需要给 :before 和 :after 分别设置。而通过继承的方式应用到所有元素,需要时可以方便的设置某个元素及其后代元素的 box-sizing 回 content-box。
***
##7.在 ie 6, 7, 8中展示 **盒模型**、**inline-block**、**max-width**的区别

**由于win10无法使用ietester,所以在XP虚拟机中运行ieteser:**
<li>盒模型代码:

<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>box</title>
<style>
.box {
border: 20px solid #000;
padding: 20px;
margin: 20px;
width: 200px;
height: 200px;
background: red;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>```
1.不加<!doctype html>,在怪异模式下运行代码:

怪异模式下ie 6、7、8的盒模型

2.加<!doctype html>,在标准模式下运行:


标准模式下 ie 6、7、8的盒模型

<li>inline-block 代码:

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>inline-block</title>
  <style>
  .content {
    display: inline-block;
  }
  </style>
</head>
<body>
<div class="content">你好</div>
<div class="content">世界</div>
</body>
</html>```

IE 6、7 中运行:

![](http://upload-images.jianshu.io/upload_images/2399926-94b010e4a8c9451e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

IE 8中运行:

![](http://upload-images.jianshu.io/upload_images/2399926-d6e0a6b181ac74c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

<li>max-width 代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
p {
max-width: 300px;
}
</style>
</head>
<body>
<p>这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。这是一些文本。</p>
</body>
</html>```

IE 6中运行:

IE 7、8中运行:


本文版权归本人和饥人谷所有,转载请注明来源。

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

推荐阅读更多精彩内容