在 IE6 下鼠標經過塊級(block)鏈接時,會產生一個作用域的bug。
Bug描述:
正常情況下,A鏈接設定了塊級(block)屬性,或者設定絕對定位(absolute) + 寛、高,在整個作用域之内,只要鼠標一進入到該範圍就應觸發a:hover的狀態(默認的手型圖標)。但在IE6下,當鼠標進入A鏈接的時候,並沒有觸發a:hover,只有當鼠標移到文字部份,a:hover才產生作用,狀態才隨即改變。如果A鏈接裡面不寫内容,只有一個空標籤的話<a>…</a>那麽在IE6下根本不能觸發a:hover。
例子詳見國外這篇文章。這裡主要看一下test1 – test4的測試情況:
test1(1):
A鏈接的父級haslayout=true,A鏈接自身是block,haslayout=false,
但鼠標經過時只有文字部份產生响應(IE6 Bug)。
test1(2):
和 test1(1) 情況相似,只不過它是借js觸發鼠標經過的效果,不是由CSS觸發,盡管這樣仍然只有文字部份產生响應。
test2(1):
A鏈接的父級haslayout=true,A鏈接自身是block,haslayout=true(使用zoom觸發),
鼠標經過時响應正常。
test2(2):
和 test2(1) 情況相似,只不過它是借js觸發鼠標經過的效果,使用zoom後,鼠標經過時响應正常。
test3(1):
A鏈接的父級haslayout=true,連續三個A鏈接自身都是block,第一個和第三個haslayout=false,第二個haslayout=true,鼠標經過時响應正常;就是說為相鄰的元素觸發layout也可解決問題。
test3(2):
和 test3(1) 情況相似,只不過它是借js觸發鼠標經過的效果。
test4(1):
A鏈接的父級haslayout=false,A鏈接自身是block,haslayout=false,鼠標經過時响應正常;就是說父級沒有觸發layout的情況下,是不會產生這個BUG的,鼠標响應亦正常,不用特意去觸發layout。
test4(2):
和 test4(1) 情況相似,只不過它是借js觸發鼠標經過的效果。
本以為 作用域 的問題就這樣解決了,可是到實際應用中又出問題。
常見情景:一組圖片,點左上一張,點右下一張,一般地會在A鏈接上面設定箭頭圖片,當鼠標經過的時候才顯示,否則不顯示。這種情況和上文中的例子有些不同:
- 鼠標未經過A鏈接時,不顯示背景,鼠標經過才顯示出來。
- 需要使用絕對定位(absolute);
- 下面的元素是一張圖片,不是文字;
- 絕對定位後的A鏈接Bug還影响到 IE7;
- 絕對定位後的A鏈接,後面緊跟一張圖,這種情況下的Bug影响到IE7和IE8。
看mytest1,分析上面4種方法:
- 由於設定了絕對定位,元素脫離正常的文檔流。例中A鏈接的父元素對 A 本身沒有影响,所以不測試上文中test1和test4兩種方法。
- test2 的方法,為自身觸發layout。可是這個例子中已為A鏈接設定了絶對定位,等同觸發了layout,理應可以消除BUG,但實測卻不是這樣。原因是test2 的方法設了背景,所以觸發自身layout就有效,而這個例子中,a沒有背景,a:hover才顯示背景,所以test2方法無效。
- test3 的方法,觸發相鄰元素的layout。結果是,相鄰元素的内容是文字時這個方法才有效,圖片的話就無效,需要設定背景來解決,見mytest2
- 同上第一條。
總結:
非絕對定位的塊級鏈接,選用 test2 – test4 的方法(設背景圖或用純色);
絕對定位的鏈接,如果緊跟着的元素是文字,就觸發該元素的layout;
如果緊跟着的是圖片,那麽就必需為A鏈接設定背景圖,如果用一張不存在的圖片會導致404錯誤,這時可用background-image:url(about:blank)。
另外,還有其它的方法:(2)一張1×1的透明GIF來做背景圖;(3)將默認狀態和鼠標經過的狀態都設定同一張背景。
p.s 使用工具 IE DeveloperToolbar 查看:display:block, border不能觸發layout
</end>