164

我已经隔离了一个 IE7 错误的小测试用例z-index,但不知道如何修复它。z-index我整天都在玩。

z-indexIE7有什么问题?

测试 CSS:

input {
    border: 1px solid #000;
}

div {
    border: 1px solid #00f;
}

ul {
    border: 1px solid #f00;
    background-color: #f00;
    list-style-type: none;
    margin: 0;
    padding-left: 0;
    z-index: 1000;
}

li {
    color: #fff;
    list-style-type: none;
    padding-left: 0;
    margin-left: 0;
}

span.envelope {
    position: relative;
}

span.envelope ul {
    position: absolute;
    top: 20px;
    left: 0;
    width: 150px;
}

测试 HTML:

<form>
  <label>Input #1:</label>
  <span id="envelope-1" class="envelope">
    <input name="my-input-1" id="my-input-1" />
      <ul>
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
      </ul>
  </span>
  <br><br>
  <label>Input #2:</label>
  <span id="envelope-2" class="envelope">
    <input name="my-input-2" id="my-input-2" />
  </span>
</form>
4

11 回答 11

269

Z-index 不是绝对测量值。z-index: 1000 的元素可能在 z-index: 1 的元素后面- 只要相应的元素属于不同的堆叠上下文

当您指定 z-index 时,您是在相对于同一堆叠上下文中的其他元素指定它,尽管CSS 规范关于 Z-index 的段落说新的堆叠上下文仅针对具有 z-index 以外的定位内容创建auto(意味着您的整个文档应该是单个堆叠上下文),您确​​实构造了一个定位跨度:不幸的是,IE7 将没有 z-index 的定位内容解释为新的堆叠上下文。

简而言之,尝试添加这个 CSS:

#envelope-1 {position:relative; z-index:1;}

或重新设计文档,使您的跨度不再具有 position:relative :

<html>
<head>
    <title>Z-Index IE7 Test</title>
    <style type="text/css">
        ul {
            background-color: #f00; 
            z-index: 1000;
            position: absolute;
            width: 150px;
        }
    </style>
</head>
<body>
    <div>
        <label>Input #1:</label> <input><br>
        <ul><li>item<li>item<li>item<li>item</ul>
    </div>

    <div>
        <label>Input #2:</label> <input>
    </div>
</body>
</html>

有关此错误的类似示例,请参见http://www.brenelz.com/blog/2009/02/03/squish-the-internet-explorer-z-index-bug/。为父元素(在您的示例中为信封 1)提供更高 z-index 的原因是因为信封 1 的所有子元素(包括菜单)将与信封 1 的所有兄弟姐妹(特别是信封 2)重叠。

尽管 z-index 可以让您明确定义事物的重叠方式,但即使没有 z-index,分层顺序也可以很好地定义。最后,IE6 有一个额外的错误会导致选择框和 iframe 浮动在其他所有内容之上。

于 2009-08-17T12:28:52.207 回答
15

http://www.vancelucas.com/blog/fixing-ie7-z-index-issues-with-jquery/

$(function() {
var zIndexNumber = 1000;
$('div').each(function() {
    $(this).css('zIndex', zIndexNumber);
    zIndexNumber -= 10;
});
});
于 2011-09-08T18:11:13.873 回答
11

在 IE 中定位的元素会生成一个新的堆叠上下文,从 z-index 值 0 开始。因此 z-index 不能正常工作。

尝试给父元素一个更高的 z-index 值(甚至可以高于子元素本身的 z-index 值)来修复错误。

于 2011-11-03T13:27:14.187 回答
4

我遇到了这个问题,但是在一个大型项目中,必须请求 HTML 更改并成为一个整体问题,所以我正在寻找一个纯 css 解决方案。

通过将position:relative; z-index:-1我的标题下拉内容放在我的主体内容上,我的标题下拉内容突然显示在 ie7 的正文内容上方(它已经在所有其他浏览器和 ie8+ 中毫无问题地显示)

问题是这禁用了元素中所有内容的所有悬停和单击操作,z-index:-1所以我去了整个页面的父元素并给了它一个position:relative; z-index:1

这解决了问题并保留了正确的分层功能。

感觉有点hacky,但按要求工作。

于 2013-02-22T00:48:59.077 回答
3

我发现我必须在 ie7 特定样式表中的 div 上放置一个特殊的 z-index 名称:

div { z-index:10; }

对于不相关的 div 的 z-index,例如导航,显示在滑块上方。我不能简单地将 z-index 添加到滑块 div 本身。

于 2010-11-30T10:08:39.467 回答
2

如果前面提到的父节点中更高的 z 索引不适合您的需求,您可以创建替代解决方案并将其定位到有问题的浏览器,或者通过 IE 条件注释或使用 Modernizr 提供的(更理想化的)特征检测。

Modernizr 的快速(并且明显有效)测试:

Modernizr.addTest('compliantzindex', function(){
    var test  = document.createElement('div'),
        fake = false,
        root = document.body || (function () {
            fake = true;
            return document.documentElement.appendChild(document.createElement('body'));
        }());

    root.appendChild(test);
    test.style.position = 'relative';
    var ret = (test.style.zIndex !== 0);
    root.removeChild(test);

    if (fake) {
        document.documentElement.removeChild(root);
    }

    return ret;
});
于 2011-12-14T12:57:25.360 回答
1

它看起来不是一个 ie 错误,只是为了对 css 标准的不同理解。如果外部容器未指定 z-index,但内部元素指定了更高的 z-index。所以容器的兄弟可能会覆盖高 z-index 元素。即使这样,它也只出现在IE7,但IE6,IE8和Firefox是可以的。

于 2011-01-11T03:33:14.043 回答
0

一般来说,在 IE6 中,某些 UI 元素是使用本机控件实现的。这些控件在完全独立的阶段(窗口?)呈现,并且始终出现在任何其他控件之上,而与 z-index 无关。选择框是另一个这样有问题的控件。

解决此问题的唯一方法是构建 IE 呈现为单独“窗口”的内容 - 即您可以将选择框放在文本框上,或者更有用的是 iframe。

简而言之,您需要将诸如菜单之类的“悬停”放置在 iframe 中,以便让 IE 将这些置于内置 UI 控件之上。

这应该已在 IE7 中修复(请参阅http://blogs.msdn.com/ie/archive/2006/01/17/514076.aspx),但也许您正在以某种兼容模式运行?

于 2009-08-17T12:02:52.843 回答
0

与标准的独立堆叠上下文 IE 错误相比,此错误似乎是一个单独的问题。我在多个堆叠输入(基本上是每行都有一个自动完成器的表)中遇到了类似的问题。我发现的唯一解决方案是给每个单元格一个递减的 z-index 值。

于 2010-04-20T03:38:56.873 回答
0

如果您想创建下拉菜单并遇到 z-index 问题,您可以通过创建相同值的 z-index(例如 z-index:999;)来解决它。只需将 z-index 放在父子 div 和这将解决问题。我解决了这个问题。如果我放置不同的 z 索引,当然,它会在我的父 div 上显示我的子 div,但是,一旦我想将鼠标从菜单选项卡移动到子菜单 div(下拉列表),它就会消失......然后我放了相同值的z-indexes并解决了问题..

于 2013-10-22T09:51:45.820 回答
0

我通过使用 IE7 的开发人员工具(它的工具栏)并在 div 的容器中添加一个负 z-index 来解决它,该容器将低于另一个 div。

于 2015-04-20T15:28:57.193 回答