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

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 8324|回复: 28

[教程] 理解五条叠加法则,自由使用层的叠加 [复制链接]

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-4-27 11:22:52 |显示全部楼层
[参与测试的浏览器:IE6 / IE7 / IE8 / FF3 / OP9.6 / SF3 / Chrome2 ]
[操作系统:Windows]

貌似很多同学对为什么这个div在上层,那个div在下层、无论如何设置z-index都无法居上的问题纠结抓狂、上吐下泻、恶心失眠、郁郁而终,致使不敢随意使用层的叠加。
但层的叠加效果,在交互设计中却频频出现,所以我们必须驾驭它,要驾驭它,就要掌握其规律。

首先明确几点在文中所需要用到的概念:

1. 静态定位:position:static(为position属性的默认值)。
2. 动态定位:position:relative或position:absolute或position:fixed。
3. 祖元素:任意包含该元素的元素。
4. 父元素:直接包含该元素的祖元素。
5. 同辈元素:拥有共同的父元素的元素。
【注】这些概念为作者自定义,仅用于本文。

关于同辈元素是个非常关键的词,这里还需要详细解释一下。
  1. <div>
  2.         <div></div>
  3.         <div id="a"></div>
  4.         <div></div>
  5.         <div></div>
  6.         <div></div>
  7.         <div></div>
  8. </div>
  9. <div id="f">
  10.         <div></div>
  11.         <div id="b"></div>
  12.         <div id="c"></div>
  13.         <div></div>
  14.         <div></div>
  15.         <div></div>
  16. </div>
复制代码

在这个例子中,div#a与div#b并不是“同辈元素”,只有像div#b和div#c这样拥有同样父体div#f的的元素才能叫“同辈元素”。


接下来看看这五条法则:

法则一:同辈元素定位方式相同,且无z-index设置时,html靠后者居上。



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



法则二:同辈元素同为动态定位时,且有z-index设置时,z-index值大者居上。



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



法则三:同辈元素定位方式不同时,动态定位居上。



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



法则四:非同辈元素,任意一者及其祖元素不具备动态布局时,html靠后者居上。



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



法则五:【重要】非同辈元素,任意一者或其祖元素拥有动态定位时,同时各自向上寻找动态定位的祖元素,并分别从中拿出具备最高级别的祖元素(或其本身)进行比较。

情况1:子元素的z-index无论多大,父元素大者居上。



情况2:父元素居下,子元素也可以居上。



情况1、情况2结合扩展比较。



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


其实前四点都是基础,只有第五点比较难于理解,这里详细解释一下:
  1. <div id="ab" style="position:absolute;">
  2.         <div id="a" style="position:relative; z-index:100;">
  3.                 <div id="a_inner1">
  4.                         <div id="a_inner2">
  5.                                 <div id="a_inner3" style="position:relative; z-index:98;">
  6.                                         <div id="a_inner4">
  7.                                                 <div id="a_inner5">
  8.                                                 </div>
  9.                                         </div>
  10.                                 </div>
  11.                         </div>
  12.                 </div>
  13.         </div>
  14.         <div id="b">
  15.                 <div id="b_inner1">
  16.                         <div id="b_inner2">
  17.                                 <div id="b_inner3" style="position:relative; z-index:99;">
  18.                                         <div id="b_inner4">
  19.                                         </div>
  20.                                 </div>
  21.                         </div>
  22.                 </div>
  23.         </div>
  24. </div>
复制代码


在这个例子中,我们来比较div#a_inner5和div#b_inner4的层叠关系。
到它们所共同拥有的祖元素div#ab的下一级为止,div#a_inner5的祖元素包括:div#a,div#a_inner1,div#a_inner2,div#a_inner3,div#a_inner4;div#b_inner4的祖元素包括:div#b,div#b_inner1,div#b_inner2,div#b_inner3。
然后分析它们的祖元素中具有动态定位的:div#a_inner5的祖元素中含有动态定位的元素有:div#a,div#a_inner3;div#b_inner4的祖元素中含有动态定位的元素有:div#b_inner3。
然后再拿出最高级进行比较:div#a > #div#b_inner3。

