浏览器兼容性经典问题[整理篇]

不只做代码的搬运工:学习、研究、测试、总结、再收藏


(一) IE6 下双边距问题

问题描述:

一个div盒子如果设置了margin,并且该div设置了float浮动,那么在IE6下便会产生双边距问题:如果设置 float:left 那么左边距会是原来margin的两倍;如果是float:right,那么右边距会是原来margin的两倍。

代码如下:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        float:left;
        margin:10px;
        width:200px;
        height:200px;
        background:#696969;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
  </body>
</html>
如下是各浏览器的效果图(左侧为chrome 中间为firefox 右侧是IE6):
从上面图中可以看到,最右侧的IE6的左边距是原本边距的2倍。
解决方法:

在2004年以前,IE6这个双边距问题一直没有得到一种很好的解决方法,普遍的做法是把边距设置为目标边距的1/2,以错对错的方法去实现。2004年之后,有一个工程师发现了一个简单的解决方法,到现在也是一直用这个方法来消除IE6双边距问题的。方法很简单:只需要给id为box的这个div加上一条简单的css代码就够了。

解决代码:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        _display:inline;
        float:left;
        margin:10px;
        width:200px;
        height:200px;
        background:#696969;
      }
    </style>
  </head>
  <body>
    <div id="box"></div>
  </body>
</html>
如下是IE6的测试效果图:
添加 _display:inline; 之后
备注:

只需要加上" _display:inline; "就可以了。 因为在IE7以及IE7以上的IE版本中,这个双边距的bug已经修正,前缀符号"_"只有IE6能够识别,所以只需要让IE6去设置这个属性就足以。


(二) IE6 3像素bug问题

问题描述:

当相邻的两个元素,一个是浮动的,另一个非浮动,那么在IE6 下面将会产生3像素bug。

问题代码:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #left_box{
        background:#1C86EE;
        float:left;
        height:100px;
        width:100px;
      }
      #right_box{
        background:#76EE00;
        height:100px;
        width:200px;
      }
    </style>
  </head>
  <body>
    <div id="left_box"></div>
    <div id="right_box"></div>
  </body>
</html>
各浏览器效果图:
各浏览器效果图
注释:

如上图(上中下分别是firefox chrome IE6):
在firefox和chrome(包括IE8 IE9已测试)中,由于<div id="left_box">浮动了,所以脱离了文本流,导致了<div id="right_box">这个元素从头开始,所以蓝色覆盖在了绿色的上方。这是符合W3C标准的效果。
而在IE6则产生了著名的3像素bug,在相邻的像素中间产生了3个像素的空隙。
在IE7中(已测试),这个bug被修复了,消除了中间的3像素空隙。但是却不像firefox chrome那样符合W3C标准。

解决方法:

在各个浏览器下使得相邻的元素都是浮动的便可

代码如下:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #left_box{
        background:#1C86EE;
        float:left;
        height:100px;
        width:100px;
      }
      #right_box{
        background:#76EE00;
        height:100px;
        width:200px;
        float:left;   /*加上浮动便可*/
      }
    </style>
  </head>
  <body>
    <div id="left_box"></div>
    <div id="right_box"></div>
  </body>
</html>
各浏览器效果图:
各浏览器效果图
总结:

其实这个问题并不是特别的眼中以至于要用复杂的代码去解决它,只要你写出能符合W3C标准的效果代码变可以无形中解决这个问题。这里提出只是因为让大家更好的了解一下IE6下一些莫名其妙的事情罢了。


(三) IE6 不支持min-width属性

问题描述:

min-width的使用在流式布局(fluid layout)中是非常常见的,当用户在改变窗口大小的时候,网页内容会随之移动,直到窗口的大小确定位置。这个时候,min-属性变起作用了。可以通过限制min-属性,让页面产生滚动条,进而控制网页内容的位置。
但是非常遗憾的是,在IE6中,并不支持min-属性,需要通过一些特定的办法去解决这个问题。
在chrome firefox safari 和IE7+中,这个属性已经被支持了,可以直接使用。

问题代码:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        background:#ccc;
        min-width:500px;
      }
    </style>
  </head>
  <body>
    <div id="box">
      ---------内容--------
    </div>
  </body>
</html>
浏览器显示效果(左边chrome 中间firefox 右边IE6):
从上面的浏览器效果图中可以看到,当窗口的宽度降到了500px以下,chrome和firefox浏览器下面产生了横向的滚动条,但是IE6却没有。下面我们就针对IE6来解决这个问题。
解决方法1:

使用IE(5-7)才支持的expression()表达式,可以很简单的解决这个问题,但是这种方法是不符合W3C标准的。

实现代码1:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        background:#ccc;
        min-width:500px;
        _width:expression(document.body.clientWidth<501 ? "500px" :"auto"); /*添加上这一句便可*/
      }
    </style>
  </head>
  <body>
    <div id="box">
      ---------内容--------
    </div>
  </body>
</html>
代码解释:

只需要在指定的<div>中加上代码:_width:expression(width:expression(document.body.cilentWidth<501 ? "500px" :"auto");
由于只需要在IE6下进行一些改变,所以加上" _ "符号,当浏览器窗口宽度小于501px时,div宽度指定为500px,大于等于501px是,自动。
此处要注意的是:如果写document.body.clientWidth<500会导致IE6奔溃,(两处的大小相等会产生奔溃),所以此处用501或者502,;该<div id="box">不能指定margin或者padding,或者也会造成IE6奔溃。

解决方法2:

在<div id=box><div>中嵌套一个指定宽度的height:1px的<div>

实现代码2:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        background:#ccc;
        min-width:500px;
      }
      .min-width-box{
        width:500px;
        font-size:0px;            /*为空的div设置改css属性*/
      }
    </style>
  </head>
  <body>
    <div id="box">
      <div class="min-width-box"></div>   
      ---------内容--------
    </div>
  </body>
