浏览器兼容

作者: __Qiao | 来源:发表于2016-07-11 12:33 被阅读651次

    一、如何调试 IE 浏览器

    • IE7以上版本自带的开发者工具,IE6可以用border的方法;
      例:IE11的开发者工具
    1.png
    • 采用模拟器的方式去模拟不同版本下的IE浏览器,如ietester;
      例:ietester
    2.png
    • 通过安装虚拟机的方式,安装不同版本的IE运行环境去达到调试IE浏览器的目的。
      例:用虚拟机安装不同版本浏览器
    3.png

    高版本IE浏览器的开发者工具很不错,可以选择不同版本模式进行调试;ietester可以创建不同版本的浏览器,但感觉不是很好用;个人还是比较喜欢用虚拟机安装不同版本浏览器的方式,感觉更真实。

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

    • 什么是CSS hack

      由于不同厂商的浏览器或某浏览器的不同版本(如IE6-IE11,Firefox,Safari,Opera,Chrome等),对CSS的支持、解析不一样,导致在不同浏览器的环境中呈现出不一致的页面展现效果。这时,我们为了获得统一的页面效果,就需要针对不同的浏览器或不同版本写特定的CSS样式,我们把这个针对不同的浏览器/不同版本写相应的CSS code的过程,叫做CSS hack。

    • CSS hack的原理

      由于不同浏览器和浏览器各版本对CSS的支持及解析结果不一样,以及CSS优先级对浏览器展现效果的影响,我们可以据此针对不同的浏览器情景来应用不同的CSS。

    • 在 CSS 和 HTML里如何写 hack

      CSS hack大致有3种表现形式,CSS属性前缀法、选择器前缀法以及IE条件注释法(即HTML头部引用if IE)Hack,实际项目中CSS hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。

      • 属性前缀法(即内部Hack):

        在CSS样式属性名前加上只有特定浏览器在能识别的hack前缀,以达到预期的页面展现效果。

          .container{
              _color: red;/*IE6识别*/
              *color: red;/*IE6,IE7识别*/
              color: red\9;/*IE6-IE10识别*/
              color: red\0;/*IE8-IE10识别*/
              color: red\9\0;/*IE9,IE10识别*/
          }
        
      • 选择器前缀法(即选择器hack):

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

          *html{}/*只对IE6生效*/
          *+html{}/*只对IE7生效*/
        
      • IE条件注释法(即HTML条件注释hack):(注:IE10+已经不再支持条件注释)这类hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。

        只在IE下生效

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

        只在IE6下生效

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

        只在IE6以上版本生效

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

        只在IE6以下版本生效

          <!--[if lte IE 6]>
          这段文字只在IE6以下(包括)版本IE浏览器显示
          <![endif]-->
        

        只在IE8上不生效

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

        非IE浏览器生效

          <!--[if ! IE]>
          这段文字只在非IE浏览器显示
          <![endif]-->
        
    • 在 CSS 中 ie6、ie7的 hack 方式

      • IE6
        • 属性前缀法:

            .box{
                _color: red;/*for IE6*/
            }
          
        • 选择器前缀法:

            *body{}/*for IE6*/
          
        • 条件注释法:

            <head>
                <!--[if IE 6]>
                    <body class="ie6">
                <![endif]-->
            </head>
          
      • IE7
        • 选择器前缀法:

            *+body{}/*for IE7*/
          
        • 条件注释法:

            <head>
                <!--[if IE 7]>
                    <body class="ie7">
                <![endif]-->
            </head>
          
      • IE6~IE7
        • 属性前缀法:

            .box{
                *color: red;/*for IE6~7*/
            }
          
        • 选择器前缀法:

            @media screen\9{...}
          
        • 条件注释法:

            <head>
                <!--[if lte IE 7]>
                    <body class="ie6 ie7">
                <![endif]-->
            </head>
          

    参考:
    史上最全的CSS hack方式一览
    Browserhacks

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

    1. 不同浏览器的默认标签的margin和padding不同
      解决办法:

       *{margin: 0; padding: 0;}
      

      备注:这是最常见的也是最易解决的一个浏览器兼容性问题。

    2. 块级元素设置float后,又有左右margin的情况下,IE6显示的margin比设置的大
      解决办法:在float的标签样式中加入display: inline;将其转化为行内元素
      备注:我们最常用的就是div+css布局了,而div就是一个典型的块级元素,横向布局时我们通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。

    3. 设置较小高度的标签(一般小于10px),在IE6、IE7中高度超出自己设置的高度
      解决办法:给超出高度的标签设置overflow: hidden;或者设置行高line-height小于设置的高度
      备注:这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。

    4. 行内元素,设置display: block;后采用float布局,又有左右margin的情况,IE6显示的margin比设置的大
      解决办法:在display: block;后面加入display: inline; display: table;
      备注:行内元素,为了设置宽高,我们需要设置display: block;(除了input标签比较特殊)。在float布局并有横向的margin后,在IE6下,它就具有了块级元素float后的横向margin的bug。不过因为它本身就是行内元素,所以我们再加上display: inline;的话,它的高度就不可设了。这时候我们还需要在display: inline;后面加入display: table;

    5. 图片默认有间距:几个img标签放在一起时,有些浏览器会有默认的间距,加了margin:0; padding:0;也不起作用
      解决办法:使用float属性为img布局
      备注:因为img标签是行内标签,所以只要不超出容器宽度,img标签都会排在一行,但是部分浏览器的img标签之间会个间距。

    6. 标签设置min-height不兼容
      解决办法:如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto!important; height:200px; overflow:visible;}
      备注:在B/S系统前端开发时,有很多情况下我们有这种需求。当内容小于一个值(如300px)时,容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时我们就会面临这个兼容性问题。

    7. 透明度的问题
      解决办法:

       selector{
           filter: alpha(opacity=50);/*for IE*/
           -moz-opacity: 0.5;/*for old versions of the Mozilla browsers*/
           -khtml-opacity: 0.5;  /* for old versions of Safari*/
           opacity: 0.5;
       }
      

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

    • 对兼容、多浏览器覆盖的看法:
      首先要针对项目本身进行调研,查看目标人群使用的浏览器情况,一般情况对于使用人群小于5%的就可以忽略了,因为所谓的兼容和覆盖全部浏览器这本身就是不现实的,而且涉及到时间和成本的问题,还有一些暂时无法解决的兼容性bug等,这些都需要综合考虑。
    • 渐进增强(progressive enhancement):针对低版本浏览器进行构建页面,保证最基本的功能,然后在针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
    • 优雅降级(graceful degradation):一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
    • 优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。
      参考
      知乎:怎样可以很好地保证网页的浏览器兼容性

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

    • reset.css是通过重新定义标签样式,把浏览器的默认样式覆盖掉,以便保持个浏览器渲染的一致性。相对暴力
      normalize.css是reset.css的替代方案,保留有用的浏览器默认样式,重置掉该重置的样式,同时进行一些bug的修复。相对平和

      引用知乎上的回答:

    CSS Reset是革命党,CSS Reset里最激进那一派提倡不管你小子有没有用,通通给我脱了那身衣服,凭什么你body出生就穿一圈margin,凭什么你姓h的比别人吃得胖,凭什么你ul戴一胳膊珠子。于是*{margin:0;}等等运动,全把人家拍扁了。看似是众生平等了,实则是浪费了资源又占不到便宜,有求于人家的时候还得贱贱地给加回去,实在需要人家的默认样式了怎么办?人家过都扔炉子里烧了,自己看着办吧。
    Normalize.css是改良派。他们提倡,各个元素都有其存在的道理,简单粗暴地一视同仁是不好的。body那一圈确实挤压了页面的生存空间,那就改掉。士农工商,谁有谁的作用,给他们指定个规范,确保他们在任何浏览器里都干好自己的活儿。

    知乎: Normalize.css 与传统的 CSS Reset 有哪些区别

    • Normalize vs Reset
      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

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

    • IE盒模型和标准盒模型的区别
      IE盒模型:宽度(width)=边框(border)+内边距(padding)+内容宽度(content)
      标准盒模型:宽度(width)=内容宽度(content)
    • 怎样使IE678使用标准盒模型
      IE不添加doctype时(怪异模式)使用的是IE盒模型,要想使IE678使用标准盒模型,给IE678添加doctype即可。
    • box-sizing: border-box;是CSS3新增属性,设置此属性之后,相当于以怪异模式解析。
      通常一个块级元素实际所占宽高度=外边距(margin)+边框(border)+内边距(padding)+宽/高度(width/height
      如果设置了box-sizing: border-box;,实际所占宽高度=宽高度(width/height)+外边距(margin
      如图所示:
    4.png

    操作

    1. virtualbox 安装 xp 虚拟机

    5.png

    用Virtualbox虚拟机安装Windows XP/7、Win7系统详细图文教程

    网上下载的很多XP系统都是默认的IE8浏览器,而且没法卸载,安装纯净版的XP系统就可以很方便的卸载IE8还原到IE6。
    系统之家 GHOST XP SP3 纯净版 V2014.12

    xp怎样把ie8变回ie6?

    VirtualBox启动虚拟机报错0x80004005

    虚拟机与主机共享粘贴板、拖放,还需安装增强工具包
    如何为VirtualBox安装 Guest Additions/增强工具包/功能增强包/增强功能包

    2. IE盒模型

    代码如下:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>盒模型</title>
        <style>
            .box{
              width: 100px;
              height: 100px;
              margin: 10px;
              padding: 20px;
              border: 10px solid #ccc;
              background: red;
            }
        </style>
    </head>
    <body>
      <div class="box"></div>
    </body>
    <html>
    
    6.png

    下面通过设置固定宽高,改变margingpaddingborder来展示IE盒模型:

    7.png 8.png 9.png 10.png

    3. inline-block

    代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>inline-block</title>
     <style>
        .inline-block{
            display: inline-block;
            width: 100px;
            height: 100px;
            margin: 10px;
            padding: 20px;
            border: 10px solid #ccc;
            background: red;
        }
    </style>
    </head>
    <body>
        <div class="inline-block"></div>
        <div class="inline-block"></div>
        <a class="inline-block" href=""></a>
        <a class="inline-block" href=""></a>
    </body>
    <html>
    
    • IE8
      IE8支持inline-block
    11.png
    但是IE8兼容性视图中,对块级元素设置`inline-block`不起作用,如图所示:
    
    12.png
    • IE7
      IE7也是块级元素不支持inline-block,行内元素支持,如图:
    13.png
    • IE6
      IE6也是块级元素不支持inline-block,行内元素支持
    14.png

    4. max-width

    代码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>max-width</title>
    <style>
        .block{
            display: block;
            max-width: 100px;
            max-height: 100px;
            margin: 10px;
            padding: 20px;
            border: 10px solid #ccc;
            background: red;
        }
        .inline-block{
            display: inline-block;
            max-width: 100px;
            max-height: 100px;
            margin: 10px;
            padding: 20px;
            border: 10px solid #ccc;
            background: red;
        }
    </style>
    </head>
    <body>
        <div class="block">
        </div>
        <div class="inline-block">max</div>
        <a class="block" href="">max</a>
        <a class="inline-block" href="">max</a>
    </body>
    <html>
    
    • IE8
      IE8中块级元素不支持max-width,浏览器自动将max-width解析为width。设置了inline-block的元素支持max-width
    15.png
    • IE7
      IE7中块级元素不支持max-width,浏览器自动将max-width解析为width。设置了inline-block的行内元素支持max-width
    16.png
    • IE6
      IE6中块级元素不支持max-width,浏览器并未将max-width解析为width。设置了inline-block的行内元素支持max-width
    17.png

    本文版权属吴天乔所有,转载务必注明出处。

    相关文章

      网友评论

      • 饥人谷_青青: :stuck_out_tongue: 恭喜被评选为 饥人谷2016.07.11最优技术博客!
        __Qiao:@饥人谷_青青 😊谢谢青青

      本文标题:浏览器兼容

      本文链接:https://www.haomeiwen.com/subject/umqjjttx.html