使用z-index叠加DIV

3
我正在尝试叠加一个div覆盖整个页面,以显示弹出窗口。问题是它不会完全覆盖整个页面。以下是代码的近似版本:
<div style="z-index:902;">
    <div style="position: fixed; width: 100%; height: 100%; left: 0; top: 0;">
        Overlay
    </div>
    Contents of container 1
</div>
<div style="z-index:902;">
    Contents of container 2
</div>
<div style="z-index:902;">
    Contents of container 3
</div>
覆盖层div出现在容器1的上方,但容器2和3的内容出现在覆盖层的上方。
由于我正在使用CMS(如果有帮助的话是DotNetNuke),所以无法将我的覆盖层div移动到容器1之外。
我已经尝试将覆盖层的z-index设置得比容器高,但仍然没有效果。
有人能帮忙吗?

1
你必须使用 div 来制作弹出窗口吗?还是可以使用类似模态窗口的东西? - SomeKittens
我认为你在这个问题中没有包含足够的信息。上面的代码可以工作,除非其他的div元素被“定位”了。如果它们被定位了,那么它们需要吗?如果需要,那么你需要将包含“遮罩”div的div的z-index设置得比其他div更高-即z-index: 903。 - My Head Hurts
@SomeKittens 有时候最好的答案是尝试不同的方法 - 我已经摆脱了覆盖层,并决定在一个简单的 HTML 页面中打开内容。 - colincameron
@MyHeadHurts 我确实尝试将覆盖层的 z-index 设置得更高,但事实证明有一些执行 JavaScript 的代码会更改其他容器的 z-index。 - colincameron
@c.cam108 - 你需要设置z-index的不是'overlay',而是'overlay'的父级div。如果你给父级div一个id,并添加属性z-index: 903!important,那么这个问题就会得到解决。从纯客观的角度来看,如果你指的是第一部分,那么被接受的答案永远不会起作用。 - My Head Hurts
@MyHeadHurts,不幸的是我无法访问那个div以进行编辑,因为它没有设置id,只有class - 我受限于使用CMS所能实现的功能。 - colincameron
6个回答

8

工作中的 Fiddle 示例!

如果您将此问题的范围限制在您提供的代码上,那么它就可以正常工作!例如,在 Fiddle 上,您可以看到我为 position:fixeddiv 设置了背景颜色,以说明该解决方案正在工作。

但是,如果您使用了 z-index,则可以安全地假设具有 z-index 的元素已经应用了某些 position

考虑到这一点,下面是这部分内容:

<div style="z-index:902;">
    <div style="position: fixed; width: 100%; height: 100%; left: 0; top: 0;">
        Overlay
    </div>
    Contents of container 1
</div>

无法作为“整个页面”叠加层,因为具有position:fixed的内部div位于具有其他堆叠元素(兄弟姐妹)的堆栈元素内,处于相同的堆栈位置上,并且具有z-index:902;
请参见此演示! 如果将兄弟元素移动到较低的堆栈位置,则可以使其正常工作。请参见此演示示例!

编辑

根据My Head Hurts的建议(请参见评论),本答案的第一部分已进行了编辑,以更好地解释第一个Fiddle之所以有效是因为OP留下了猜测的空间!两个解决方案的内容没有做出任何更改并被认可。


解决方案

是将叠加层放置在所有其他div之外,但这取决于您的目标:
<div style="z-index:902;">
    Contents of container 1
</div>
<div style="z-index:902;">
    Contents of container 2
</div>
<div style="z-index:902;">
    Contents of container 3
</div>
<div style="position:fixed; z-index:10000; left:0; top:0; right:0; bottom:0; background:#ccc;">
    Overlay
</div>

请看这个Fiddle示例!

已编辑

因为这个评论:

是的,这将是理想的答案,我会接受它作为回答我的问题,但我遇到的问题来自一些JavaScript,它动态更改了其他容器的z-index,我无法控制,从而使得不可能将我的div放在所有容器的顶部。

假设您可以container 1中放置任何您希望的内容,并假设您正在使用或可以使用jQuery,则可以执行以下操作以解决问题:

