关于ie的兼容问题的总结,ie6的时代已经过去,但还是把ie6-ie9遇到的问题总结了一下

这是我近两年在开发过程中遇到的一些ie兼容问题的总结,都记录了下来,虽然现在页面只考虑ie9以后的版本了,但是以前的小技巧还是写下来吧,里面也有一些不是ie遇到的问题,只是问题很小,但是解决需要技巧的小知识点。


1. 问题简述:块属性标签float后,横行margin双倍。

   影响版本:ie6

   问题分析:块属性标签添加float后,又有横行的margin情况下,在ie6中显示的margin

   比设置的大。     

   解决方案:在float的标签样式控制中加入 display:inline;将其转化为行内属性。  

   问题预览:              

   修改前:

   修改后:

   

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/doubleMargin.html

 

2. 问题简述:在ie6中元素高度超出自己设置高度。

   影响版本:ie6

   问题分析:这是ie6中会给元素设置默认的行高的高度导致的。

   解决方案:

   (1).在样式控制中加入overflow:hidden;

   (2).设置line-height为更小的高度,此方法还要加上font-size才管用,注意font-size

    的大小不要超过设定的高度。   

   问题预览: 

   修改前后对比:

   

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/overHeight.html

 

3. 问题简述:a(有href属性)标签嵌套下的img标签,在IE下会带有边框。

   影响版本:ie6,ie7,ie8,ie9

   解决方案:加上a img{border:none;}样式。

   问题预览: 

   修改前后对比:

   

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/imgBorder.html

 

4. 问题简述:input边框问题。去掉input边框一般用border:none;就可以,但由于ie6,ie7

   在解析input样式时的BUG,在ie6,ie7下无效。 

   影响版本:ie6,ie7

   问题分析:涉及到border的有border-style,border-width,浏览器根据自己的内核解

   析规则,先解析自身的默认CSS,再解析开发者书写的CSS,达到渲染标签的目的。IE6

   对INPUT的渲染存在bug,border:none;不被解析,当有border-width或border-color

   设置的时候才会令IE6去解析border-style:none;。

   解决方案:

   (1).样式加入border:none;border-color:transparent;

   (2).样式加入border:0或border:0 none。

   问题预览:

   修改前后对比:

   

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/inputBorder.html

 

5. 问题简述:相邻的margin-top和margin-bottom会产生重合。

   影响版本:ie,标准浏览器

   问题分析:margin是个有点特殊的样式,相邻的margin-left和margin-right是不会重

   合的,但相邻的margin-top和margin-bottom会产生重合。不管IE还是标准浏览器都

   存在这问题。我们对上面的div设置了25px的下边距,对下方的div设置了50px的上边

   距。为了便于观察,这里将div的高度都设为100px。结果不是预期的上下div拉开75px

   的距离,而是拉开了半个div高度(50px)的距离。

   解决方案:

   (1).给最后面的元素加上浮动(left/right);

   (2).给最后一个元素加上display:inline-block;但是IE6和IE7下不完全支持

     display:inline-block,所以要加上*display:inline;zoom:1即可解决IE6、7的bug;

   (3).统一使用margin-top或者margin-bottom,不要混合使用。这并不是技术上的必

   需,但却是个良好的习惯。

   问题预览:

   修改前后对比:

   

 

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/margin.html

 

6. 问题简述:一个父包含框包含一个子元素。给正常流的子元素一个垂直外边距margin-top

   就会使得父元素跟着往下走,而子元素和父元素的边距则没有发生变化。(这个子元素是块

   元素)。

   影响版本:标准浏览器(FirfFox、Chrome、Opera、Sarfi)

   问题分析:一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子

   的上边距会和其内部文档流中的第一个子元素的上边距重叠。

   解决方案:

   (1). 在父层div加上:overflow:hidden;

   (2).把margin-top外边距改成padding-top内边距;

   (3).父元素产生边距重叠的边有不为 0 的 padding 或宽度不为 0 且 style 不为   

    none 的 border(父层div加: padding-top: 1px,或者 border-top:1px ;);

   (4).设置父元素或子元素浮动(left/right);

   (5). 设置父元素dispaly:inline-block或者display:table-cell;

   (6). 给父元素加上绝对定位。

   问题预览:

   修改前:

   

   修改后:

   

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/marginFC.html

 