父元素居下,子元素也可以居上的情况,则是利用非同辈元素在祖元素具备动态布局时,其比较已经与position:static无关,而其祖元素却可以通过html的位置来进行比较。


当然,有时候还存在特例,比如flash、比如ie6中的select无法遮住,这些都属于异常情况,大家可以自己搜索一下相关文章。
-----------------------------------------------------------
要点补充:对ie6/7与其他主流浏览器的z-index默认值存在差异,在使用多重的动态定位时务必注意z-index的值。
详情请见ONEBOYS 在15楼的补充。


[ 本帖最后由 14px 于 2009-4-28 16:13 编辑 ]
已有 1 人评分威望 收起 理由
liuxinghonglei + 3 精品文章

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

西部数码顶级域名注册商39元抢注!

CSS魔术师

荣誉管理 手机认证 

帖子
2452
体力
5010
威望
4
发表于 2009-4-27 12:39:27 |显示全部楼层
好文是要顶的~~

定位元素的层叠关系确实是很难掌握的概念,谢谢楼主啦~~
■ 提问请贴图贴代码。  ● 我的微博  ● 我的博客 (已恢复)
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

帖子
135
体力
510
威望
0
发表于 2009-4-28 11:19:13 |显示全部楼层
那么,我想实现下面图片的效果,但是我有个特殊的需要就是parentDiv1需要是absolute,因为我需要他可以移动.请问楼主如何做到?您介绍的5中可能里面似乎不包括这种,而且拓展一下也不会有这种?
下面地址里面右下脚有一个圣诞老人,就是实现方式,但是只在ff和ie6中可以,ie7中就出现遮挡问题了.
http://www.sprbus.com/sprbus.jspx


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


[ 本帖最后由 phpxiaoxin 于 2009-4-28 13:48 编辑 ]

使用道具 举报

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-4-28 14:43:16 |显示全部楼层

回复 11# phpxiaoxin 的帖子

该种外观所利用的就是非同辈元素进行比较时position:static不受影响而形成的,所以一旦换成动态定位(position:aboslute|relative|fixed)就无法形成这样的外观了。

你把需求说得更详尽些,我们再一起想想办法吧?

------------------------------------
就现在的界面看来,我怎么觉得只是需要将圣诞老人的卡片的那个层居于整体页面之上就可以啦?

使用道具 举报

zj1118 

zj1118

中级会员

帖子
152
体力
646
威望
0
发表于 2009-4-28 15:01:35 |显示全部楼层
楼主总结得很全面,学习了。
对第五种情况理解得不是很好,如果不改变现有结构,下面这种不知能否实现:

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


[ 本帖最后由 zj1118 于 2009-4-28 15:08 编辑 ]

使用道具 举报

步舞之鹤

金牌会员 手机认证 

帖子
1859
体力
4403
威望
16
居住地
浙江省 杭州市
发表于 2009-4-28 15:48:56 |显示全部楼层
第5条规律的第三种情况

假如祖级都为定位元素(动态定位)。

会产生ie下和FF下不同的显示效果。——很多人掉入的就是这个坑。

这就涉及到了:动态定位元素下,z-index的缺省值于ie/FF下并不一致。
z-index在ie下缺省为:z-index:0; 而FF下则缺省为:z-index:auto;

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

使用道具 举报

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-4-28 16:32:49 |显示全部楼层

回复 14# zj1118 的帖子

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



你给了第二层的父体以postion:relative;那么二层的子体与三层的叠加位置就变成了二层的父体与div3进行比较了。

使用道具 举报

帖子
135
体力
510
威望
0
发表于 2009-4-28 16:47:58 |显示全部楼层

回复 13# 14px [楼主] 的帖子

感谢秋天,我要作的效果和下图一样。

