瀏覽器兼容性經(jīng)典問題[整理篇]

不只做代碼的搬運工:學(xué)習(xí)、研究、測試、總結(jié)、再收藏


(一) IE6 下雙邊距問題

問題描述:

一個div盒子如果設(shè)置了margin,并且該div設(shè)置了float浮動,那么在IE6下便會產(chǎn)生雙邊距問題:如果設(shè)置 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>
如下是各瀏覽器的效果圖(左側(cè)為chrome 中間為firefox 右側(cè)是IE6):
從上面圖中可以看到,最右側(cè)的IE6的左邊距是原本邊距的2倍。
解決方法:

在2004年以前,IE6這個雙邊距問題一直沒有得到一種很好的解決方法,普遍的做法是把邊距設(shè)置為目標(biāo)邊距的1/2,以錯對錯的方法去實現(xiàn)。2004年之后,有一個工程師發(fā)現(xiàn)了一個簡單的解決方法,到現(xiàn)在也是一直用這個方法來消除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已經(jīng)修正,前綴符號"_"只有IE6能夠識別,所以只需要讓IE6去設(shè)置這個屬性就足以。


(二) IE6 3像素bug問題

問題描述:

當(dāng)相鄰的兩個元素,一個是浮動的,另一個非浮動,那么在IE6 下面將會產(chǎn)生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">浮動了,所以脫離了文本流,導(dǎo)致了<div id="right_box">這個元素從頭開始,所以藍(lán)色覆蓋在了綠色的上方。這是符合W3C標(biāo)準(zhǔn)的效果。
而在IE6則產(chǎn)生了著名的3像素bug,在相鄰的像素中間產(chǎn)生了3個像素的空隙。
在IE7中(已測試),這個bug被修復(fù)了,消除了中間的3像素空隙。但是卻不像firefox chrome那樣符合W3C標(biāo)準(zhǔn)。

解決方法:

在各個瀏覽器下使得相鄰的元素都是浮動的便可

代碼如下:
<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>
各瀏覽器效果圖:
各瀏覽器效果圖
總結(jié):

其實這個問題并不是特別的眼中以至于要用復(fù)雜的代碼去解決它,只要你寫出能符合W3C標(biāo)準(zhǔn)的效果代碼變可以無形中解決這個問題。這里提出只是因為讓大家更好的了解一下IE6下一些莫名其妙的事情罷了。


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

問題描述:

min-width的使用在流式布局(fluid layout)中是非常常見的,當(dāng)用戶在改變窗口大小的時候,網(wǎng)頁內(nèi)容會隨之移動,直到窗口的大小確定位置。這個時候,min-屬性變起作用了??梢酝ㄟ^限制min-屬性,讓頁面產(chǎn)生滾動條,進(jìn)而控制網(wǎng)頁內(nèi)容的位置。
但是非常遺憾的是,在IE6中,并不支持min-屬性,需要通過一些特定的辦法去解決這個問題。
在chrome firefox safari 和IE7+中,這個屬性已經(jīng)被支持了,可以直接使用。

問題代碼:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        background:#ccc;
        min-width:500px;
      }
    </style>
  </head>
  <body>
    <div id="box">
      ---------內(nèi)容--------
    </div>
  </body>
</html>
瀏覽器顯示效果(左邊chrome 中間firefox 右邊IE6):
從上面的瀏覽器效果圖中可以看到,當(dāng)窗口的寬度降到了500px以下,chrome和firefox瀏覽器下面產(chǎn)生了橫向的滾動條,但是IE6卻沒有。下面我們就針對IE6來解決這個問題。
解決方法1:

使用IE(5-7)才支持的expression()表達(dá)式,可以很簡單的解決這個問題,但是這種方法是不符合W3C標(biāo)準(zhǔn)的。

實現(xiàn)代碼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">
      ---------內(nèi)容--------
    </div>
  </body>
</html>
代碼解釋:

只需要在指定的<div>中加上代碼:_width:expression(width:expression(document.body.cilentWidth<501 ? "500px" :"auto");
由于只需要在IE6下進(jìn)行一些改變,所以加上" _ "符號,當(dāng)瀏覽器窗口寬度小于501px時,div寬度指定為500px,大于等于501px是,自動。
此處要注意的是:如果寫document.body.clientWidth<500會導(dǎo)致IE6奔潰,(兩處的大小相等會產(chǎn)生奔潰),所以此處用501或者502,;該<div id="box">不能指定margin或者padding,或者也會造成IE6奔潰。

解決方法2:

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

實現(xiàn)代碼2:
<html>
  <head>
    <style>
      body{
        margin:0px;
        padding:0px;
      }
      #box{
        background:#ccc;
        min-width:500px;
      }
      .min-width-box{
        width:500px;
        font-size:0px;            /*為空的div設(shè)置改css屬性*/
      }
    </style>
  </head>
  <body>
    <div id="box">
      <div class="min-width-box"></div>   
      ---------內(nèi)容--------
    </div>
  </body>