7. 问题简述:当父元素的直接子元素或者下级子元素的样式拥有position:relative属性时,

   父元素的overflow:hidden属性就会失效。

   影响版本:ie6,ie7

   解决方案:在父元素中使用position:relative;即可。

   问题预览:

   修改前:

   

   修改后:

  

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/overflow.html

 

8. 问题简述:inline-block元素之间存在一定距离的间隙。

   影响版本:ie,标准浏览器

   问题分析:真正意义上的inline-block水平呈现的元素间,换行显示或空格分隔

   的情况下会有间距。

   解决方案:

   (1).去掉HTML中的空格。例如:

    <div class="space">

        <a href="##">惆怅</a><a href="##">淡定</a><a href="##">热血</a>

</div>

   或者:

    <div class="space">

       <a href="##">惆怅</a

       ><a href="##">淡定</a

       ><a href="##">热血</a>

</div>

   (2).使用margin负值;

   (3).设置其父元素样式letter-spacing为负值,其本身letter-spacing为0,此方法对

   于ie6,ie7无效;

   (4).使用font-size:0,但是对于ie6,ie7还有1px的间隙。

   问题预览:

   修改前后对比:

   

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/minFontSize.html

 

9. 问题简述:如果绝对定位的元素,紧邻着两个浮动元素,在IE6 中绝对定

   位的元素消失了。

   影响版本:ie6

   问题分析:当绝对定位的元素紧挨浮动元素时,或是浮动元素的宽度填满父元素时,绝对

   定位元素就会消失。

   解决方案:

   (1).别让绝对定位元素紧邻浮动元素就可以了。比如可以在绝对定位元素后面加个空元

   素。当然,这个空元素是毫无意义的。

   (2).浮动元素的宽度不填满父元素。

   问题预览:

   按照方案一修改前:

  

   修改后:

      

   浮动元素宽度小于父元素时效果:

     

   浮动元素宽度大于或等于父元素时效果:

      

   效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/disappear.html

     

10. 问题简述:IE6断头台问题:断头台问题是国外的CSS设计者给这个问题起的一个非常形

      象的名字,与之相反的,被切断的不是对象的头部,而是对象的底部。例如:

      

      用IE6进行测试,发现当鼠标移到连接2,3,4上时,div被砍掉了一半,高度跟这四个连

    接的高度一样,如下:

      

    影响版本:ie6

    问题分析:这个问题的主要原因在于链接上,去除链接的a:hove样式后,一切正常。经测

    试发现,不仅仅是 background-color的变化,如果改变hover状态下链接的其他属性,

    也会引发同样的问题。例如设置padding、border、加粗、斜体等,都会引发断头台问题。

    值得注意的是,在#layout中,#left是个浮动对象,而右测是若干链接对象。对于未指定

    高度的对象而言,IE6会根据其中的内容(不管浮动与否)来计算高度的大小,而当例子中

    的链接对象是个非浮动对象,并具有hover改变border,background及padding属性时,

    IE6会认为这些属性同时会改变#layout的高度,因此它重新计算对象高度。而令人失望

    的是,IE6的这种自以为是的行为并没有达到预期目的,它会把非浮动对象的总高度作为高

    度给了#layout,从而切断了#left的内容。

    解决方案:

  (1).对链接加上个div,并设置浮动#right{float:left}。这样使得两个对象都成为浮动

    对象,不会引发问题;

  (2).在所有链接底部加<div class="clear"></div>占位框强制IE浏览器重新计算高

    度,并且这个占位框的样式为.clear{height:0;overflow:hidden;clear:left;}。

    效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/noHead.html

 

