Thems style: Alpha 10% Alpha 30% Alpha 50% Alpha 70% Alpha 90%

one two three four five

改善IE6中a与a:hover的背景支持

6 Comments » Web Standards

在IE6中背景属性加a与a:hover两者的伪类结合,在正常逻辑下为何不起作用?测试这问题存在IE6及以下浏览器,这问题我经常遇到在之前一直采用其它方法取而代之,现在找到了另一种解决。

以导航为例,下面的代码完全符合CSS的逻辑,理论上应该是”a:hove的背景图片”结合”a.nav_1的背景定位” 而得出预想的结果,但IE6却异常地只显示背景图片而没有对上背景坐标Demo(请使用IE6与IE6以上浏览器作对比)。

*{margin:0;padding:0;}
.header{ position:relative; width:745px; height:225px; background:url(bg.jpg) no-repeat;}
/*导航*/
#nav p{ position:absolute; left:0; bottom:0; width:100%;}
#nav a{float:left;height:44px;overflow:hidden;line-height:200px;font-size:0;}
#nav a:hover{background:url(bg.jpg) no-repeat 0 0;}
/*导航经过状态: IE6及以下浏览器不兼容,其它浏览器正常*/
#nav a.nav_1{width:80px;background-position:0 -213px;}
#nav a.nav_2{width:86px;background-position:-80px -213px;}
#nav a.nav_3{width:227px;background-position:-166px -213px;}
#nav a.nav_4{width:92px;background-position:-393px -213px;}
#nav a.nav_5{width:98px;background-position:-485px -213px;}
#nav a.nav_6{width:162px;background-position:-583px -213px;}

之前我使用的解决方案是,再经过状态添加对应的选择符。这方法感觉代码显得比较臃肿,而对于代码洁癖的我是比较难接受的Demo

/*导航经过状态: 之前的解决方案*/
#nav a.nav_1:hover,
#nav a.nav_1{width:90px;background-position:0 -211px;}
#nav a.nav_2:hover,
#nav a.nav_2{width:86px;background-position:-80px -213px;}
#nav a.nav_3:hover,
#nav a.nav_3{width:227px;background-position:-166px -213px;}
#nav a.nav_4:hover,
#nav a.nav_4{width:92px;background-position:-393px -213px;}
#nav a.nav_5:hover,
#nav a.nav_5{width:98px;background-position:-485px -213px;}
#nav a.nav_6:hover,
#nav a.nav_6{width:162px;background-position:-583px -213px;}

理论上”a.nav_1″选择符比”a:hover”要高,但我尝试添加!important时测试发现IE6却显示正常Demo

而测试其它浏览器也无副作用,这次似乎与haslayout无关了,但其产生原因与结果也却让人百思不得其解

/*导航经过状态: 现在的解决方案*/
#nav a.nav_1{width:80px;background-position:0 -211px!important;}
#nav a.nav_2{width:86px;background-position:-80px -213px!important;}
#nav a.nav_3{width:227px;background-position:-166px -213px!important;}
#nav a.nav_4{width:92px;background-position:-393px -213px!important;}
#nav a.nav_5{width:98px;background-position:-485px -213px!important;}
#nav a.nav_6{width:162px;background-position:-514px -213px!important;}

ytzong 提供的解决方法很不错赞~, 看来不使用背景缩写还是有它的好处。IE6在背景相加的逻辑上的确是有问题,同样测试过border属性则不存在这问题Demo

*{margin:0;padding:0;}
.header{ position:relative; width:745px; height:225px; background:url(bg.jpg) no-repeat;}
/*导航*/
#nav p{ position:absolute; left:0; top:180px; width:100%;}
#nav p a{float:left;height:44px;overflow:hidden;line-height:200px;font-size:0;}
#nav p a:hover{background-image:url(bg.jpg); background-repeat:no-repeat;}
/*导航经过状态: IE6及以下浏览器不兼容,其它浏览器正常*/
#nav p a.nav_1{width:80px;background-position:0 -213px;}
#nav p a.nav_2{width:86px;background-position:-80px -213px;}
#nav p a.nav_3{width:227px;background-position:-166px -213px;}
#nav p a.nav_4{width:92px;background-position:-393px -213px;}
#nav p a.nav_5{width:98px;background-position:-485px -213px;}
#nav p a.nav_6{width:162px;background-position:-583px -213px;}

不知道还没有更好的方法呢~

6 Responses to “改善IE6中a与a:hover的背景支持”

  1. ytzong 2009 十一月 19th at 21:55 Says:

    第一个DEMO,将#nav a:hover{background:url(bg.jpg) no-repeat 0 0;}改为#nav p a:hover{background-image:url(bg.jpg);background-repeat:no-repeat;}后正常
    我的习惯是背景等属性不使用缩写:)

  2. Mr.Q 2009 十一月 19th at 22:44 Says:

    content:”";在这里的作用是什么?

  3. chesanqi 2009 十一月 20th at 12:51 Says:

    把hover放在a前面绕死我了,我想了好大会才理解是什么意思.先定位然后再加载图片,这方法不错受启发了.

    降低a:hover选择符的特殊性方法似乎更简单,将
    #nav a:hover{background:url(bg.jpg) no-repeat 0 0;}
    改为
    a:hover{background:url(bg.jpg) no-repeat 0 0;}
    或者,提高a.nav_1这6个的特殊性,将
    #nav a.nav_1{width:80px;background-position:0 -213px;}
    改为
    div.header #nav a.nav_1{width:80px;background-position:0 -213px;}

    这样a:hover还是放到后面a的下面,火狐里也不会出错了还符合习惯性的阅读顺序.
    看来是IE6对选择符特殊性的计算有问题.

  4. chesanqi 2009 十一月 20th at 13:01 Says:

    另外 DEMO1这个案例在IE6下还有个重复字符的BUG,总宽超过743px;就会重复一次出现nav6字段.

  5. Gulu77 2009 十一月 20th at 19:00 Says:

    @chesanqi ——厉害这样也被你测试出来,我想应该是浮动引起的重复字符问题

  6. Gulu77 2009 十一月 20th at 19:09 Says:

    @Mr.Q——手误的产物content:””;在这里是多余的。曾有人讨论过使用content:””;来处理特殊情况的字体隐藏问题,但根据测试似乎用不上了,至于是那种特殊情况还有待研究。

Leave a Reply