</html>
代碼解釋:

在要指定min-width的div(box)中添加一個空的div(min-width-box)。對這個空的div進(jìn)行css樣式設(shè)置,寬度為需要設(shè)置的min-width;即width:500px;
由于在IE6下面,<div class="min-width-box"></div>是嵌套在<div id="box"></div>下面的,所以他的高度會和“------內(nèi)容------”這個的字體大小有關(guān),為了不設(shè)置高度,把他的font-size:0px 設(shè)置為0px即可。 有一些教程上用height:1px而沒有使用font-size,經(jīng)過驗證,他的演示效果是會改變的。

瀏覽器的效果圖:(左邊chrome 中間firefox 右邊IE6)

上面兩種方法是實現(xiàn)的效果是一樣的,自此便完成了這個問題的解決。


(四) 更好的清除浮動

問題描述:

在你使用css的過程中,多多少少會遇到清除浮動這個問題。
在一個div容器里面,容器中含有一個浮動的div,在浮動元素后面還有一些塊元素。如果浮動的高度大于容器被非浮動元素?fù)伍_的高度,那么浮動元素就會超出容器。具體代碼如下。

問題代碼:
<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元素并不屬于文檔流而造成的。所以導(dǎo)致了子元素的高度超過了父級元素。
我們其實可以通過人為地設(shè)置container的高度而是float元素乖乖得留在container元素中,但是這樣設(shè)置就很死板,而且對流式布局等產(chǎn)生很多不方便的問題。
那么這時我們就需要清除浮動,讓container在不設(shè)置高度的情況下自動撐開。

解決方法:

在IE8+以及主流的瀏覽器中,都支持:after這個偽類,我們可以通過在float浮動元素后面增加一些內(nèi)容來撐開container,而在IE6 7中,我們則通過一些值的設(shè)置來觸發(fā)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后面的內(nèi)容不可見,
display:block是用于替換掉默認(rèn)的display:inline,因為clear屬性不能用于行內(nèi)元素,
clear:both是清除浮動
在IE6 7中,利用zoom:1觸發(fā)haslayout屬性即可。

各瀏覽器效果圖:(左chrome 中間firefox 右邊IE6)
可見,進(jìn)行浮動清除后,父級元素container被撐開了,接下來你就可以安心的進(jìn)行下面的布局了。
總結(jié):

除了這種方法,網(wǎng)上還有很多其他的方法,其中一種比較簡單的是:
在float元素后面添加一個<div id="clearbox"></div>的div,然后給這個div設(shè)置clear:both;
現(xiàn)在很多人在使用這種方法,但是這種方法我是不推薦的,首先因為這種做法會無端得給dom增加一個元素,其次這種方法也會引起其他一些不必要的問題,比如說IE6下著名的peekaboo捉迷藏問題。
還有一些人用overflow來進(jìn)行清除,這些都是不推薦的。


(五) 元素背景色透明


(六) text-align的使用

問題描述

text-align可以使得 行內(nèi)元素 在 塊級元素 中居中
參照W3C標(biāo)準(zhǔn)的瀏覽器 塊級元素 在 塊級元素 中是無法居中的

問題代碼
<div id="parent" style="text-align:center">
  <div id="child"></div>
</div>
這段代碼在主流標(biāo)準(zhǔn)瀏覽器中的效果如下:
但是在IE6 IE7 以及 IE8的混雜模式下面卻居中了
所以為了兼容蛋痛的IE6 7和IE8的混雜模式我們可以用下面的代碼實現(xiàn) 居中
<div id="parent" style="text-align:center">
  <div id="child" style="width:50px;margin:0 auto"></div>
</div>
總結(jié)

我們可以使用margin-left:auto;margin-right:auto元素進(jìn)行居中,(要設(shè)定width)
由于IE6 7 8的混雜模式不支持這種居中方式,所以在parent中設(shè)置上text-align:center便可
通過這種方式便可以實現(xiàn)水平居中 這里text-align:center的兼容性是大家需要注意的


來自博主 https://me.csdn.net/speed_feng
瀏覽器兼容性經(jīng)典問題(一) IE6 下雙邊距問題
瀏覽器兼容性經(jīng)典問題(二) IE6 3像素bug問題
瀏覽器兼容性經(jīng)典問題(三) IE6 不支持min-width屬性
瀏覽器兼容性經(jīng)典問題(四) 更好的清除浮動
瀏覽器兼容性經(jīng)典問題(五) 元素背景色透明
瀏覽器兼容性經(jīng)典問題(六) text-align的使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容