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.