바삭한달고나 지식창고
article thumbnail
MDN(Mozilla Developer Network) 개발 네트워크의 문서를 참고하였음.

 

CSS를 공부하다 보면 '이런 디자인은 이렇게 하면 된다'는 답은 많지만 어떤 원리로 그렇게 화면에 표현되는지 설명되어 있지 않은 경우가 많았다.

z-index의 원리를 공부하며 레이어의 쌓임 맥락(stacking context)에 대해 정리해보았다.

잘못된 내용이 있다면 댓글 부탁드립니다. 🙋‍♀️


 

z-index가 사용되지 않은 환경

 

z-index가 사용되지 않은 환경에서 position의 순서는 다음과 같다. (from bottom to top)

    1. 루트요소의 배경, 테두리
      • 루트요소 : HTML문서 전체의 콘텐츠를 감싸는 <html>~</html>요소를 의미
    2. position이 미지정된(==static) 요소들이 html 구조에 등장한 순서대로 쌓임
      • position이 미지정된 요소는 z-index가 무엇이든 영향받지 않는다.
      • html의 stacking context를 따르게 되므로, 자식요소도(등장순서대로) 해당 요소의 앞에 위치하게 된다.
    3. position이 지정된 요소들이 html 구조에 등장한 순서대로 쌓임
        • 단, position이 지정되지 않아도 opacity < 1 인 요소는 독립적인 쌓음맥락(stacking context)을 생성한다.
        • 참고 : transparency ( 링크 )
        • 참고 : Stacking context example 1 ( 링크 )

Box1의 z-index:30; 이 Box2의 z-index:10; 보다 높기 때문에 Box1이 맨 위에 위치한다고 생각하기 쉽지만, z-index는 positioned 요소에서만 적용되는 속성이므로 아래의 요소는 HTML에서 등장하는 순서대로 쌓이게 된다.

 

See the Pen z-index_prac#1 by yuran (@rubberduck12345) on CodePen.

 


 

For the same reason, implementations must create a new stacking context for any element with opacity less than 1. If an element with opacity less than 1 is not positioned, then it is painted on the same layer, within its parent stacking context, as positioned elements with stack level 0. 

 

See the Pen without z-index by yuran (@rubberduck12345) on CodePen.

 

div-5번 등장 순서가 가장 마지막이더라도 position이 선언되지 않은 기본값은 static 이므로 position이 static이 아닌 요소 보다 아래에 위치(위의 2순위 해당)한다.

이는 z-index를 사용해 쌓임순서를 가장 위로 배치하여도 position이 static인 경우 가장 아래에 놓이는 이유이다. 이러한 맥락에서 position 속성이 static이 아닐 때만 z-index는 유효하다. 

※ 예시의 DIV-5가 opacity : 1; 인 이유는 opacity < 1 이면 독립적인 쌓음맥락(stacking context)을 생성하기 때문에 레이어가 가장 위로 올라오기 때문이다. 이 경우 설명하고자 했던 static의 특성을 표현할 수 없으므로 opacity를 수정하였다. 

 


 

z-index가 사용되는 환경

 

수직, 수평 외에도  z-축의 정수값으로 레이어의 쌓임 순서를 결정할 수 있다. 큰 정수일 수록 화면을 보는 사용자에게 가까운 것을 의미한다. 동일한 z-index 값을 가지는 요소는 'z-index가 사용되지 않는 환경'의 우선순위를 따른다.

  • 참고 : painting-order ( 링크 )

The bottom of the stack is the furthest from the user, the top of the stack is the nearest to the user:

            |      |         |    |
            |           |    |    |	⇦ ☻
            |           |         |	user
z-index:  canvas  -1	0    1	  2

 

아래와 같이 요소가 있을 때

  1. 루트요소(<html>)
    1. DIV #1 (z-index :3)
    2. DIV #2 (z-index :5)
      1. DIV #3 (z-index :2)
      2. DIV #4 (z-index :6)
      3. DIV #5 (z-index :10)
    3. DIV #6 (z-index :9)

 

실질적인 순서는 아래와 같다. 자식 요소의 z-index 값은 부모 요소에게만 의미가 있다.

  1. 루트요소(<html>)
    1. DIV #1 (z-index :3)
    2. DIV #2 (z-index :5)
      1. DIV #3 (z-index :5.1)
      2. DIV #4 (z-index :5.2)
      3. DIV #5 (z-index :5.3)
    3. DIV #6 (z-index :9)

 

See the Pen z-index by yuran (@rubberduck12345) on CodePen.

 


 

profile

바삭한달고나 지식창고

@바삭한달고나

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!