<div style="z-index:902;">
  <div class="placeOutside" style="position:fixed; z-index:903; right:0; bottom:0; left:0; top:0; background:#ccc;">
        Overlay
  </div>
  <script type="text/javascript">
    jQuery(document).ready(function($) {
        $('.placeOutside').appendTo('body');
    });
  </script>
  Contents of container 1
</div>
<div style="z-index:902;">
  Contents of container 2
</div>
<div style="z-index:902;">
  Contents of container 3
</div>

查看这个可工作的Fiddle示例!

是的,这将是理想的答案,我会接受它作为我的问题的答案,但我面临的问题来自一些动态更改其他容器的 z-index 的 Javascript,我无法控制,这使得不可能将我的 div 放在它们所有的顶部。 - colincameron
假设 @c.cam108 正在使用 positioned 元素,那么你回答的第一部分是不正确的,也不会起作用:http://jsfiddle.net/H5NB8/3/。然而,第二个选项是可行的,但是 @c.cam108 已经声明他不能这样做。 - My Head Hurts
@我的头疼了,就像_c.cam108_所说的那样,第一个解决方案已经解决了他的问题!但是你的警报确实让我想到了第二个解决方案! :) 我编辑了我的答案,加入了第三个选项,使用了一些Jquery! - Zuul
@Zuul 那个第二个解决方案完美地解决了问题!非常感谢。 - colincameron
@Zuul - 我理解你的意思,但是按照他描述的问题,其实并没有问题。在这些div中,没有任何一个z-index值被应用,因此无论是否有z-indexposition: fixed元素都会被绘制在顶部。因此,我认为你应该用这个解释来替换你的第一个解决方案,并将你的另外两个可行解决方案作为建议的解决方法。 - My Head Hurts
1
我的头痛了,完成了!很高兴看到一个stackoverflow用户激励我保持连贯性!非常感谢! - Zuul

5

z-index 只适用于 已定位元素(例如,position:absolute;position:relative;position:fixed;)。

如果一个元素的position属性具有除static以外的值,则称该元素为已定位元素

~ CSS 2.1规范的可视化格式模型


请参考此示例,了解有关z-indexposition:fixed的相关信息:http://www.fiveminuteargument.com/fixed-position-z-index。 - Zuul

0
如果我混合使用相对定位、绝对定位和z-index属性,这将毫无意义:
<div style=" Position: fixed ;  z-index:902; width:100%; heigth:100%;background:#F00;">
    Contents of container 2
</div>
<div style="z-index:1; position:relative">
    <div style=" z-index:903; Position: fixed ; left: 0; top: 0;background:#ccc;">
        Overlay
    </div>
</div>

http://jsfiddle.net/vLp0am43/


0

你已经为覆盖层设置了100%的宽度和高度,由于它是容器1的直接后代,其宽度将被计算为容器1的宽度和高度的100%,这就解释了你的问题。

至于解决方案,你可能应该在JavaScript中将覆盖层的宽度和高度设置为浏览器窗口大小的绝对像素值,然后再显示它。


0

这段代码在火狐浏览器中对我有效:

<div style="z-index:1;">
    <div style="position: fixed; width: 100%; height: 100%; left: 0; top: 0; z-index:901;">
        Overlay
    </div>
    Contents of container 1
</div>
<div style="z-index:1;">
    Contents of container 2
</div>
<div style="z-index:1;">
    Contents of container 3
</div>

所以试试它,看看是否适合你。


0
这是我的解决方案... 想象一下有两个兄弟元素。#in-front 需要在 #behind 上方层叠显示。
<div id="behind"></div>
<div id="in-front"></div>

不要让它们成为兄弟元素,将第一个 div 包裹在一个容器内,并将其定位设置为固定。

<div id="wrapper" style="position:fixed; width:100%; top:0; left:0;">
    <div id="behind"></div>
</div>
<div id="in-front"></div>

#behind div现在可以自由定位或居中。请查看jsfiddle的示例。请注意它们如何一起工作,没有负边距!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接