DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> CSS入門知識 >> CSS進階教程 >> IE6/IE7不識別display:inline-block屬性怎麼辦
IE6/IE7不識別display:inline-block屬性怎麼辦
編輯:CSS進階教程     

 ie6,ie7的haslayout屬性是個讓人頭疼的問題。在做導航條的時候,一般會用到ul li結構,大多數時候我們是把li設置為浮動,讓其並排顯示在同一行。還有一種方法就是設置li為display:inline;這樣可以達到同樣的效果,但是問題是inline元素的特性:默認無法設置寬度,高度,以及上下margin,(關於padding,情況有點特殊,在ie6,7中 inline元素是無法設置上下padding的,但是在標准浏覽器裡面是可以設置上下padding的)。

鑒於inline元素的這種特性,如果我們不浮動並且想讓li顯示在一行,而且可以設置高度,寬度以及上下margin,上下padding等屬性,應該怎麼辦呢?你一定會想到一個屬性display:inline-block;對!”inline- block”就是干這個事的,讓一個元素既不換行又具有block元素的特性。不過有點小問題.

在IE6、IE7中不識別display:inline-block屬性,加不加display:inline-block;對於它們完全沒有任何影響。那麼讓我們來想辦法解決這個問題,這就涉及到ie6,7中的haslayout屬性了。ie6,7中的inline元素有個特殊的情況,就是觸發了ie的hasLayout屬性以後就擁有了layout。此時inline元素的表現和標准浏覽器裡面的inline-block元素基本相同。看下面這個例子,我們用ie的私有屬性zoom來觸發hasLayout,然後看看inline元素的表現。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>display-block</title> <style> span {width:200px;height:50px;margin:10px;padding:20px;background:#ccc;zoom:1;} </style> </head> <body> <span>span</span> </body> </html>

可以看到在ie6,7中inline元素span已經表現得和一個display:inline-block元素一摸一樣了,但是在標准浏覽器中span仍然是行內元素(寬高以及上下margin都無效)。

如果聲明了不正確DTD,導致ie6在quirks 模式下解析,那麼ie6會自動觸發inline元素的haslayout,不過這裡只討論正常情況下的解析,所以加了個zoom:1來觸發haslayout;zoom的值設置為除了auto外的任何值都會觸發haslayout,之所以經常用zoom:1;是因為zoom這個屬性本身是ie的縮放屬性,設置為其他值會導致元素在ie下變形,設置為1既是保持原形不縮放。

了解了上面的情況,我們就可以來解決之前那個問題了。可以改原先的css代碼如下:

li {display:inline-block; /* firefox等標准浏覽器識別*/ *display:inline; /* 只有ie6和ie7識別*/ zoom:1; /* 觸發ie6和ie7下的haslayout */ width:80px; height:20px; margin:10px; padding:10px; text-align:center; background:#cfc; }

讓標准浏覽器識別display:inline-block;讓ie6,7識別display:inline;來覆蓋上面的display:inline-block;(我為什麼要說”覆蓋”?)。然後通過zoom:1;來觸發haslayout讓inline元素在ie中表現得和inline-block元素一樣。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>display-block</title> <style> ul {background:#ccc;padding:0;margin:0;list-style:none;} li {display:inline-block; *display:inline; zoom:1; width:80px; height:20px; margin:10px; padding:10px; text-align:center; background:#cfc; } </style> </head> <body> <ul> <li>測試</li> <li>測試</li> <li>測試</li> <li>測試</li> </ul> </body> </html>

可以看到,現在在各浏覽器裡面的顯示已經一致了。li元素都顯示在同一行。

不過我上面問了:為什麼要說覆蓋?

假如我們把上面的css代碼中的

1 2 display:inline-block; *display:inline;

兩句調換一下順序會怎樣?你會發現display:inline-block;覆蓋了*display:inline;導致在ie6,7中原先的樣式又失效了,這說明什麼?說明ie6和ie7是認識display:inline-block的,所以我在前面說”不完全支持”而沒有說”完全不支持”,嘿嘿,我可沒有打自己嘴巴。之所以說”不完全支持”是因為還是有一點作用,雖然display:inline-block對ie6,7中的元素表現沒有任何直接影響,但是它會觸發inline元素的haslayout。只有這一個作用,讓我們再回到前面的例子:

span {width:200px;height:50px;margin:10px;padding:20px;background:#ccc; display:inline-block;} <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=”http://www.w3.org/1999/xhtml”> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /> <title>display-block</title> <style> span {width:200px;height:50px;margin:10px;padding:20px;background:#ccc;display:inline-block;} </style> </head> <body> <span>span</span> </body> </html>

可以看到,我們把zoom:1換成了display:inline-block以後,在ie6,7中span仍然和firefox等標准浏覽器下一樣,具有了設置的寬高和上下margin,上下padding。它表現得和display:inline-block同學一樣好,不過這並不是因為display:inline-block這條聲明直接生效了,而是因為display:inline-block觸發了ie的haslayout屬性,使得inline元素具有了inline-block的表現。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved