请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 15321|回复: 24

[教程] IE中伪类:hover的使用及BUG [复制链接]

blank 楼主

怿飞

荣誉管理

帖子
2375
体力
12545
威望
125
居住地
浙江省 杭州市
发表于 2007-2-15 16:10:00 |显示全部楼层
BLOG地址:http://www.planabc.net/article.asp?id=108

: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部分:

  1. <ul>
  2. <li>鼠标移过来触发我吧!<a href="#" title="">哈哈,终于被你发现了!</a></li>  
  3. </ul>
复制代码


CSS部分:

  1. * {margin:0; padding:0;}
  2. ul {list-style:none;margin:100px;}
  3. li {height:100px; width:100px; background:#000; font-size:12px; color:#fff; position:relative;}
  4. li a {display:none;}
  5. li:hover a{display:block; text-decoration:none;width:100px; height:100px; background:#c00; position:absolute; top:50px; left:50px; color:#fff;}
复制代码


演示效果:

 提示:您可以先修改部分代码再运行



大家可以测试发现在FF等对CSS2支持很好的浏览器中,可以显示我们所要达到的效果,但在IE6中却无法实现。

下面让我们换一种思维,所用CSS1的写法来看看,这个时候由于无法支持li元素:hover的使用,我们只好把所有文字包含到a中,对a使用:hover,并且将要显示隐藏的部分放到span元素中,首先我们对XHTML进行部分调整,调整如下:

XHTML部分:

  1. <ul>
  2. <li><a href="#" title="">鼠标移过来触发我吧!<span>哈哈,终于被你发现</span></a></li>  
  3. </ul>
复制代码


CSS中我们将a的设置成块级元素,并使a的大小和宽度和li的相同,并设置a为相对位置,用a来模拟上例中的li;而用span来模拟上例中的a,设置span在默认情况下隐藏(display:none;),当a被触发时(:hover),则span显示(display:block;)

CSS部分:

  1. * {margin:0; padding:0;}
  2. ul {list-style:none;margin:100px;}
  3. li {height:100px; width:100px; background:#000; font-size:12px; }
  4. li a {display:block; height:100px; width:100px; position:relative; color:#fff; text-decoration:none;}
  5. li span {display:none; }
  6. 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代码我们增加:

  1. 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的特定属性。

说明:

1、对于dispaly不可以用本例来测试,可另外写个更简单的例子(去除ul/li,a和span中的position)。在实际应用中怿飞不建议改变display值来做为特定属性消除此BUG,而且在某些例子中此属性不一定能消除BUG。
2、对于做为特定属性的border和background中的颜色我们还可用全写和简写来改变,如#fff和#ffffff在消除BUG中解析为2个不同的值。

最终效果:

 提示:您可以先修改部分代码再运行


[ 本帖最后由 blankzheng 于 2007-2-15 17:04 编辑 ]
个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!
西部数码顶级域名注册商39元抢注!
hero4u 

孤竹林

金牌会员 手机认证 

帖子
1305
体力
3444
威望
14
居住地
湖南省 长沙市
发表于 2007-2-15 20:19:00 |显示全部楼层
呵呵,是这样的了,IE中出发a:hover 事件,需要a:hover 属性有所改变了。
体验游戏 game4power
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

帖子
86
体力
207
威望
0
居住地
浙江省 杭州市
发表于 2007-2-27 09:38:51 |显示全部楼层
li a:hover {background:#ccc;}
把色值去了也可以,就像这样li a:hover {background:;}
www.designnull.com

使用道具 举报

blank 楼主

怿飞

荣誉管理

帖子
2375
体力
12545
威望
125
居住地
浙江省 杭州市
发表于 2007-2-27 09:39:59 |显示全部楼层
原帖由 flashghost 于 2007-2-27 09:38 发表
li a:hover {background:#ccc;}
把色值去了也可以,就像这样li a:hover {background:;}


但是这样写是不规范的!
个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!

使用道具 举报

abcda 
帖子
4
体力
11
威望
0
发表于 2007-4-7 16:45:32 |显示全部楼层
楼主的这个结果.对..我的启发太大了..谢谢...

使用道具 举报

jayliu 
帖子
100
体力
383
威望
0
发表于 2007-4-7 17:06:28 |显示全部楼层
你好LZ,请问一下是只能够往a中添加像SPAN 这样的非块级元素吗? 但是如果要在a中添加如<UL>这样的块级元素呢?然后在去使用a:hover 如上去触发伪类好象难实现,就是实现了效果好象在a添加ul这样的块级元素好象不太符合标准的代码简洁??是么??我想做一个动态的下拉菜单,好象只有用Li:hover去触发其子元素象ul,ol这样的元素,但是IE6又不支持郁闷呀....有什么办法克服在IE6的问题呢? ?希望得到您的回答呵呵.

使用道具 举报

帖子
875
体力
640
威望
0
居住地
广东省 深圳市
发表于 2007-6-20 12:02:53 |显示全部楼层
写的很不错 ..   易于接受...

使用道具 举报

帖子
1008
体力
2798
威望
0
发表于 2007-6-20 12:17:20 |显示全部楼层
寫得好, 希望多出類似的教材。

使用道具 举报

帖子
32
体力
35
威望
0
发表于 2007-6-22 11:57:02 |显示全部楼层
为什么在这里点“运行代码”可以看到效果,而把全部代码拷到DW里,效果就显不出来了呢?完全失效了。

使用道具 举报

帖子
27
体力
66
威望
0
发表于 2008-7-31 11:36:08 |显示全部楼层
很受启发 谢谢诶~~

使用道具 举报

chez 
帖子
83
体力
224
威望
0
居住地
浙江省 杭州市
发表于 2008-7-31 22:29:05 |显示全部楼层
*li a:hover{font-size: 100%;}

就可以了.

[ 本帖最后由 chez 于 2008-7-31 22:30 编辑 ]

使用道具 举报

hzhjun 

华仲君

银牌会员 手机认证 

帖子
532
体力
2332
威望
5
发表于 2008-11-18 11:39:52 |显示全部楼层
刚刚学到的:只要帮position:relative;放到a:hover {}就ok了!

使用道具 举报

柴鸡不柴

中级会员 手机认证 

帖子
317
体力
444
威望
0
居住地
河南省 南阳市
发表于 2008-11-26 00:13:22 |显示全部楼层
楼上的好办法。。。不改变任何原来的样子 呵呵

使用道具 举报

飞翔天际

高级会员 手机认证 

帖子
202
体力
522
威望
0
居住地
北京市 朝阳区
发表于 2008-11-26 14:29:04 |显示全部楼层
很好的文章,
另外我测试了一下..

貌似使用 position:relative;
不可以触发~

但是LZ并没有说道这个属性~

何解?
Never give up! Never stop study!

使用道具 举报

ycbx 
帖子
55
体力
119
威望
0
发表于 2008-12-10 23:29:05 |显示全部楼层
请问一下 如果把里面的文字链接 换成图片链接呢 会有什么效果?
也就是鼠标移动到图片上能浮动出信息吗?

使用道具 举报

yoom 

木匠的背篓

版主 手机认证 

帖子
4903
体力
14530
威望
18
居住地
浙江省 杭州市

维基贡献

发表于 2008-12-10 23:58:35 |显示全部楼层
曾经用十分变态的方法写的。
a:hover http://www.cjblake.com/gallery.html

使用道具 举报

帖子
8
体力
17
威望
0
发表于 2008-12-11 11:13:02 |显示全部楼层
原帖由 hero4u 于 2007-2-15 20:19 发表
呵呵,是这样的了,IE中出发a:hover 事件,需要a:hover 属性有所改变了。

原来如此~ 学习了:-)

使用道具 举报

帖子
312
体力
1172
威望
0
居住地
广东省 广州市
发表于 2008-12-11 21:41:24 |显示全部楼层
li a:hover{ display:block;}
用这个挺好,不改变原来颜色状态,在ie6中触发显示。

使用道具 举报

帖子
1
体力
18
威望
0
发表于 2010-12-19 15:24:31 |显示全部楼层

请大家帮忙看看,为什么在IE下显示不正常。在FF中正常。

<!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=gb2312" />
<title>无标题文档</title>


<style type="text/css">
body{
    font:13px "宋体";
        color:#333333;
        text-align:center;
        text-decoration:none;
        margin:0;
        padding:0;
}

#menu {
    margin: 0px auto ;
        padding:0px;
        border-bottom:2px solid #FF0000;       
   width:500px;
   z-index:10;
       
}
#menu ul {   
    margin:0px auto;
        padding:0px;
        height:27px;
        width:480px;
       
      
}
#menu li {
    float:left;
        list-style:none;
        margin:0;
       
        }
#menu li a:hover {
    color:#666666;}       
#menu li a.current,#menu ul li a:hover.current {
    background:url(images/bg.gif)  no-repeat;
}
#menu li a{
    text-decoration:none;
    display:block;
        background:url(images/bg.gif) 0px -28px no-repeat;
        width:87px;
        padding:4px 2px;
        margin:0px;
        color:#CCCCCC;
   
}
#menu ul li a:hover {
    background:url(images/bg.gif) 0px -56px no-repeat;
        padding:4px 2px;
        margin:0px;
     text-decoration:none;
}
#menu ul li a span{
  display: none;
}
#menu ul li a span ul li{
   border-bottom:2px;
}
#menu ul li a span ul li{
  clear:both;
  margin:0 -2px;
  border:1px solid  #FDDFAC;
  border-top:none;
  width:85px;
   z-index:1;
}
#menu ul li a:hover span ul li a{
  background:none;
}
#menu ul li a span ul li a{
background:none;
border-bottom:none;
}
#menu ul li a:hover span {
  display:block;
}
</style>
</head>
     <div id="menu">
             <ul>
                    <li ><a href="#" class="current" >首页
                                
                                </a>

                          
                                     
                                  
                                  
                                  
                                  
                       
                       
                        </li>
                       
                       
                       
                       
                        <li><a href="#">新闻快递
                                <span><ul><li><a href="#">社会瞭望</a></li>
                                               <li><a href="#">环球看点</a></li>
                                                           <li><a href="#">探寻宇宙</a></li>
                                                          
                                          </ul>
                                     </span>
                                </a>

                                       
                        </li>
                        <li><a href="#">热点追踪
                                <span><ul><li><a href="#">民生问题</a></li>
                                               <li><a href="#">深入挖掘</a></li>
                                                           <li><a href="#">百姓纪实</a></li>
                                                           <li><a href="#">往期回顾</a></li>
                                          </ul>

                                     </span>   
                       
                       
                       
                          </a>
                        </li>
                        <li><a href="#">深度观察
                                    <span><ul><li><a href="#">社会瞭望</a></li>
                                               <li><a href="#">环球看点</a></li>
                                                           <li><a href="#">环球看点</a></li>
                                                           <li><a href="#">环球看点</a></li>

                                          </ul>
                                     </span>   
                            
                           </a>
                           </li>
                        <li><a href="#">网友观点</a></li>
                 </ul>
     </div>
