导航

毅博客

分享本身就是件快乐的事,我因别人得到帮助而感到幸福

« 详解链接的rel与target打印样式的注意事项 »

position:relative/absolute无法冲破的等级

前段时间记得好像是谁在群里提出了一个实在是让大家都觉得很不理解的一个问题:

  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:100px; 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才会被赋于一个相对定位的属性。这样就完成可以解决被其它父级标签所挡的尴尬了。

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

  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://bbs.blueidea.com/thread-2720856-1-1.html







资助者链接:pearl earrings    

  • quote 2.hax
  • http://johnhax.blogspot.com/
  • What u see is a bug of IE (position:relative always create a new layout stack context, it should only be created when z-index!=auto as css spec), try Opera and Firefox.
  • 2007-3-15 11:33:00 回复该留言
  • quote 3.振之
  • http://www.andymao.com
  • HAX,我是做过多方测试才写的这篇文章,这并不是IE的BUG而是一种HTML的等级限制,不光是IE这样,所有的浏览器都一样,这不是BUG,是基本原理!
    侦探 于 2009-3-8 11:26:45 回复
    你没有理解:子元素的堆叠顺序永远由其父元素决定。如果父元素的堆叠顺序比别人低,那它的所有子元素肯定会被遮住如果定位位置发生重叠,无论子元素设置的z-index值多么高。
    该文中提出的问题在本质上是:文档流中后一个a元素遮住前一个a元素的子元素span,设置一下每个a元素的z-INDEX属性即可解决。
  • 2007-3-16 14:13:45 回复该留言
  • quote 5.木鱼
  • 我用这个方法模拟过一个title样式,但在FF下不正常,今天总算解决了,有恍然大悟的感觉,呵呵
  • 2007-7-13 20:04:02 回复该留言
  • quote 10.qinai
  • http://www.newsunday.com
  • 博主,有个问题想咨询一下,困扰我好久了,不得其解。

    我在换模板的时候遇到这样一个问题,版权不能始终固底。
    地址引用ZBLOG中我发的信息吧。<url>bbs.rainbowsoft.org/thread-18751-1-1.html</url>

    谢谢了,期待得到您的回复。
  • 2007-12-18 18:44:06 回复该留言
  • quote 11.太感谢了
  • 太感谢了,这个问题困扰了我一下午,因为,刚接触用div+css,总以为是自己没用对,希望以后多多交流,呵呵
  • 2008-1-16 17:25:19 回复该留言
  • quote 15.red
  • 这个问题的答案,终于在你这里看到了
    十分感谢.


  • 2008-8-5 22:20:28 回复该留言
  • quote 18.浮尘
  • 当然如果不介意IE5这样的浏览器我们还可以把代码再做简化:



    好像是IE6吧!
    是不是笔误!!
  • 2008-9-3 18:34:15 回复该留言
  • quote 20.无鞋
  • 请问这个点击效果怎么去除呢?或者说用这个方法能做弹出菜单吗?这个子集里边没办法写列表了吧?
  • 2009-2-17 16:05:09 回复该留言
  • quote 21.侦探
  • 虽然我是一个初学者,但是感觉楼主的基础知识不牢固。

    “ 如果我我们设定LI为position:relative;设置span为position:absolute;那么我们会发现无论SPAN的z-index值设置得再高都将永远在后面父级的下面。”
    ---
    上面的解决出发点是错误的。应该设置每个Li的z-index值。会出现这个问题是:这里的所有li都是定位元素。后面的li的堆叠级别(高的可能会覆盖低的,如果定位位置有重叠)比前一个li的高(包括前一个li的所有子元素,无论子元素span设置了多么高的z-index值,但是它的父元素li的堆叠级别始终比后面的li低啊,这是因为元素在文档流中先后关系产生的。
  • 2009-3-8 10:57:53 回复该留言
  • quote 22.侦探
  • “设置同样的position:relative/absolute;同级标签之间的等级是无法用z-index超越的”
    ----
    这也是错误的,可以用z-index超越,默认是在文档流中后面的元素可能遮住前面元素如果定位位置产生重叠。
  • 2009-3-8 11:02:14 回复该留言
  • quote 23.侦探
  • http://dfgfdg
  • “所以我们反过来想,能不能让这个没有被触发的父级标签没有position:relative;属性,而只是触发的时候才有级这个父级赋上这样的值?”
    --
    这样的解决办法是逃避。
    正确的方法
    <li><a href="" title="" style="z-index:5;"><span>第一块</span></a></li>
    <li><a href="" title="" style="z-index:4;"><span>第二块</span></a></li>
    <li><a href="" title="" style="z-index:3;"><span>第三块</span></a></li>
    <li><a href="" title="" style="z-index:2;"><span>第四块</span></a></li>
    <li><a href="" title="" style="z-index:1;"><span>第五块</span></a></li>
    为什么是这样的呢,还是那条规则:
    默认情况下在文档流中后面的元素可能遮住前面元素如果定位位置产生重叠,但是可以通过z-index值改变这种默认情况。
    rentj2 于 2009-12-4 13:22:21 回复
    @侦探

    虽然楼主的方法不完美,但是你的方法更垃圾,如果列表项很多要一个一个加style或class 这样的垃圾最不能让人忍受了.
  • 2009-3-8 11:14:58 回复该留言
  • quote 24.振之
  • http://www.andymao.com/
  • @侦探,我的基础知识的确是不够。

    不过我想说的是,如果我想要把每个li都设置一个z-index值,我就不写这篇文章了。我从一开始就主张样式与结构的分离,我不可能用这种方式去推翻我自己的主张。

    另外,这个实例不是用来解决某个案例的某个效果,只是用来解释在特定环境上的一种现象。解决方式有很多,非某一种为佳。对于工作人员来说,解决问题就可以,解决问题的方法上谈不上"逃避"一说。我们的目标是为了达到目标不是吗?

    至于我说的内容一定有不足,因为这也是两年前写的东西,虽然难免有不足的地方,但是我当时为了研究这个问题是反复的实验过的。并非是一时冲动胡写一通。或是你能认真的去尝试在不同浏览器下的实验,也许你不会断章取义的说我某句话是错误的。

    出发点不同,看问题的结果也就不一样。不存在偏见即可。提出你的解决方法我很欢迎,有不同看法我也很欣赏。
  • 2009-3-8 16:12:15 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog .Theme from Google黑板报 By Washun

Copyright 2005-2007 Andymao.com. All Rights Reserved.

Search

控制面板

最新评论及回复

最近发表