zoukankan      html  css  js  c++  java
  • 浏览器兼容问题

    所有浏览器 通用
    height: 100px;

    IE6 专用
    _height: 100px;

    IE6 专用
    *height: 100px;

    IE7 专用
    *+height: 100px;

    IE7、FF 共用
    height: 100px !important;

     


    程序代码

    height:100px;
    *height:120px;
    _height:150px;

    下面我简单解释一下各浏览器怎样理解这三个属性:

    在FF下,第2、3个属性FF不认识,所以它读的是 height:100px;

    在IE7下,第三个属性IE7不认识,所以它读第1、2个属性,又因为第二个属性覆盖了第一个属性,所以IE7最终读出的是第2个属性 *height:120px;

    在IE6下,三个属性IE6都认识,所以三个属性都可以读取,又因为第三个属性覆盖掉前2个属性,所以IE6最终读取的是第三个属性。


     

    1.为什么在不同的浏览器显示效果不一样? 
    因为不同浏览器对于css样式表的解析不一样,所以导致样式乃至层布局发生变化。例如,ff中设置padding属性时,div会相应增加height和width,而ie的解析是不会的,再例如ff对盒模型的解析和ie相差两个象素。

    2.设计时要做到所有浏览器都兼容吗? 
    根据“设计诉说”的站点统计小样本结果显示,6225个访问者中有72.1%使用IE6.0;12.7%使用IE7.0;7.9%在使用FF2.0,剩余的不同版本的浏览器占的百分比都不到1% 。所以我认为只要做到IE6 FF2.0 以及新出的IE7.0兼容即可,顶多向下兼容一下IE5.5,完全没有必要为了那些个小数点费劲脑子。如果有必要可以另外设计css文件,然后通过js判断浏览器版本进行选择相应的文件。

    3.css样式的优先级是怎么样的? 
    在正常的IE中,如果你在css中重复定义一个属性时,浏览器解析的是后面的属性,

    示例:box {height:100px;height:200px;height:400px;height:300px;}


    <1> 区分三款浏览器简单方法: 
    #example { color: #333; } /* Moz FF */ 
    * html #example { color: #f0f; } /* IE6 */ 
    *+html #example { color: #0ff; } /* IE7 */ 
    在兼容IE7的*+html的hack一定要在顶部加入DTD声明,否则无效。

    <2> ie7.0与ie6.0的之间不兼容 
    ie7与ie6 在div+css出现宽度定义不同,在宽度定义上出现宽度的解释不同

    IE7宽度在IE6上要宽一些,正是这个原因网页可能会出现溢出问题, 还好这个问题可以通过更改数值或者修改一下百分比解决.。

    ie7.0修复了!important这个bug。

    先前由于ie6.0对!important识别存在bug, 在firefox和IE中的BOX模型解释不一致导致相差2px,大部分网页标准设计师通过这个bug来兼容 ie6.0和firefox,

    即采用:div {margin:30px!important;margin:28px;}。

    但是ie7.0把这个bug给修复了,所以问题又出现了,怎么兼容 ie.7.0的同时又能兼容ie6.0和firefox?

    不过ie7 也能识别!important 也可以通过这个来区分IE6。 ie7.0对很多不规范的css不再支持,对js语法要求更严格规范。 很多在IE6下正常显示的js页面,在IE7下均不能正常显示,并且还没有提示错误。

    ie7.0对js语法要求更严格规范,只是这个规范似乎并没有说明,也没有明白的告诉大家,他们是怎么“规”怎么“范”的 .

     

    <3> 如何做到让IE6.0与FF兼容? 
    最常用的一种方法了,也是屡试不爽的——“!important”,这个字段是用来提高优先级的,而IE6.0对于找个字段是无法识别的,于是FF与 IE6.0就可以分开解析。

     

    注意事项: 
    1、float的div一定要闭合。 
    例如:(其中floatA、floatB的属性已经设置为float:left;) 
    < #div id="floatA" > 
    < #div id="floatB" > 
    < #div id="NOTfloatC" > 
    这里的NOTfloatC并不希望继续平移,而是希望往下排。这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将 float标签闭合。

    在 
    < #div class="floatB"> 
    < #div class="NOTfloatC"> 
    之间加上 
    < #div class="clear"> 
    这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。

    此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;

    当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性,用zoom:1;可以做到,这样就达到了兼容。

    例如某一个wrapper如下定义:colwrapper{overflow:hidden;zoom:1;margin:5px auto;}

     

    2、margin加倍的问题 
    设置为float的div在ie下设置的margin会加倍,这是一个ie6都存在的bug。

    解决方案是在这 个div里面加上display:inline

    相应的css为 
    #IamFloat{ 
                       float:left; 
                       margin:5px;/*IE下理解为10px*/ 
                       display:inline;/*IE下再理解为5px*/}

     

    3、关于容器的包涵关系 
    很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。

    一定要用Photoshop或者Firework量取像素级的精度。

     

    4、关于高度的问题 
    如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。

     

    5、最狠的手段 —— !important; 
    如果实在没有办法解决一些细节问题,可以用这个方法。FF对于”!important”会自动优先解析,然而IE则会忽略,

    值得注意的是,一定要将 xxxx !important 这句放置在另一句之上.

     

    6.DOCTYPE 影响 CSS 处理

     

    7.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行.

     

    8.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中.

     

    9.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width.

     

    10.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式

     

    11.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了 。缺点是要控制内容不要换行

     

    12.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以.

     

    13.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。

        参照 menubar, 给 a 和 menubar 设置高 度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

     

    14.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:

    div{margin:30px!important;margin:28px;}

    注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。

    所以在IE下其实解释 成这样: 

    div{maring:30px;margin:28px} 
    重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important; 
      

    15.IE5 和IE6的BOX解释不一致 

    IE5下 :div{300px;margin:0 10px 0 10px;} 

    div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填 充)+10px(左填充)=320px来计算的。

    这时我们可以做如下修改:
    div{300px!important;width /**/:340px;margin:0 10px 0 10px} 

    16.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值,

    所以先定义 :ul{margin:0;padding:0;}     就能解决大部分问题

     

    17.ff下父容器的高度自适应 
      height:100%; overflow:auto

     

    18.各浏览器padding兼容 
    padding:0px;  /*ff*/ 
    *padding:0px; /*ie7.0*/ 
    _padding:0px; /*ie6.0 */

     

    19.img 下的留白

    大家看这段代码有啥问题: 
    <div> 
    <img src=”" mce_src=”" /> 
    </div> 
    把div的border打开,你发现图片底部不是紧贴着容器底部的,是img后面的空白字符造成,要消除必须这样写 
    <div> 
    <img src=”" mce_src=”" /></div> 

     

    20. 失去line-height

    <div style=”line-height:20px”><img />文字</div>,很遗憾,在ie6下单行文字 line-height 效果消失了。

    原因是<img />这个inline-block元素和inline元素写在一起了。解决方案:让img 和文字都 float起来 


    21 .IE 5.x/Win
    在此我们指Windows平台上的IE 5.0和IE 5.5。CSS的支持依然很糟糕,但是比起NN 4.x已经有了长足的改变。

    它们臭名昭著错误的盒状模型(Box model)可能是导致CSS界第一个hack的出现。我们先来看看盒状模型。

    W3C规范的盒子,可以使用“相加”来描述,即,一个元素的实际盒子宽度是由内容宽度(content width),边框(border),边距(padding)堆积起来的。

    而IE 5.x/Win则可以用“相减”来描述,也被称为边框盒状模型(border box model),一个元素的实际宽度就是该元素的width设值,边框,边距都从中减去。

     

    来看一个例子:
    div { 200px; margin: 20px; padding: 20px; border: 5px;}

    依照W3C规范,这个div实际所占宽度是5px + 20px + 200px + 20px + 5px。

    而对IE5.x/Win的边框盒状模型来说,这个div实际宽度就是200px,而内容宽度被压迫到只有150px:200px - 5px - 20px - 20px - 5px。这时候,出现了Box Model Hack.

    该hack使用了IE 5.x/Win不支持的voice-family,并在值中设置一些CSS转义引号(CSS-escape quotes)欺骗IE 5.x/Win认为规则块(declaration block)已经闭合。

    div { /*为了更好说明,width调了一下写作习惯*/ margin: 20px; padding: 20px; border: 5px; 240px;           /* 1. IE 5.x/Win需要的宽度 */ voice-family: ""}"";  /* 2. IE

    5.x/Win看见了},认为规则已经结束了 */ voice-family: inherit;  /* 3. 能够正确解析的浏览器重置该值 */ 200px;           /* 4. 这才是我们需要的真正宽度 */}  

     

    21.图片下方出现几像素的空白间隙
    问题说明:这个问题在ie6和ff(火狐)下经常见到。

    例如 <div><img src=""/></div>这个图片下面会有一条空白间隙。

    解决方法:给图上一个垂直方向的属性如:vertical-align: top(任意一个就行middle);

    这个问题从而延伸到——object(视频)和textarea在火狐下也会出现类似的问题,解决方法一样。

    重置代码里就有这样一个全局定义:object,textarea,img{vertical-align: top;}


    22.IE6双倍margin的BUG(双边距)
    问题说明:这是ie6一个著名的bug,当一个元素向一边浮动时,其它同一个方向如果有margin的话,ie6就会产生双倍的margin。

    例如:<div style="float: left;margin-left: 10px;"></div>在ie6下显示会有margin-left:20px的距离

    解决方法:加个_display:inline:属性

    例如<div style="float: left;margin-left: 10px;_display: inline;"></div>


    23.ie6下的浮动元素和非浮动元素间出现3像素BUG
    问题说明:这也是ie6一个著名的bug,当一个元素浮动时,同级别的文字没有浮动,在ie6下它们之间就会产生3个像素的bug。

    例如:<div><img style="float: left;" src=""/>摘要摘要摘要摘要</div>,图片和文字就会出现3像素

    解决方法:方法一,两个元素都浮动,

    如:<div><img style="float: left;" src=""/><span style="float: left;">摘要摘要摘要摘要</span></div>;

    方法二,这种设计时一般图片和文字要有间隙的,做个ie6的hack就行,

    如:<div><img style="float: left;" src=""/><span style="margin-right: 5px; _margin-right: 2px;">摘要摘要摘要摘要</span></div>


    24.li在IE中底部空行
    问题说明:当li里面有两个以上的浮动元素时,li的下面就会产生一条空白间隙,

    例如:<ul class="tlist"><li><span style="float: left;">栏目</span><a style="float: left;" href="#" target="_blank">标题标题标题</a></li></ul>

    解决方法:这个问题和第一个问题很相似,解决方法也是一样,在li上加个垂直方向的属性,

    例如:<ul class="tlist"><li style="vertical-align: top;"><span style="float: left;">栏目</span><a style="float: left;" href="#" target="_blank">标题标题标题</a></li></ul>

     

    25.IE6样式中文注释后引发失效

    问题说明:这是ie6 出现的奇怪现象。这是由于css 和html 的编码不同所引致,满足下面条件就会引起注释下面的样式不起作用:

    1). css有中文注释

    2). css为ANSI编码

    3). html为utf-8编码

    解决方法:
    1). 去掉中文注释,用英文注释或者多打几个“*”,这是ahuing在之前的教程里提到的,例如: /*** 注释 ***/
    2). 统一css 和 html 的编码
    建议采用第二种解决方法。ps: css为uft-8  html 为ANSI ,貌似不会出现失效的情况。



    26
    .IE6出现重复字符(文字溢出)


    问题说明:一个容器包含2两个具有“float”样式的子容器,第二个容器的宽度大于父容器的宽度,或者父容器宽度减去第二个容器宽度的值小于3,在第二个容器前存在注释(这也是为什么此bug也叫做“IE6注释bug”的原因)。

    例如下列代码:

     1 <!DOCTYPE html PUBLIC "-//W3C//liD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/liD/xhtml1-transitional.lid">
     2 
     3 <html xmlns="http://www.w3.org/1999/xhtml">
     4 
     5 <head>
     6 
     7 <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
     8 
     9 <title>标题</title>    
    10 
    11 <style>
    12 
    13 *{
    14    margin: 0;padding: 0;font-size: 12px;
    15 }
    16  .a{width:205px;}
    17 .b{
    18     float: left;
    19     width: 50px;
    20     background: black;color: #fff;margin-right: 5px;
    21     overflow: hidden;
    22 }
    23 .c{
    24     float: left;
    25     width: 150px;
    26     background: red;
    27 }
    28 </style>
    29 </head>
    30 <body>
    31         <div class="a">
    32         <div class="b">测试测试测试测试测试测试测试111111111111</div>
    33          <!-- 注释 -->
    34         <div class="c">测试测试测试测试测试测试测试2222222222</div>
    35 </div>
    36 </body>
    37 </html>

     

    解决方法:

    为何会出现重复文字,谁也没说清楚,包括官方,这个问题,个人认为,ie6将注释也当成内容存在。如何消灭重复文字,只要让上面任何一个条件不满足即可。

    改变结构,不出现【一个容器包含2两个具有“float”样式的子容器】的结构。


    1).减小第二个容器的宽度,使父容器宽度减去第二个容器宽度的值大于3。

    2).去掉所有的注释。
    3).在第二个容器后面加一个或者多个<div style="clear"></div>来解决。 
    4).给溢出文字的标签加position: relative;属性 

    27.png图片在IE6下出现透明或背景变灰的bug;

    问题说明:这里的png图片是指32位和24位的,8位的png图片透明ie6是支持的。

    解决方法:
    1)使用滤镜,语法如下
    .image-style 
    { background-image: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="filename.png", sizingMethod="scale"); }

    注意:使用滤镜需要损耗性能。

    2)给IE6单独制作一张.gif图片(或者8位的png图片),打上hack
    .image-style{ background:transparent url("filename.png") no-repeat scroll 0 0;_background-image:url("filename.gif"); }

    这种方法只需要在切图时多存储一份.gif格式的图片,一般采用这种方法。


    参考:https://www.cnblogs.com/guchenfeng/p/4702004.html

  • 相关阅读:
    B/S架构
    RPC远程过程调用详解
    Ubuntu18.04安装MongoDB
    Python2.X SQLAlchemy @@tx_isolation警告
    Excel单元格内自动换行自动行高,打印预览出现内容缺失解决方案
    Winform应用的多语言设置
    单例模式创建窗口
    相似命名的字符串高效拼接
    利用dynamic动态创建对象
    设置全局快捷键
  • 原文地址:https://www.cnblogs.com/shihaiying/p/11380447.html
Copyright © 2011-2022 走看看