<body>
</body>
</html>

请大家帮忙看看,为什么在IE下显示不正常。在FF中正常。

使用道具 举报

帖子
962
体力
898
威望
0
居住地
广东省 广州市
发表于 2010-12-21 09:44:23 |显示全部楼层
正需要。这个问题搞了我半天啦。

使用道具 举报

帖子
6
体力
37
威望
0
发表于 2011-5-4 22:51:46 |显示全部楼层

回复 1# blank [楼主] 的帖子

li a:hover {background:url(about:blank)}
就可以;
珍惜生活

使用道具 举报

zxbmt 

记忆碎片

银牌会员

帖子
371
体力
1654
威望
0
发表于 2011-5-5 10:50:49 |显示全部楼层
曾经我也因为这个BUG头疼老办天,最后不得不采用JS的方法来解决,今天看到这篇文章又想起以前的经历,呵呵,收藏之~~
我来打酱油的~~

使用道具 举报

帖子
53
体力
289
威望
0
居住地
广东省 深圳市
发表于 2011-5-9 13:28:47 |显示全部楼层
顶楼主,以前我还以为ie6不能做到:hover之后display:block,看到楼主的贴,让我受惊了

另发现,a:hover{_zoom:1;}也是可以的哈~既然a原本就已经触发了haslayout,所以这样写也没什么后顾之忧~~而且新人或不懂的人也可以看出这段代码是解决ie6的某个bug。

[ 本帖最后由 bboyjoin 于 2011-5-9 13:30 编辑 ]

使用道具 举报

帖子
90
体力
185
威望
0
居住地
湖北省 武汉市
发表于 2011-5-10 09:41:22 |显示全部楼层
很管用 谢谢分享
meidizx.com

使用道具 举报

sivan 

四万

中级会员 手机认证 

帖子
220
体力
486
威望
0
发表于 2011-5-10 10:11:25 |显示全部楼层
2、对于做为特定属性的border和background中的颜色我们还可用全写和简写来改变,如#fff和#ffffff在消除BUG中解析为2个不同的值。

学习了。

3L的方法不合规范,不建议采用。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-12 08:10 , Processed in 0.131079 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部