【问题标题】:Hiding div behind its parent? [duplicate]将 div 隐藏在其父级后面? [复制]
【发布时间】:2012-04-19 07:09:36
【问题描述】:
<div class="content-wrapper">
    <div class="popup">
        <div class="close">
        </div>
    </div>
</div>

.content-wrapper 是相对定位的,包含了所有的页面内容(不仅仅是弹窗)。

.popup 是绝对定位的。

.close 也是绝对定位的。

当光标进入弹出窗口时,我有一些 javascript 可以关闭(所以我有一个很好的关闭栏出现在侧面)。我发现做到这一点的最好方法就是使用 jQuery animate 移动。即使 .stop() 无法解决,隐藏/显示也会产生口吃效果。我的问题是试图将 .close 隐藏在 .popup 后面。无论我为两个 div 设置什么 z-index .close 都不会位于 .popup 后面。

是否可以在另一个绝对定位的 div 中将一个绝对定位的 div 放在其父级的后面,如果可以,如何实现?

【问题讨论】:

  • 可以选择更改标记吗?
  • 可能,弹出窗口在屏幕上移动(因此它是绝对定位的),所以在弹出窗口内关闭是我能想到的唯一解决方案。如果更好的标记会起作用,那么我愿意尝试。

标签: css css-position css-transitions


【解决方案1】:

是的,使用 z-index:http://jsfiddle.net/tGd4Q/

HTML:

<div class="content-wrapper">
    <div class="popup">
        <div class="close">
        </div>
    </div>
</div>​

CSS:

.popup, .close { position: absolute; height: 200px; width: 200px; }
.popup { background: #f00; }
.close { background: #ff0; top: 25px; left: 25px; z-index: -1; }​

但这不适用于 IE7 标准。我建议使用 jQuery(或您选择的其他框架)来隐藏 div:

$('.popup .close').hide();

【讨论】:

  • 我看到它在 jsfiddle 中工作,但在我的代码中不起作用。
  • 它有效,但前提是您将 .close 设置为 -1 并且 .popup 根本没有设置。任何其他组合,它都没有,很奇怪。不过对我有用,谢谢。
【解决方案2】:

堆叠索引大部分时间是相对于兄弟姐妹而言的,因此您不能使用 z-index 将孩子放在其父母之后。

Here 提供更多相关信息。

这是堆叠顺序:

  1. 当前堆叠上下文的边框和背景
  2. 具有负 z-index 的定位后代
  3. 未定义 z-index 属性的非定位块级后代——段落、表格、列表等
  4. 浮动后代及其内容
  5. 非定位内嵌内容
  6. 没有 z-index、z-index: auto 或 z-index: 0 的定位后代
  7. z-index 大于 0 的定位后代

Nick McCormack 在他的回答中使用了z-index: -1。这确实是您的感受的一个例外。请注意z-index: -1 将您的许多元素后面的元素移至背景。

浏览器差异

除此之外,Internet Explorer 不支持负堆叠索引,并且对元素(子/父)位置非常严格。每个元素级别都有自己的堆叠上下文,因此必须通过父元素“通信”。见this explanation

根据Smashing Magazineselect元素是一个窗口控件,自然有更高的堆叠索引。

根据ShadowboxtroubleElement选项,我推测objectembedcanvas有同样的问题。


如果你想隐藏.close,为什么不把它真正隐藏起来,而不是将它移到.popup后面呢?

$('.close').hide();

【讨论】:

  • -1 在不同浏览器上的作用如何?你知道吗?
  • 当我尝试使用 .show 和 .hide 时,对象的 css 定位搞砸了。它会像发疯一样结结巴巴,然后一直向左移动 0。
  • -1 适用于除 IE7 之外的所有应用程序,但不是解决此困境的好方法。不幸的是,“正确”的解决方案不是 CSS 解决方案,但遗憾的是,这是问题所在。
  • @Styphon:显示和隐藏什么对象?如果你的.close 是绝对定位的,这不应该影响.popup 中其他元素的位置。确保你总是放弃一个水平和垂直位置给绝对定位的元素,否则 IE 会混淆。
  • @Clarence Klopfstein:我用其他浏览器的一些信息更新了我的答案。
【解决方案3】:

不,你不能把它放在它的父级后面。但是,您可以将其显示模式更改为无,因此根本看不到它。然后当你需要查看 div 时,将其更改为显示。

简单的 jQuery:

$('.close').hide();
$('.close').show();

还有其他方法,例如添加样式属性,以display:nonedisplay: inline-block 作为设置。

更新:根据 cmets 在其他答案中的说法,有一种方法可以使用 z-index。仍然认为隐藏/显示是要走的路。非常清楚你在 UI 上做了什么。

【讨论】:

  • 只需使用 .hide 和 .show 即可创建弹跳效果。如果我然后使用 .stop() 停止弹跳,它根本不会显示。
  • 请添加更多示例 HTML,因为这个示例很难看到任何弹跳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2021-06-11
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多