浏览器兼容

一、如何调试 IE 浏览器?

IE调试的一般方法(css):

  • 使用高版本IE控制台(对于IE7以上)


    IE11的开发者工具
  • border: 1px solid red;(对于IE6以下没有开发者工具,可以使用此方法。看边界来进行调试,这也是调试的重要手段。border不行就再加上background。)
  • outline: 1px solid red;(IE6不支持。)
  • javascript: alert (document.get ...) (在IE里面执行JS,在JS里面写样式进行调试。)


    调试页面

    由于我的jQuery被墙了 ,所以没有看到结果,也是蛮崩溃的。

  • 利用远程服务器,连接到有对应版本的机器上进行调试。
  • 安装多个虚拟机,每个虚拟机安装不同版本的IE浏览器进行测试。


    安装多个XP系统
  • 利用一些可以对不同版本进行切换的工具,比如IEtester、SuperPreview、Xenocode Browser Sandbox (可以实现真正的在线测试,但是有的要收费。)

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

  • CSS hack由于不同的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。
    这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。 简单的说,CSS hack的目的就是使你的CSS代码兼容不同的浏览器。当然,我们也可以反过来利用CSS hack为不同版本的浏览器定制编写不同的CSS效果。
  • CSS hack分类
    CSS Hack大致有3种表现形式,CSS属性前缀法、选择器前缀法以及IE条件注释法(即HTML头部引用if IE)Hack,实际项目中CSS Hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。
  • 属性前缀法(即类内部Hack):比如,IE6能识别下划线和星号,IE7能识别星号,但不能识别下划线,IE6~IE10都认识"\9",但firefox前述三个都不认识。
  • 选择器前缀法(即选择器Hack):例如 IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html .class{}
  • IE条件注释法(即HTML条件注释Hack):针对所有IE(IE10+已经不再支持条件注释) 。这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。例如:
    只在IE下生效
<!--[if IE]> 
<link rel="stylesheet" type="text/css" href="ie.css">
<![endif]-->

只在IE6下生效

<!--[if IE 6]> 
<link rel="stylesheet" type="text/css" href="ie6.css">
<![endif]-->

只在IE6以上版本生效

<!--[if gte IE 6]>
这段文字只在IE6以上(包括)版本IE浏览器显示
<![endif]-->
来个截图

非IE浏览器生效

<!--[if !IE]>
这段文字只在非IE浏览器显示
<![endif]-->

CSS hack现在用的越来越少,能不用尽量不用,可以用最少的hack去实现多浏览器兼容的页面。所以不需要花很大精力去记,有这个概念,知道一些常见的就行。i知道星号是做ie67的hack,下划线是ie6的hack就行。浏览器越老,bug越多,但是越来越不关注这个了。关于CSS hack,可以直接在browserhacks查询。
条件注释可以参考资料史上最全的CSS hack方式一览条件注释与CSS hack

三、列举几种浏览器兼容问题。

下面的测试结果都是在IE7和chrome下测试的,其他版本的IE结果就不贴出来了。

  • 透明度opacity
opacity: 0.4;

如果发现样式效果没有出来,先在Can I use上面查一下是否兼容,再搜一下解决方案。

透明度兼容

可以看到在IE8是部分支持。
未解决之前

解决方案:

filter:alpha(opacity=50);
zoom: 1; /* IE7需要加上这句,来触发hasLayout,不然没有效果。*/
解决之后
  • display: inline-block
    inline元素的display属性设置为inline-block时,所有的浏览器都支持;
    block元素的display属性设置为inline-block时,IE6/IE7浏览器是不支持的。


    未解决之前
  • 解决方案1:
*display: inline; /* 将块级元素设置为内联对象呈递。*/
*zoom: 1;  /* 触发haslayout */
解决之后
  • 解决方案2:
    先使用display: inline-block;属性触发块级元素,然后再定义display:inline;,让块元素呈递为内联对象。需要注意的是,两个display 要先后放在两个CSS声明中才有效果,顺序也不能反了。
