|
||||
:hover 是我們在 CSS 設計中最常運用的偽類之一,許多絢麗效果的實現離不開偽類 :hover,比如我們常見的純 CSS 菜單、相冊效果等等。
或許用了這麼久的偽類:hover,還有部分朋友還不完全了解hover的規則:
在CSS1中此偽類僅可用於a對象。且對於無href屬性(特性)的a對象,此偽類不發生作用。
在CSS2中此偽類可以應用於任何對象。
但目前IE5.5、IE6僅支持CSS1中的:hover,不過新出的IE7是支持CSS2中的:hover。
當我們用偽類:hover做某些特殊效果時,依據CSS2很好完成,但為了現在佔據主流瀏覽器的IE6 ,我們又不得不做很多工作,比如給添加a元素等來模擬完成最終的效果。
或許這樣講太空洞,請看下面一個常見的觸發顯示的例子(僅選擇IE6為例講解)。
我們先用CSS2的寫法來實現:
XHTML部分:
<ul>
<li>鼠標移過來觸發我吧!<a href="#" title="">哈哈,終於被你發現了!</a></li></ul> |
CSS部分:
* {
margin:0;padding:0;}ul {list-style:none;margin:100px;}li {height:100px;width:100px;background:#000;font-size:12px;color:#fff;position:relative;}li a {display:none;}li:hover a{display:block;text-decoration:none;width:100px;height:100px;background:#c00;position:absolute;top:50px;left:50px;color:#fff;} |
大家可以測試發現在Firefox等對CSS2支持很好的瀏覽器中,可以顯示我們所要達到的效果,但在IE6中卻無法實現。
下面讓我們換一種思維,所用CSS1的寫法來看看,這個時候由於無法支持li元素:hover的使用,我們只好把所有文字包含到a 中,對a 使用:hover ,並且將要顯示隱藏的部分放到span元素中,首先我們對XHTML進行部分調整,調整如下:
<ul>
<li><a href="#" title="">鼠標移過來觸發我吧!<span>哈哈,終於被你發現</span></a></li></ul> |
CSS中我們將a 的設置成塊級元素,並使a 的大小和寬度和li的相同,並設置a 為相對位置,用a 來模擬上例中的li ;而用span來模擬上例中的a ,設置span在默認情況下隱藏(display:none;),當a 被觸發時(:hover),則span顯示(display:block;)
CSS部分:
* {
margin:0;padding:0;}ul {list-style:none;margin:100px;}li {height:100px;width:100px;background:#000;font-size:12px;}li a {display:block;height:100px;width:100px;position:relative;color:#fff;text-decoration:none;}li span {display:none;}li a:hover span {display:block;width:100px;height:100px;background:#c00;position:absolute;top:50px;left:50px;color:#fff;} |
可我們發現上例中的效果,在IE6中依然無法顯示,難道我們的代碼寫錯了,可檢查來檢查去一點錯誤也沒有(不信你找個高高手問問,他們依然會回答你,這代碼完全正確),難道是標准中的說明是錯的?還是IE6瀏覽器連CSS1也不支持?很多疑問從四面八方跑來了……
那到底是什麼問題呢?
不是標准說明的錯,也不是IE瀏覽器不支持CSS1,而是IE瀏覽器自身解析的問題,是IE5.5和 IE6中偽類:hover的 BUG。
那又該如何解決這個問題呢?
這個BUG可以通過在鏈接的屬性中增加某些特殊的CSS屬性聲明來消除。
下面我們對上面的第二個例子進行實驗,究竟哪些屬性可以幫我們來消除這些BUG。
對CSS代碼我們增加:
li a:hover {} |
對其屬性我們僅設定width:100px;發現在IE6中依舊沒有變化,我們嘗試著更改width的 value ,比如使其width:99px,奇怪的事情發生了,在IE6中,隱藏的部分在觸發的時候顯示出來了。我們再對li a:hover的屬性僅設定color來測試(初始值為#fff),更改color值,發現在IE6下卻也不能觸發顯示,奇怪,奇怪,真奇怪……是不是依舊是一頭霧水……沒關系,繼續往下實驗,或許歸類了我們就能發現規律了!
我們再用其他屬性進行設置:width,positon,background,text-decoration,font-size,font-weight,font-family,border,float,display,font-style,margin,padding,text-align,overflow,text-transform,text-indent,z-index,vertical-align。
我們發現除了text-decoration,color,z-index不能觸發顯示外,其他屬性均可以做為消除偽類:hover BUG的特定屬性。
說明:
對於dispaly不可以用本例來測試,可另外寫個更簡單的例子(去除ul/li,a和span中的position )。在實際應用中不建議改變display值來做為特定屬性消除此BUG,而且在某些例子中此屬性不一定能消除BUG。
對於做為特定屬性的border和 background中的顏色我們還可用全寫和簡寫來改變,如#fff和 #ffffff在消除BUG中解析為2 個不同的值。