只是需要parentDiv1可以移动,因此parentDiv1需要具备position:absolute属性。
您的教程很不错,我也明白您的意思,主要敲门在static上面。而我那个要放到底下的层又必须是absolute的因为需要通过js让其动起来。很头疼,都半年了。
看见你这个教程,狂喜了一下,一实验发现还是不行。

[ 本帖最后由 phpxiaoxin 于 2009-4-28 16:50 编辑 ]

使用道具 举报

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-4-28 17:27:39 |显示全部楼层
还是不是很能理解你的需求,根据你的效果在ie6和firefox中的效果,我写了个demo,看看是不是你需要的效果。这里没有用道以上层叠方式。

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

使用道具 举报

步舞之鹤

金牌会员 手机认证 

帖子
1859
体力
4403
威望
16
居住地
浙江省 杭州市
发表于 2009-4-28 18:14:19 |显示全部楼层

回复 14# zj1118 的帖子

其实我15楼说的就是你这种情况。

设置position:relative后,在ie下元素的z-index缺省值是0;
导致ie下二层及子层无法超越三层。

我想说的是,恐怕你要失望了。

可以参考《无法冲破的等级》系列文章,主要是那篇《补遗》。
还有我的一篇http://www.cssass.com/blog/index.php/2009/75.html

使用道具 举报

帖子
135
体力
510
威望
0
发表于 2009-4-29 08:40:06 |显示全部楼层
里面是我想实现的效果说明,请14px看一下

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


[ 本帖最后由 phpxiaoxin 于 2009-4-29 08:48 编辑 ]

使用道具 举报

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-4-29 10:53:41 |显示全部楼层
这就是15楼谈到的情况,IE6/IE7不支持z-index:auto,所以暂时没有好的方案。
你可以考虑将robot更换成static状态,然后拖曳时改变其margin值。
以下代码在非IE6/IE7下可以看看效果。

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

使用道具 举报

帖子
135
体力
510
威望
0
发表于 2009-4-29 11:28:20 |显示全部楼层

回复 26# 14px [楼主] 的帖子

13(=14)的方法我想到过。这样我内部的js脚本需要动一些手术。再看看吧,有没有什么z-index的解决方式。如果没有也只能先这样了。不过我很费解的是为什么是ff/ie6支持我的代码效果,ie7却出问题了呢?郁闷中...
谢谢13
之所以要作这个层叠关系,是因为在圣诞老人上面点右键选择“卷起”robot内部的div会缩小,而robot本身不能缩小,需要保持原来的宽高,又不能遮挡其后面内容的点击,因此需要把这个图层下移,而其内部图层在其他图层的上面。

[ 本帖最后由 phpxiaoxin 于 2009-4-29 11:55 编辑 ]

使用道具 举报

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-4-29 14:46:27 |显示全部楼层
很遗憾地告诉你,我也没什么办法了。
要让ie6/ie7支持z-index:auto才行,看看别人有什么好的办法没。
或者改改结构,你将你的robotBody和robot分离为同辈的关系...父体设置static,robot设置为absolute。而robotBody的位置不会受到robot的影响。
但我想这也不是你所想要的。

使用道具 举报

帖子
135
体力
510
威望
0
发表于 2009-4-29 17:45:14 |显示全部楼层
呵呵,13那的确不是我想要的。那个圣诞老人,通过yui让其可以动起来,包括展开,收缩、移动,移动的时候需要需要移动robot,只有这样可以让内部的元素一起移动并且相对位置不发生变化,如果分离,移动的时候js就需要计算每个div的位置并且重新定位,这样不太合理,也很麻烦。不过改成static计算margin是一个不错的想法,这样最多需要得到浏览器的显示区域的宽高,然后再经过计算得到margin的值就可以了。

13 有gtalk吧?我的是:phpxiaoxin@gmail.com 或者 http://twitter.com/phpxiaoxin

[ 本帖最后由 phpxiaoxin 于 2009-4-29 17:57 编辑 ]

使用道具 举报

梦的河流

中级会员

