css學習筆記之兼容&bug(吐血整理)

學習來源:

http://www.cnblogs.com/xiaohuochai/

http://blog.csdn.net/secsky/article/details/8425666

http://www.51itstudy.com/31686.html

https://www.zhihu.com/people/efanchy


兼容:

【1】IE6/IE7下給塊級元素設置inline-block樣式
原因:
IE中對inline元素使用display:inline-block,也是不識別的,但使用display:inline-block在IE下會觸發layout,從而使inline元素可以支持寬高,纔會有display:inline-block屬性的表徵。但是對塊元素設置display:inline-block屬性,塊元素僅僅是被display:inline-block觸發了layout,而它本身就是行佈局,所以觸發後,塊元素依然還是行佈局。

解決方法:
1)先使用display:inline-block屬性觸發塊元素,然後再定義display:inline,讓塊元素呈遞爲內聯對象(兩個display 要先後放在兩個CSS聲明中才有效果,這是IE的一個經典bug,如果先定義了display:inline-block,然後再將display設回 inline或block,layout不會消失)。代碼如下:
div {display:inline-block;...} 
div {display:inline;}

2)【推薦】直接讓塊元素設置爲inline對象呈遞(設置屬性*display:inline;),讓塊元素排成一行;*zoom:1的作用是觸

發hasLayout,能夠支持設置寬、高、line-height等一系列屬性。代碼如下:

div { display:inline-block;           /*爲了現代瀏覽器 +IE6、7 inline 元素支持*/

       *display:inline; *zoom:1; }   /*爲了IE6/IE7支持*/


【2】去除 inline-block 空隙(換行被解析成空格)

原因:產生 inline-block 空隙的根本性原因是:HTML 中的換行符、空格符、製表符等合併爲空白符,字體大小不爲 0 的情況下,

空白符自然佔據一定的寬度,因此產生了元素間的空隙。

解決方法:

1)刪除換行符後,inline / inline-block元素間的空隙就消失了。

此方法犧牲結構來兼容表現,不建議。

2)【推薦】HTML 中的換行符、空格符、製表符等產生了空白符,而這些歸根結底都是字符,它們的大小都是受font-size 控制

的,inline-block 元素間的空隙並不是固定大小的。

font-size設爲0,可以解決大多數瀏覽器,除了IE6/IE7,IE6/7 inline 元素 inline-block 後設置 font-size:0 始終有 1px 的空隙,借

助word-spacing(檢索或設置對象中的單詞之間插入的空隔)代碼如下:

父級元素 { font-size:0;                           /* 所有瀏覽器 */ 

              *word-spacing: -1px; }                 /* IE6、7 */ 

   
inline-block元素 { font-size: 12px;               /*子元素的字符和單詞間距我們也要把它重置爲默認值。*/

                          letter-spacing: normal; 

                          word-spacing: normal;  }

注意:IE6/7IE6、7 block 元素設置成inline-block並不會產生空隙。

原因:根據【1】設置是要靠 IE 的 hasLayout,觸發 hasLayout 的元素表現出來的特徵是一個獨立的矩形容器,可以設置寬高而

不受外部元素的影響,類似於現代瀏覽器中的 BFC(塊級格式化上下文)的概念具有獨立性,所以產生 hasLayout 的元素之間表

現出來互不影響,這也表明 IE6/7 中的 inline-block 不能等同於 CSS2.1 中的 inline-block。如果非要說是有 bug, IE6、7 block 

元素 inline-block 後不產生空隙纔是 bug。


【3】透明度兼容寫法

filter: Alpha(opacity=10);   (0~100)  /* IE */   

opacity:0.1;                      (0~1)      /*現代瀏覽器*/





bug:

【1】雙外邊距浮動

出現條件:塊元素有浮動,有和浮動的方向一致的margin。

解決方法:display:inline

.box { margin-left: 10px;  
         float:left;  
         display:inline; }


【2】div中嵌套img,底部有留白