</html>
代码解释:

在要指定min-width的div(box)中添加一个空的div(min-width-box)。对这个空的div进行css样式设置,宽度为需要设置的min-width;即width:500px;
由于在IE6下面,<div class="min-width-box"></div>是嵌套在<div id="box"></div>下面的,所以他的高度会和“------内容------”这个的字体大小有关,为了不设置高度,把他的font-size:0px 设置为0px即可。 有一些教程上用height:1px而没有使用font-size,经过验证,他的演示效果是会改变的。

浏览器的效果图:(左边chrome 中间firefox 右边IE6)

上面两种方法是实现的效果是一样的,自此便完成了这个问题的解决。


(四) 更好的清除浮动

问题描述:

在你使用css的过程中,多多少少会遇到清除浮动这个问题。
在一个div容器里面,容器中含有一个浮动的div,在浮动元素后面还有一些块元素。如果浮动的高度大于容器被非浮动元素撑开的高度,那么浮动元素就会超出容器。具体代码如下。

问题代码:
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <style>
      body{
        padding:0px;
        margin:0px;
      }
      #container{
        font-size:20px;
        background-color:#eee;
        border:solid 3px #ddd;
      }
      #float_box{
        background-color:#fff;
        border:solid 3px #bbb;
        width:80px;
        height:100px;
        float:left;
      }
    </style>
  </head>
  <body>
    <div id="container">
      <div id="float_box">floated element</div>
      <h>the container</h>
    </div>
  </body>
</html>
各浏览器的效果图:(左为chrome 中间为firefox 右边为IE6)
注释:

在上面的的浏览器效果图中,能看到,float浮动元素并没有把父级元素contianer撑开,而是非浮动元素把父级元素container撑开,这是因为float元素并不属于文档流而造成的。所以导致了子元素的高度超过了父级元素。
我们其实可以通过人为地设置container的高度而是float元素乖乖得留在container元素中,但是这样设置就很死板,而且对流式布局等产生很多不方便的问题。
那么这时我们就需要清除浮动,让container在不设置高度的情况下自动撑开。

解决方法:

在IE8+以及主流的浏览器中,都支持:after这个伪类,我们可以通过在float浮动元素后面增加一些内容来撑开container,而在IE6 7中,我们则通过一些值的设置来触发IE特有的haslayout属性。

解决代码:
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <style>
      body{
        padding:0px;
        margin:0px;
      }
      .clearfix:after{
        content:"";
        height:0px;
        visibility:hidden;
        display:block;
        clear:both;
      } 
      * html .clearfix{
        zoom:1;
      } 
      #container{
        font-size:20px;
        background-color:#eee;
        border:solid 3px #ddd;
      }
      #float_box{
        background-color:#fff;
        border:solid 3px #bbb;
        width:80px;
        height:100px;
        float:left;
      }
    </style>
  </head>
  <body>
    <div id="container" class="clearfix">
      <div id="float_box">floated element</div>
      <h>the container</h>
    </div>
  </body>
</html>
注释:

给需要撑开的父级元素container添加上类class=clearfix,在css中添加以上新的css代码即可。
content:" ";height:0px;visibility:hidden;这三句为了在container后面的内容不可见,
display:block是用于替换掉默认的display:inline,因为clear属性不能用于行内元素,
clear:both是清除浮动
在IE6 7中,利用zoom:1触发haslayout属性即可。

各浏览器效果图:(左chrome 中间firefox 右边IE6)
可见,进行浮动清除后,父级元素container被撑开了,接下来你就可以安心的进行下面的布局了。
总结:

除了这种方法,网上还有很多其他的方法,其中一种比较简单的是:
在float元素后面添加一个<div id="clearbox"></div>的div,然后给这个div设置clear:both;
现在很多人在使用这种方法,但是这种方法我是不推荐的,首先因为这种做法会无端得给dom增加一个元素,其次这种方法也会引起其他一些不必要的问题,比如说IE6下著名的peekaboo捉迷藏问题。
还有一些人用overflow来进行清除,这些都是不推荐的。


(五) 元素背景色透明


(六) text-align的使用

问题描述

text-align可以使得 行内元素 在 块级元素 中居中
参照W3C标准的浏览器 块级元素 在 块级元素 中是无法居中的

问题代码
<div id="parent" style="text-align:center">
  <div id="child"></div>
</div>
这段代码在主流标准浏览器中的效果如下:
但是在IE6 IE7 以及 IE8的混杂模式下面却居中了
所以为了兼容蛋痛的IE6 7和IE8的混杂模式我们可以用下面的代码实现 居中
<div id="parent" style="text-align:center">
  <div id="child" style="width:50px;margin:0 auto"></div>
</div>
总结

我们可以使用margin-left:auto;margin-right:auto元素进行居中,(要设定width)
由于IE6 7 8的混杂模式不支持这种居中方式,所以在parent中设置上text-align:center便可
通过这种方式便可以实现水平居中 这里text-align:center的兼容性是大家需要注意的


来自博主 https://me.csdn.net/speed_feng
浏览器兼容性经典问题(一) IE6 下双边距问题
浏览器兼容性经典问题(二) IE6 3像素bug问题
浏览器兼容性经典问题(三) IE6 不支持min-width属性
浏览器兼容性经典问题(四) 更好的清除浮动
浏览器兼容性经典问题(五) 元素背景色透明
浏览器兼容性经典问题(六) text-align的使用

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

推荐阅读更多精彩内容