帖子
209
体力
875
威望
1
发表于 2009-5-5 12:13:02 |显示全部楼层
说来说去,头都晕了。。就把握一点,自身上面有父级的,而且父级有relative的。就各自拿父级的relative的z-index来比较,如果没有父级就拿自身的跟别人有父级的realive z-index值进行比较。最好是每个relative在想用到z-index的时候,都加一个值,避免ff auto or ie z-index:0默认为0的影响。
革命尚未成功

使用道具 举报

14px 楼主

秋末

荣誉管理

帖子
1616
体力
4211
威望
52
居住地
湖南省 长沙市
发表于 2009-5-5 16:42:31 |显示全部楼层
谢谢你的意见,措词、文章结构不到位之处请多多见谅。
^-^ 本意是打算写篇总结性的文章,所以尽量全面周到。
1. 你这里只提到了relative,absolute|fixed跟它是一类,也要说明一下。
2. 父级还有父级,相比较的,应是最高祖元素,而不是就近找一个拥有动态定位的父级。

使用道具 举报

雨中无伞

高级会员 手机认证 

帖子
229
体力
703
威望
0
发表于 2010-5-28 13:58:25 |显示全部楼层
法则三:同辈元素定位方式不同时,动态定位居上。

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


那为什么div1不在div2上呢?
楼主的观点错了吧。
应该:同辈元素定位方式不同时,依然按照xhtml的顺序排列

[ 本帖最后由 css8wusan 于 2010-5-28 14:01 编辑 ]
javascript小白

使用道具 举报

帖子
1
体力
7
威望
0
发表于 2010-6-10 22:46:38 |显示全部楼层
学习div的好教材,谢谢!

使用道具 举报

昂流

银牌会员 手机认证 

帖子
1109
体力
1818
威望
0
发表于 2010-6-23 13:48:03 |显示全部楼层
在做下来菜单的时候这类问题比较多
谢谢楼主的总结了

使用道具 举报

vodx 

看着你的眼睛

高级会员

帖子
119
体力
565
威望
0
居住地
广东省 广州市
发表于 2011-3-10 13:45:56 |显示全部楼层
好东西~留个记号!

使用道具 举报

高级会员 手机认证 

帖子
304
体力
664
威望
0
发表于 2011-3-11 14:09:11 |显示全部楼层
恩 真的学习了

使用道具 举报

天下皆白

高级会员 手机认证 

帖子
132
体力
603
威望
0
居住地
湖北省 武汉市
发表于 2011-3-11 17:38:26 |显示全部楼层
受教了。感谢楼主。

使用道具 举报

opal 
帖子
46
体力
120
威望
0
发表于 2011-3-12 22:44:50 |显示全部楼层
说得真详细。用的yui3,很少碰到兼容问题。

使用道具 举报

zoukai 
帖子
34
体力
105
威望
0
居住地
浙江省 嘉兴市
发表于 2011-3-13 20:16:31 |显示全部楼层
太精彩了

使用道具 举报

wfb927 

郑州前端开发

禁止发言
有效期至 2012-4-1

帖子
62
体力
32
威望
0
居住地
河南省 郑州市
发表于 2011-3-15 11:58:33 |显示全部楼层
住要是ie6和IE7,其它的浏览器都好办,只要把ie6 7解决了就可以了  ie6和ie7下z-index bug的解决办法
wufangbo.com

使用道具 举报

高级会员 手机认证 

帖子
304
体力
664
威望
0
发表于 2011-3-30 17:49:05 |显示全部楼层
收藏先!!!

使用道具 举报

帖子
6
体力
37
威望
0
发表于 2011-4-28 18:19:21 |显示全部楼层
受教了。感谢楼主。
珍惜生活

使用道具 举报

帖子
74
体力
870
威望
1
发表于 2011-4-28 21:36:08 |显示全部楼层

回复 18# css8wusan 的帖子

你那定位方式是相同的,楼主说的定位方式是静态和动态,你那relative和absolute都是动态方式。所以楼主是对的。

使用道具 举报

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

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

GMT+8, 2012-2-11 20:00 , Processed in 0.144600 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部