原因:img是inline元素,inline元素默認 vertical-align: baseline ,(文字的基線是從圖片底部開始算起的),即圖片的下邊緣是

與容器的基線對齊,而不是緊貼容器下邊緣。而baseline與bottom之間是有一段距離的,留白就是這段距離。

解決方法:

1)當div中有文字時,設置img { vertical-align: bottom;}

將圖片下邊緣與line box的底端對齊,自然就去掉留白了。

2)有設置line-height時,div { line-height: 0; }

因爲top和bottom之間的距離爲line-height,line-height爲0,則baseline和bottom之間的距離也爲0了。

3)沒有設置line-height,且無文字時,div { font-size: 0; }

因爲line-height默認值是基於font-size的。

4)img { display:block; }

vertical-align只對inline元素有效,變成塊元素就不存在基線對齊的說法了。


【3】子元素的margin-top,margin-bottom值會傳遞給父級

原因:

相鄰元素疊加:這個比較好理解, 相鄰的兩個元素, 如果它們的上下邊距相遇,即會產生疊加。

父子元素疊加:包含元素的外邊距隔着父元素的內邊距和邊框, 當這兩項都不存在的時候, 父子元素垂直外邊距相鄰, 產生疊加。 

注意:只有普通流中塊框的垂直外邊距纔會發生外邊距合併。行內框、浮動框或絕對定位之間的外邊距不會合並。

解決方法:

1)重疊問題,只要讓它們不在同一個 BFC 內就行。

對於相鄰元素,只要給它們加上 BFC 的外殼,就能使它們的 margin 不重疊;

對於嵌套元素,只要讓父級元素觸發 BFC,就能使父級 margin 和當前元素的 margin 不重疊。

觸發BFC的方式 float(除了none)、overflow(除了visible)、display(table-cell/table-caption/inline

-block)、position(除了static/relative)

IE6下觸發haslayout  *zoom:1;

如下:可在.container { overflow: hidden;  *zoom: 1; }   支持IE6


2)或是隻用上或只用下邊距,這樣就不存在疊加的機會



【4】在IE6下元素的高度的小於19px的時候,會被當做19px來處理

解決方法:

1)font-size: 0;

div { height: 1px;
        font-size: 0;

     }

此方法在IE6下,最小到2px,不會爲0。

2)【推薦】overflow: hidden;

div { height: 1px;
       overflow: hidden; 

      }

超過height 1px的部分會被隱藏掉。


【5】IE5/6 下浮動元素與非浮動元素在一起,會發生3px偏移(包括文本和圖片)

解決方法:加負3px外邊距

.floatBox { float: left;  
               *margin-right: -3px; } 

往右浮動,則用margin-left。


【6】IE6下出現重複字符(文字溢出) 

出現條件:子元素的寬度和父級的寬度相差小於3px 或是 兩個浮動元素中間有註釋或者內嵌元素的時候,溢出文字的字數=註釋/內

聯的條數*2-1

解決辦法:將溢出文字所在文字區塊包含在新的<div></div>之間。


【7】在IE6/7下,li本身沒浮動,但是li的內容有浮動,li與li之間會產生一個間隙

解決辦法:

1)給li加浮動

2)給li加vertical-align: top;

注意:當與19px最小高度bug並存時,採用1)方法加上最小高度的解決方法。


【8】在IE6/7下,子元素有相對定位的話,且範圍比父級大,父級的overflow包不住子元素。

解決方法:

給父級也加定位 position: relative / absolute;


【9】在IE6,7下輸入類型的表單控件輸入文字的時候,其背景圖片會跟着一塊移動 。

解決辦法: 

在input外包一層div,把圖片背景加給父級div,自身去除boder和background,大小和div一樣。


【10】在IE6下,元素負margin超出父元素的部分會被隱藏掉。

解決方法:

這個問題可以通過設置margin負值元素的position屬性值爲relative來解決。




未完待續。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章