IE7 Z 인덱스 계층화 문제


163

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>

해결 방법을 찾고 있고 모든 HTML을 일부 스택 컨텍스트로 멋지게 재 배열하지 않으면 다음을 시도하십시오. brenelz.com/blog/squish-the-internet-explorer-z-index-bug
— Nasaralla

답변:


268

Z- 색인은 절대 측정이 아닙니다. 각 요소가 서로 다른 스태킹 컨텍스트에 속하는 한 z-index : 1000을 가진 요소가 z-index : 1을 가진 요소 뒤에있을 수 있습니다 .

z- 색인을 지정하면 동일한 스태킹 컨텍스트에서 다른 요소와 관련하여 지정합니다 . Z- 색인의 CSS 사양 단락에 새 스태킹 컨텍스트가 아닌 z- 색인이있는 위치 지정된 컨텐츠에 대해서만 새 스태킹 컨텍스트가 작성되었다고 표시됩니다. 자동차 , 당신은 (전체 문서를 의미 하나의 스택 문맥해야한다) 한 불행하게도 IE7 해석 위치 내용을 Z- 인덱스없이이 같은 새로운 스택 문맥을 : 위치 지정 범위를 구성.

간단히 말해서이 CSS를 추가해보십시오.

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

또는 범위가 더 이상 위치 : 상대를 갖지 않도록 문서를 다시 디자인하십시오.

<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- 색인이 더 높은 작업을하는 이유는 봉투 -1의 모든 하위 (메뉴 포함)가 봉투 -1의 모든 형제 (특히 봉투 -2)와 겹치기 때문입니다.

z- 인덱스를 사용하면 항목이 겹치는 방식을 명시 적으로 정의 할 수 있지만 z- 인덱스 없이도 레이어 순서가 잘 정의되어 있습니다. 마지막으로, IE6에는 선택 상자와 iframe이 다른 모든 것 위에 떠 다니는 추가 버그가 있습니다.


4
마지막으로 해결 :)-상대 위치가 정말 짜증나서 어떻게 든 '봉투'요소없이 아이디어를 채택했습니다. 문제를 해결하고 작동하는 것 같습니다-제안 상자의 코드를 조금 다시 디자인해야합니다-thx a 많은
— rezna

6
요소가 서로 겹치는 방식에 영향을주는 세 가지 다른 요소가 있습니다 : 스택 컨텍스트, 소스 순서 및 페인팅 순서. 스태킹 컨텍스트를 처리 할 때 가장 분명한 문제가 발생 합니다. 다른 두 가지를 알면 좀 더 난해한 문제를 파악하는 데 도움이됩니다. 출처 : CSS-Discuss Wiki.
— rjb

2
부모 요소에 z- 색인을 추가하는 것은 훌륭한 해결책입니다
— Danyun Liu

2
사랑해. 부모에게 position : relative 및 z-index : 500을 추가하고 수정했습니다!
— Aymeric Gaurat-Apelli

2
해결책을 보여주는 의견 으로이 문제를 해결했습니다. jsfiddle.net/fNcGu/3
— Christopher Johnson

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;
});
});

위의 "올바른"솔루션을 읽은 후에는 문제의 사소한 문제보다 상당히 복잡한 문제에 대한 솔루션을 공식화하려고했습니다. 그런 다음이 대답을 던졌고 매력처럼 작동했습니다. 위의 해결책이 올바른 것이라면 이것은 쉬운 일입니다. 감사!
— 랜던

11

IE에서 위치가 지정된 요소는 z- 색인 값 0으로 시작하여 새로운 스태킹 컨텍스트를 생성합니다. 따라서 z- 색인이 제대로 작동하지 않습니다.

버그를 수정하려면 부모 요소에 더 높은 z- 색인 값 (자식의 z- 색인 값 자체보다 더 높을 수 있음)을 제공하십시오.


1
감사. 이 솔루션은 부모 컨테이너의 z- 인덱스를 제공하여 자식의 z- 인덱스보다 높을 필요는 없습니다.
— neelmeg

4

이 문제가 발생했지만 HTML 변경을 요청하고 전체 문제가 된 대규모 프로젝트에서 순수한 CSS 솔루션을 찾고있었습니다.

