ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • z-index: 9999로도 해결이 안되는 이유
    코드잇 2023. 12. 3. 14:09

    z-index가 내맘대로 안될 때

     

    먼저 z-index를 사용하기 위해선

    position 속성을 부여해줘야 한다. (static 제외)

    .red {
      position: relative;
      z-index: 1;
    }

     

     

     

    z-index: 9999로도 해결이 안 되는 이유

    <div class="red">
      <div class="green"></div>
    </div>
    <div class="blue"></div>

     

    .red {
      background-color: red;
      position: absolute;
      width: 100px;
      height: 100px;
      top: 0px;
      left: 0px;
      z-index: 1;
    }
    
    .green {
      background-color: green;
      position: absolute;
      width: 50px;
      height: 50px;
      top: 25px;
      left: 25px;
      z-index: 3;
    }
    
    .blue {
      background-color: blue;
      position: absolute;
      width: 100px;
      height: 100px;
      top: 10px;
      left: 10px;
      z-index: 2;
    }

     

    z-index만 봤을 때는 green, blue, red 순으로 배치 될 것 같다.

     

     

     

     

     

     

    하지만 실행 결과에서는 blue가 가장 앞에 배치된다. green의 z-index가 9999 값을 가지더라도 마찬가지다.

    이렇게 된 이유는, z-index는 값만 비교하는게 아니라 쌓임 맥락(Stacking Context) 안에서 비교하기 때문이다.

     

     

     

     

    쌓임 맥락

    z-index를 묶어서 생각하는 범위라고 할 수 있다. 예를 들어 위 코드의 계층 구조는 다음과 같다.

     

     

     

    .red의 자식에 .green이 있기 때문에 쌓임 맥락이 만들어진다.

     

     

     

    쌓임 맥락으로 .red 밑에 자식들은 모두 z-index: 1로 묶어서 볼 수 있다. 그래서 항상 .blue 뒤쪽에 배치된다.

     

     

    위에 코드를 해결하려면 해당 요소의 쌓임 맥락을 바깥으로 꺼내면 된다.

    <div class="red"></div>
    <div class="green"></div>
    <div class="blue"></div>

     

     

    쌓임 맥락은 사실 조건이 굉장히 복잡하다. 조건을 모두 외우기 보다는 실용적으로 접근하자.

    조건들은 MDN에서 가져왔다. 

    https://developer.mozilla.org/ko/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context

    • 문서의 루트 요소. (<html>)
    • position 이 absolute 또는 relative이고, [z-index]가 auto가 아닌 요소.
    • position 이 fixed 또는 sticky인 요소.
    • opacity 가 1보다 작은 요소.

     

     

    z-index 값이 너무 많아지고 복잡해질 때

    상위 요소들의 쌓임 맥락을 적절하게 만들어 주면 된다. 밑에 코드처럼 상위 요소들에 쌓임 맥락을 미리 만들어 주면 기존 배치들을 바꾸지 않아도 된다.

    <main> 태그에 쌓임 맥락을 만들어 놓으면 <header> 태그는 무슨 일이 있어도 <main> 태그 안에 있는 것들 보다 앞쪽에 보이게 될 것이다.

    <header>
      ...내비게이션 
    </header> 
    <main>
      ...본문 내용 
    </main>
    header {
      position: sticky;
      top: 0;
      z-index: 1;
    }
    
    main {
      position: relative;
      z-index: 0;
    }

     

     

     

    '코드잇' 카테고리의 다른 글

    git에서 branch merge, git flow  (0) 2023.12.08
    git 커맨드  (0) 2023.12.05
    position - CSS  (0) 2023.11.26
    CSS Cascading (우선순위)  (0) 2023.11.26
    마진 상쇄 - CSS  (0) 2023.11.22

    댓글

Designed by Tistory.