div{
    display: inline-block;
}
div{
    *display: inline;
}
解决之后
  • 块级元素的外边距margin无效
    块级元素设置外边距margin无效,行内元素有效果(当然行内元素只有左右的外边距会有效果)。
    块级元素设置外边距

    行内元素设置外边距

    在IE中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸,所以子元素的margin失效。解决方法的思想主要是触发haslayout。
  • 解决方案1:
    给父元素加overflow: hidden;或者overflow: auto;
    解决之后
  • 解决方案2:


    解决之后
  • 解决方案3:
height: 1%; /* 父元素上面 */
解决之后
  • 解决方案4:
zoom: 1;  /* 父元素上面 */
解决之后
  • margin加倍
    给ie6的浮动元素添加margin样式的时候,实际的渲染效果是本身设置的外边距的两倍。解决方案是在这个元素里面加上display: inline;
    这里需要注意的一点是,清除浮动的时候一定要在父元素上加上zoom: 1;,否则没有效果。
    ie6margin加倍

    不过按道理来说,这个margin加倍的情况应该是左右方向上都有的,不知道为什么这里只有左边方向上有。
    解决之后

    ie7margin不加倍

    ie8margin不加倍
  • 文本框不能对齐
    当给input输入框设置了高度之后,在IE9以下会出现文本和文本框不能对齐的现象。
    未解决之前

    解决方案:
    在input里面增加vertical-align: middle;
    解决之后

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

  • 针对兼容问题,首先做个统计,看看使用自己的产品的用户。如果使用IE的比例多(大于5%),可能就要考虑兼容问题。
    针对自己的代码,如果效果没有渲染出来,首先看某个元素是否有问题。怎么看呢,在Can I use上面查一下兼容性(当然也可以自己一步步调试代码,一个个删元素,找到问题所在)。如果不兼容,再搜一下解决方案,因为这些版本都比较老了,遇到的问题一般都已经遇到了,一般可以找到解决方案。
    还可以参考知乎:怎样可以很好地保证网页的浏览器兼容性
  • 渐进增强与优雅降级
  • 渐进增强
    开发时先去兼顾,针对某一版本浏览器做开发。开发之后,再对高级浏览器增加一些特别的、额外的一些效果,使得看起来更好看一些,增强用户体验。
  • 优雅降级
    开发过程中,不用考虑低版本,等开发完成之后,慢慢去作一个适应。只要页面正常,不乱,就可以了,不用追求特别高的还原度。
  • 两者的区别
    渐进增强是从一个比较基础的,从能够起作用的版本开始,然后再对不断扩充,来达到要求。优雅降级则是从比较复杂的现状开始,把设计对象限定为当前主流的浏览器版本。

五、reset.cssnormalize.css分别是做什么的?为什么推荐用nomalize.css?

  • reset.cssnormalize.css
    在html当中,一些标签会有默认的样式,比如body、ul等会有外边距。reset.cssnormalize.css就是去掉默认样式的。当然它们也有区别,normalize.css是一种reset.css的替代方案。
    normalize.css的作用有:保护有用的浏览器的一些默认样式,而不是完全重置;修复浏览器自身的一些bug;优化css可用性;解释代码。
  • 推荐用nomalize.css的原因有以下几点:
  • reset.css比较暴力,它会对所有标签的默认样式重置为一样的效果;而normalize.css比较温和,注重通用的方案,重置掉该重置的样式,保留有用的 user agent 样式
  • normalize.css对一些浏览器的 bug 进行修复;而reset.css是无法做到的。
  • normalilze.css不会让调试工具变得杂乱;而reset.css在浏览器调试工具中有大段的继承链,显得比较杂乱,难看。

综上所述,多种原因导致推荐使用nomalize.css
具体的还可以参考来,让我们谈一谈 Normalize.css以及知乎: Normalize.css 与传统的 CSS Reset 有哪些区别

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

  • IE盒模型设置的width和height不仅仅是指content内容的大小,还包括border边框和padding内边距;而标准盒模型设置的width和height就是content内容的大小。
  • 不添加doctype,也就是IE678怪异模式,使用的是IE盒模型;添加doctype,chrome, ie9+, ie678,使用的是标准盒模型。
  • box-sizing是定义元素盒尺寸大小的方式。它的属性值可以为content-box、padding-box、border-box、inherit。
    box-sizing: border-box;计算方法为width/height=content+padding+border,表示指定的宽度和高度包含边框、内边距和内容区域。这就是上面提到的IE盒模型
    其他计算方式的说明以及DEMO可以参考我的另一篇博客盒模型,这里就不再举例了。