11. 问题简述:ie各个版本hack

      影响版本:ie浏览器

      问题分析:CSS hack由于不同厂商的浏览器,或者是同一厂商的浏览器的不同版本,如

      IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到

      我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能

      够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。

      解决方案:

    (1).类内部hack:

          .header {_width:100px;}            /* IE6专用*/

          .header {*+width:100px;}        /* IE7专用*/

          .header {*width:100px;}            /* IE6、IE7共用*/

          .header {width:100px\0;}        /* IE8、IE9共用*/

          .header {width:100px\9;}        /* IE6、IE7、IE8、IE9共用*/

          .header {width:330px\9\0;}    /* IE9专用*/

    (2).选择器Hack:

          *html .header{}        /*IE6*/ 

          *+html .header{}    /*IE7*/ 

 

12. 问题简述:ie6的max-height/width,min-height/width问题。

     影响版本:ie6

     问题分析:ie6不支持min-,max-样式。

     解决方案:

    (1).IE6支持max-height解决方法:  

     样式控制中加入

     _height:expression((document.documentElement.clientHeight||document.bod

     y.clientHeight)>100?"100px":"");

   (2).IE6支持max-width解决方法:

     样式控制中加入

     _width:expression((document.documentElement.clientWidth||document.body

     .clientWidth)>100?"100px":"");

   (3).IE6支持min-height解决方法:

     利用hack,在样式中加入_height:xxpx;

   (4).IE6支持min-width解决方法:

     利用hack,在样式中加入_width:xxpx;

     效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/minHeight.html

13. 问题简述:格式为png24的图片在ie6下不透明,有灰色背景。

      影响版本:ie6

      解决方案:使用滤镜,在要设置透明图片为背景的元素样式中加入_background:none;

      filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../css/i/on

      g24_03.png");需要注意的是,这里对应的src地址一定是相对于html页面的不是相对

      于css路径的。 

      问题预览:

      修改前:

     

      修改后:

     

      效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/png24.html
    

14. 问题简述:ie6不支持:first-child选择器

      影响版本:ie6

      问题分析::first-child 选择器用于选取属于其父元素的首个子元素的指定选择器,而ie6

      不支持此选择器,不过可以用其他办法替代。

      解决方案:在子元素的样式中加入*border-top-style:expression(this.previousSibling

      ==null?"none":"solid");

      问题预览:

       

          本示例是要让第一个li没有border-top。第一行的是未修改时ie6的效果,第二行是修

      改后的效果。  

      效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/firstChild.html

 

15. 问题简述:ie6不支持:last-child选择器

      影响版本:ie6

      问题分析::last-child 选择器匹配属于其父元素的最后一个子元素的每个元素,而ie6

      不支持此选择器,不过可以用其他办法替代。

      解决方案:在子元素的样式中加入*border-top-style:expression(this.nextSibling

      ==null?"none":"solid");

      问题预览:

      

      效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/lastChild.html

16. 问题简述:ie6下z-index不起作用

     影响版本:ie6

     问题分析:按照正常的思维,z-index层级越高,内容越应该在上面显示。在大部分的浏览

     器在大部分的情况下,确实如此。但是ie6下,z-index总是事与愿违。这种情况发生的条

     件有三个:1、父标签position属性为relative;2、问题标签无position属性(不包括

     static);3、问题标签含有浮动(float)属性。

     解决方案:

    (1).position:relative改为position:absolute;

    (2).去除浮动;

    (3).浮动元素添加position属性(如relative,absolute等)。

     问题预览:

     修改前:

      

     正常图片z-index为9999,应该在透明度为50%,z-index为1的背景的上层,看ie6

     修改前效果,图片却在背景div的下层。

     修改后:

      

     效果参考:http://devfe.jd.com/devfe/ie/1.0.0/html/z-index.html

猜你喜欢

转载自blog.csdn.net/zhaoyizhu1990/article/details/80898700