position:relative; z-index:-1내 본문 내용 을 배치 하면 ie7의 헤더 내용이 갑자기 본문 내용 위에 표시됩니다 (이미 다른 모든 브라우저와 ie8 +에서 문제없이 이미 표시되었습니다)

그 문제는 요소의 모든 콘텐츠에 대한 모든 호버 및 클릭 작업을 비활성화 z-index:-1했기 때문에 전체 페이지의 부모 요소로 이동하여position:relative; z-index:1

문제를 해결하고 올바른 레이어 기능을 유지했습니다.

약간 해키 느낌이지만 필요에 따라 작동했습니다.


3

ie7 전용 styelsheet의 div에 특수 z- 인덱스를 지정해야한다는 것을 알았습니다.

div {z- 색인 : 10; }

탐색 창과 같이 관련되지 않은 div의 z- 색인의 경우 슬라이더 위에 표시됩니다. 슬라이더 div 자체에 z- 색인을 추가 할 수 없었습니다.


나는 이것이 html {z-index:1; position:relative;}메뉴가 IE의 회전 목마 이미지를 넘어갈 수 있음을 발견했습니다 .
— bassplayer7

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;
});

아주 좋아요! 피처 감지는 확실히 갈 길입니다.
— Jason

1

CSS 표준에 대한 다른 이해를 위해 버그가 아닌 것처럼 보입니다. 외부 컨테이너가 z- 색인을 지정하지 않은 경우 내부 요소가 더 높은 z- 색인을 지정했습니다. 따라서 컨테이너의 형제는 높은 z- 인덱스 요소를 오버레이 할 수 있습니다. 그런 경우에도 IE7에서만 발생하지만 IE6, IE8 및 Firefox는 정상입니다.


0

일반적으로 IE6에서 특정 UI 요소는 기본 컨트롤로 구현됩니다. 이러한 컨트롤은 완전히 별도의 단계 (창?)로 렌더링되며 z- 색인에 관계없이 항상 다른 컨트롤 위에 나타납니다. 선택 상자는 또 다른 문제가되는 컨트롤입니다.

이 문제를 해결하는 유일한 방법은 IE가 별도의 "창"으로 렌더링하는 콘텐츠를 구성하는 것입니다. 즉, 텍스트 상자 또는보다 유용하게는 iframe 위에 선택 상자를 배치 할 수 있습니다.

요컨대, IE가 내장 UI 컨트롤 위에 이러한 메뉴를 배치 할 수 있도록하려면 메뉴와 같은 "호버"를 iframe에 배치해야합니다.

이것은 IE7에서 수정 되었지만 ( http://blogs.msdn.com/ie/archive/2006/01/17/514076.aspx 참조 ) 어떤 종류의 호환성 모드에서 실행 중입니까?


IE6 z-index 버그에 대해 알고 있습니다.이 문제는 해결되었지만 IE7에서 상대적 / 절대적으로 요소 / 입력 위치 (IE8에서 수정 됨)와 관련된 또 다른 문제가 있습니다. 그들 중 누구도 일하지 않았습니다. 그래서 내가 묻는 이유는 ... 어쨌든 thx는 답을 구했습니다.
— rezna

0

이 버그는 표준 개별 스태킹 컨텍스트 IE 버그와는 별개의 문제인 것 같습니다. 여러 누적 입력 (본질적으로 각 행에 자동 완성 기능이있는 테이블)과 비슷한 문제가있었습니다. 내가 찾은 유일한 해결책은 각 셀에 z-index 값을 낮추는 것입니다.


0

드롭 다운 메뉴를 만들고 z- 인덱스에 문제가있는 경우 동일한 값의 z- 인덱스 (예 : z-index : 999;)를 만들어 해결할 수 있습니다. z- 인덱스를 부모 및 자식 div에 넣고 문제를 해결할 것입니다. 나는 그 문제를 해결한다. 다른 z- 인덱스를 넣으면 부모 div 위에 자식 div가 표시되지만 메뉴 탭에서 하위 메뉴 div (드롭 다운 목록)로 마우스를 이동하면 사라집니다 ... 동일한 값의 z- 색인을 넣고 문제를 해결합니다.


0

IE7 (도구 모음) 용 개발자 도구를 사용하고 음수 z-index를 div의 컨테이너에 추가하여 다른 div 아래에 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.