七、操作

  1. virtualbox 安装 xp 虚拟机
    mac
    windows
    在virtualbox安装xp虚拟机

    这里是在virtualbox里面安装了三个xp系统,每个系统安装一个IE浏览器,分别为IE678。
    一开始我安装的是ghost版本,画面一直卡在那里。下载了好几个文件都是无法安装,折腾了蛮久,可能是ghost版本的很多光盘和iso在虚拟机下会出现一定的兼容性问题的原因。后来到msdn.itellyou.cn上找XP的官方系统安装光盘镜像iso文件下载链接,下载到电脑,设置加载这个iso来进行系统安装。结果成功了,超级兴奋。
    msdn.itellyou.cn上搜索“Windows XP”就可以找到,百度云管家离线下载、迅雷下载、QQ旋风下载,都支持ed2k的下载链接。
    安装教程
    在安装过程中会要填一个产品密匙,填入“DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G”就可以。
    这里的xp默认的是IE6,然后再分别下载IE78到两个xp系统中就可以对IE进行测试啦。
    弄好之后如果要实现虚拟机与主机共享粘贴板、拖放,还需安装增强工具包。可以参考如何开启VirtualBox的共享粘贴板功能
  2. 在 ie 6, 7, 8中展示 盒模型inline-blockmax-width的区别。
  • 盒模型
    • ie6


      添加doctype,标准盒模型

      不添加doctype,IE盒模型
    • ie7


      添加doctype,标准盒模型

      不添加doctype,IE盒模型
    • ie8


      添加doctype,标准盒模型

      不添加doctype,IE盒模型

      这里一开始我没有注意,幸亏智远发现了。在上面的截图中,可以看到当IE为IE盒模型的时候,它变成了长方形,高度变高了。因为在盒模型中,撑起高度的就是line-height,所以这里的高度应该就是字体(这里为空白字符)的line-height造成的。经过测试,发现IE678以及11都有这种情况,这应该是IE的一个bug。


      IE8截图

      解决方案就是把字体设为0px就好啦。
      解决之后
    • inline-block

      • 块级元素
      • ie6


        ie6不识别inline-block
      • ie7


        ie7不识别inline-block
      • ie8


        ie8识别inline-block
    • 行内元素
      * ie6


      ie6中行内元素支持inline-block

      可以看到在ie6中,行内元素可以设置宽高。所以在ie6中,行内元素支持inline-block。

      • ie7


        ie7中行内元素支持inline-block

        同理,行内元素在ie7中也支持inline-block。

      • ie8
        ie8中行内元素支持inline-block

        在ie8中,行内元素也支持inline-block。
        Can I use中我们也可以看到,IE67是部分支持。
        inline-block的兼容性
    • max-width

    • ie6


      ie6不支持max-width
    • ie7


      ie7支持max-width
    • ie8


      ie8支持max-width

写在后面的话:由于我自己以前没有安装过系统,一开始这里的xp系统安装花了蛮久的时间,打开系统的界面总是卡住,无法安装。差点就要放弃的时候,换了官方系统光盘镜像结果就真的安装好了。看见蓝天白云的那个桌面的时候心里还是很激动的,花了那么久的时间总算是没有白费。
从这件事上,就感悟到一点。没有什么事会难到你无法完成的地步,只要你肯坚持。所以希望自己加油,以后做事也能做到坚持两个字。


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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 一、如何调试 IE 浏览器 IE7以上版本自带的开发者工具,IE6可以用border的方法;例:IE11的开发者工...
    __Qiao阅读 1,120评论 2 17
  • 一、问答部分 1. 如何调试 IE 浏览器 IE7及以上版本有调试台,可以按F12启动。Paste_Image.p...
    _hello__world_阅读 455评论 0 1
  • 一、如何调试 IE 浏览器? 在IE7以上的版本中可以通过按快捷键F12调出开发人员调试框,如下图IE7以上调试工...
    dengpan阅读 543评论 0 2
  • 20150829—一笑 每当有男生问:那我们玩真心话大冒险吧?我内心都是:去你妈的以为老子不知道你想问什么吗?然而...
    RainyCai阅读 398评论 0 1