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

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 32279|回复: 55

[教程] position:relative/absolute无法冲破的等级 [复制链接]

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2007-2-12 13:21:55 |显示全部楼层
注:本文实例在IE5下可能会显示不出来,请使用IE5.x、IE6、IE7、Firefox、Opera等浏览器来调试!

前段时间记得好像是谁在群里提出了一个实在是让大家都觉得很不理解的一个问题:
  1. <ul>
  2. <li>第一块</li>
  3. <li><span>第二块</span></li>
  4. <li>第三块</li>
  5. <li>第四块</li>
  6. <li>第五块</li>
  7. </ul>
复制代码

如果我我们设定LI为position:relative;设置span为position:absolute;那么我们会发现无论SPAN的z-index值设置得再高都将永远在后面父级的下面。
  1. *{margin:0; padding:0; list-style:none;}
  2. li {width:100px; height:100px; margin:0 5px 0 0; background:#000; float:left; position:relative; z-index:1;}
  3. li span {width:200px; height:200px; background:#c00; position:absolute; top:0; left:100px; z-index:1000;}
复制代码

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



试一下很容易发现我们的子级,z-index的值达到了1000的被设定了position:absolut;子级都被档在了父级的下面。我想了很久,我觉得其根本问题是:设置同样的position:relative/absolute;同级标签之间的等级是无法用z-index超越的。我们上面的例子中的第一个LI的等级永远都要小于后一个LI的等级,所以我们在LI里的子级身上设置了position:absolute;,给了非常高的z-index值。

也许你会这样来想:只要针对有span的LI设置position:relative;不就好了吗?非常正确。当其它的LI都不设置position:relative;那么我们需要的那个子级就可以浮在所有的内容之上。但是如果实际上,所有的LI中都要有span,并且属性都需要一样怎么办?当然我们不大会需要有这样的效果。但是我们需要有这样的效果:子级全部是隐藏的,当有鼠标反应时出现并且浮在所有的内容之上。我们要知道,这确实是件让人头疼的事,因为我们上面见识到了,子级在显示的时候都被压在了下一个父级标签的下面。下面我们来实现一下这个鼠标反应的定位效果:

  1. <ul>
  2. <li><a href="" title=""><span>第一块</span></a></li>
  3. <li><a href="" title=""><span>第二块</span></a></li>
  4. <li><a href="" title=""><span>第三块</span></a></li>
  5. <li><a href="" title=""><span>第四块</span></a></li>
  6. <li><a href="" title=""><span>第五块</span></a></li>
  7. </ul>
复制代码

我们通过链接的鼠标事件来完成这个显示隐藏效果:
  1. *{margin:0; padding:0; list-style:none;}
  2. li {height:100px; margin:0 5px 0 0; float:left; width:100px;}
  3. li a {position:relative; z-index:1; display:block; height:100px; width:100px;  background:#000;}
  4. li a:hover {background:#000000;}
  5. li span {display:none;}
  6. li a:hover span {display:block; background:#c00; width:200px; height:200px; position:absolute; top:0; left:100px; z-index:1000; }
复制代码

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



我们设定了a为position:relative;这样他的子级就会根据父级的左上角为坐标原点进行定位了。然后我们设定span的具体形状以及定位属性,然后把他隐藏了。我们再通过A的伪类:hover使得span被激活。我们看一下结果,我们会发现,所有应该在上面的现在全在下面了。那我们怎么解决这个难题呢,其实以CSS想强行突破是不太可能,所以我们反过来想,能不能让这个没有被触发的父级标签没有position:relative;属性,而只是触发的时候才有级这个父级赋上这样的值?其实想到这里基本上已经可以解决所有的问题了:

  1. *{margin:0; padding:0; list-style:none;}
  2. li {height:100px; margin:0 5px 0 0; float:left; width:100px;}
  3. li a {display:block; height:100px; width:100px;  background:#000;}
  4. li a:hover {position:relative; z-index:1; }
  5. li span {display:none;}
  6. li a:hover span {display:block; width:200px; height:200px; background:#c00; position:absolute; top:0; left:100px; z-index:1000; }
复制代码

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



我们只要针对a:hover来设定其属性为position:relative;就可以了,这样只有在鼠标触发的时候A才会被赋于一个相对定位的属性。这样就完成可以解决被其它父级标签所挡的尴尬了。

当然如果不介意IE6或是IE5.X这样的浏览器我们还可以把代码再做简化:

  1. <ul>
  2. <li><span>第一块</span></li>
  3. <li><span>第二块</span></li>
  4. <li><span>第三块</span></li>
  5. <li><span>第四块</span></li>
  6. <li><span>第五块</span></li>
  7. </ul>
复制代码


CSS可以改成这样:

  1. *{margin:0; padding:0; list-style:none;}
  2. li {height:100px; margin:0 5px 0 0; float:left; width:100px; background:#000;}
  3. li:hover {position:relative; z-index:1;}
  4. li span {display:none;}
  5. li:hover span {display:block; width:200px; height:200px; background:#c00; position:absolute; top:0; left:100px; z-index:1000; }
复制代码

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




原始阅读:
http://andymao.com/andy/post/67.html

[ 本帖最后由 小毅 于 2007-3-21 20:28 编辑 ]
已有 1 人评分威望 收起 理由
blank + 2 精品文章

总评分: 威望 + 2   查看全部评分

西部数码顶级域名注册商39元抢注!
帖子
95
体力
209
威望
0
发表于 2007-2-12 13:47:26 |显示全部楼层
研究的很透彻,赞一个!
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

blank 

怿飞

荣誉管理

帖子
2375
体力
12545
威望
125
居住地
浙江省 杭州市
发表于 2007-2-12 13:50:12 |显示全部楼层
分析的比较透彻,不过对于position:relative的运用的研究应该还可以更深入,感觉position:relative是个比较神秘的属性!
个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!

使用道具 举报

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2007-2-12 13:52:55 |显示全部楼层
越来越痛恨IE,太可恶了,基本的效果都实现不了!

定位,一直以来都是一个让人头疼的问题。很神秘以至于很多人都对之敬而远之。

使用道具 举报

帖子
95
体力
209
威望
0
发表于 2007-2-12 13:55:46 |显示全部楼层
痛恨是没有用的,有些朋友不是以标准为标准,而是以IE为标准.
这有什么办法呢,IE毕竟是浏览器的主流.
希望以后M$能更好的配合W3C的标准吧.

使用道具 举报

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2007-2-12 14:06:31 |显示全部楼层
我现在用IE7,我觉得已经好多了,至少IE7还能正确显示上面的例子!

使用道具 举报

帖子
95
体力
209
威望
0
发表于 2007-2-12 14:15:11 |显示全部楼层
是的,但IE7的普及还需要一个过程.
M$的升级不只是软件,对用户的硬件也提出了更高的要求.
这一次的升级不象WIN2K升到WINXP那样迅速.
单独升级IE的毕竟是少数.个人感觉IE6在一定时期内,还是占据着重要位置.
有些东西我们需要取舍,有些BUG,还需要HACK,头疼.

使用道具 举报

babysize

中级会员

帖子
321
体力
325
威望
2
发表于 2007-2-13 13:50:16 |显示全部楼层
但是有个大问题………………如果<span></span>里还有<a>的话,就~~~A里是不能包A的,所以还是,失败~~

使用道具 举报

michi 
帖子
85
体力
130
威望
0
发表于 2007-2-16 11:02:18 |显示全部楼层
我正好遇到这个问题了

使用道具 举报

blank 

怿飞

荣誉管理

帖子
2375
体力
12545
威望
125
居住地
浙江省 杭州市
发表于 2007-2-26 10:25:34 |显示全部楼层
测试的时候要注意IE6的:hover BUG!
详细请见:http://bbs.blueidea.com/thread-2721472-1-2.html
个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!

使用道具 举报

帖子
163
体力
565
威望
0
发表于 2007-2-26 13:17:25 |显示全部楼层
楼主,其实你的第二段已经做出你所需要的效果了,只是有一个地方的设置出了问题,换个思路,一样能够得到所需要的效果,span之所以设定z-index为最高但还在a的下面,是因为你设置了a的背景色属性,导致浏览器解析出了问题,ff和ie一样,原理我不清楚,自己估计有背景色的被默认为最高显示,我把a的背景色挪动到li上面,一切正常,呵呵,有时候换个思路,就有一次新的发现,欢迎探讨,另,最后一段代码,ie6没认出来你的a


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


[ 本帖最后由 1356803 于 2007-2-26 13:19 编辑 ]

使用道具 举报

blank 

怿飞

荣誉管理

帖子
2375
体力
12545
威望
125
居住地
浙江省 杭州市
发表于 2007-2-26 13:38:59 |显示全部楼层
楼上的代码仔细在IE6中测试下还是有问题的!

比如你第一次触发第一个黑格,然后移开鼠标,再将鼠标移到第二个黑格下面,你会发现也可以显示第一个黑格触发的span

[ 本帖最后由 blankzheng 于 2007-2-26 13:40 编辑 ]
个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!

使用道具 举报

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2007-2-26 14:07:14 |显示全部楼层
原帖由 1356803 于 2007-2-26 13:17 发表
楼主,其实你的第二段已经做出你所需要的效果了,只是有一个地方的设置出了问题,换个思路,一样能够得到所需要的效果,span之所以设定z-index为最高但还在a的下面,是因为你设置了a的背景色属性,导致浏览器解 ...



这里你可能没有理解,由于这个例子过于简单了,所以你的那样修改只是一个障眼法,如果例子复杂一点可能又不对了,下面我把HTML结构中的A中加一些文字你再看看,你就清楚是怎么回事了!

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


[ 本帖最后由 小毅 于 2007-2-26 14:32 编辑 ]

使用道具 举报

帖子
163
体力
565
威望
0
发表于 2007-2-26 14:26:29 |显示全部楼层
原帖由 blankzheng 于 2007-2-26 13:38 发表
楼上的代码仔细在IE6中测试下还是有问题的!

比如你第一次触发第一个黑格,然后移开鼠标,再将鼠标移到第二个黑格下面,你会发现也可以显示第一个黑格触发的span


没仔细弄,谢谢提醒,改一下代码应该就没问题了,楼主的代码一样有这个问题

使用道具 举报

blank 

怿飞

荣誉管理

帖子
2375
体力
12545
威望
125
居住地
浙江省 杭州市
发表于 2007-2-26 14:31:25 |显示全部楼层
重新优化一下代码就没问题了,对于hover触发隐藏的例子,强烈建议这样书写:

  1. li span {display:none;}
  2. li a:hover span {display:block;其他所有属性}
复制代码


修改如下:


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

个人Blog:PlanABC   团队Blog:淘宝UED  专注Web前端技术!

使用道具 举报

帖子
163
体力
565
威望
0
发表于 2007-2-26 14:37:53 |显示全部楼层
这样就没问题了,呵呵,多谢楼主指正,这个就不会出现将鼠标移到第二个黑格下面,触发第一个黑格的span



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


[ 本帖最后由 1356803 于 2007-2-26 14:50 编辑 ]

使用道具 举报

帖子
163
体力
565
威望
0
发表于 2007-2-26 14:53:56 |显示全部楼层
原帖由 blankzheng 于 2007-2-26 14:31 发表
重新优化一下代码就没问题了,对于hover触发隐藏的例子,强烈建议这样书写:

li span {display:none;}
li a:hover span {display:block;其他所有属性}

修改如下:


<!DOCTYPE html PUBLIC " ...




你还是没有解决楼主说的a带链接文字的问题,呵呵,重叠了,我开始也没有注意那个,再看看我发的那个没问题的代码,有问题共同研究

使用道具 举报

小毅 楼主

悟禅布衣

荣誉管理

帖子
1137
体力
10276
威望
218
居住地
广东省 广州市
发表于 2007-2-26 15:10:01 |显示全部楼层
原帖由 1356803 于 2007-2-26 14:37 发表
这样就没问题了,呵呵,多谢楼主指正,这个就不会出现将鼠标移到第二个黑格下面,触发第一个黑格的span



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...



现在改好的这个,与倒数第二个例子就是一回事!

使用道具 举报

帖子
163
体力
565
威望
0
发表于 2007-2-26 16:34:49 |显示全部楼层
原帖由 小毅 于 2007-2-26 15:10 发表



现在改好的这个,与倒数第二个例子就是一回事!



仔细看了是一样的,但是你忘了清除浮动,hoho,粗心还是懒得打了?我看你最新发的那个指出我错误的那个例子里,也会出现span的问题,所以我试着做的这个例子,你误会了。另,我用overflow:hidden的方法在ul上清除浮动,span高就不为200px; 超过a的长度100px,其余的就被砍掉了,呵呵,解释一下?

使用道具 举报

帖子
33
体力
80
威望
0
发表于 2007-2-26 21:33:50 |显示全部楼层
postion:reletive属性不是不能定义z-index吗!不是只有absolute才有吗

使用道具 举报

cvvi 
帖子
78
体力
340
威望
0
发表于 2007-2-27 10:54:48 |显示全部楼层
原帖由 309172270 于 2007-2-26 21:33 发表
postion:reletive属性不是不能定义z-index吗!不是只有absolute才有吗


relative  absolute都能定义z-index

使用道具 举报

lanqi 
帖子
113
体力
302
威望
0
居住地
广东省 深圳市
发表于 2007-2-27 16:02:57 |显示全部楼层
又学到东西了
--陷于蓝--

使用道具 举报

帖子
35
体力
115
威望
0
发表于 2007-2-27 18:37:13 |显示全部楼层
ha 又发掘了
1234567890

使用道具 举报

esnak 
帖子
370
体力
1242
威望
0
发表于 2007-2-27 20:09:40 |显示全部楼层
佩服楼主的研究精神,学习了
jgwy-esnak

使用道具 举报

幽谷鸟

银牌会员

帖子
883
体力
2830
威望
2
居住地
广东省 深圳市
发表于 2007-2-28 11:54:56 |显示全部楼层

中英菜单

好贴,学习完此例,可以制一个中英文菜单

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


[ 本帖最后由 winhero_charles 于 2007-2-28 13:39 编辑 ]

使用道具 举报

14px 

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2007-2-28 20:00:07 |显示全部楼层
精辟``````我也常遇到类似的事情,受教。

使用道具 举报

帖子
1163
体力
4277
威望
0
发表于 2007-3-1 14:58:04 |显示全部楼层
以HOVER作为position:realtive个人感觉超好
忍受。一定要学会忍受。

使用道具 举报

jddwtr 
帖子
36
体力
82
威望
0
发表于 2007-3-2 15:50:57 |显示全部楼层
最后一个在IE6.0中没有效果

使用道具 举报

帖子
573
体力
1268
威望
0
发表于 2007-3-2 16:10:06 |显示全部楼层
可以不给子级加display:none;可以加overflow:hidden;是一样的效果。
http://bbs.blueidea.com/thread-2723488-1-1.html
我用的就是overflow:hidden;

使用道具 举报

帖子
573
体力
1268
威望
0
发表于 2007-3-2 16:10:56 |显示全部楼层
不过HOVER作为position:realtive确实可以避免楼主说的问题,但一般是用不到的,支持!

使用道具 举报

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

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

GMT+8, 2012-2-12 07:58 , Processed in 0.140727 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部