안녕하세요! 프론트엔드 강사입니다.
오늘은 CSS로 레이아웃을 잡을 때 빠질 수 없는 단골 손님, 바로 z-index에 대해 MDN 공식 문서를 통해 배워보겠습니다. 팝업창을 띄우거나 내비게이션 바를 화면 맨 위에 고정할 때 "어? 왜 내 요소가 다른 박스 밑으로 숨어버리지?" 하고 당황하셨던 경험, 다들 한 번쯤 있으실 텐데요. 오늘 이 문서를 통해 그 궁금증을 완벽하게 해결해 드릴게요! 제가 실무에서 겪었던 꿀팁들도 중간중간 팍팍 넣어드릴 테니 잘 따라와 주세요!
이 가이드의 첫 번째 문서인 z-index 속성 없이 쌓기 (Stacking without the z-index property)에서는 기본적으로 요소들이 어떻게 쌓이는지 설명했습니다. 만약 이 기본 쌓임 순서를 내 마음대로(custom) 바꾸고 싶다면, 위치가 지정된(positioned) 요소에 z-index 속성을 사용하면 됩니다.
z-index 속성은 정수 값(양수, 0, 또는 음수)으로 지정할 수 있으며, 이 값은 가상의 Z축(z-axis)을 따라 요소가 위치할 곳을 나타냅니다. 'Z축'이라는 용어가 익숙하지 않다면, 웹 페이지를 여러 장의 투명한 필름(레이어)이 번호표를 달고 겹쳐져 있는 스택이라고 상상해 보세요. 레이어는 숫자가 작은 것부터 큰 순서대로 렌더링되며, 숫자가 큰 레이어가 숫자가 작은 레이어 위로 덮이게 됩니다 (아래 표에서 X는 임의의 양의 정수를 나타냅니다):
| 레이어 (Layer) | 설명 (Description) |
|---|---|
| 가장 아래 레이어 (Bottom layer) | 관찰자(사용자)로부터 가장 멀리 떨어져 있습니다. |
| 레이어 -X (Layer -X) | 음수 z-index 값을 가진 레이어들입니다. |
| 레이어 0 (Layer 0) | 기본 렌더링 레이어입니다. |
| 레이어 X (Layer X) | 양수 z-index 값을 가진 레이어들입니다. |
| 가장 위 레이어 (Top layer) | 관찰자(사용자)와 가장 가깝습니다. 화면의 제일 앞쪽으로 튀어나옵니다. |
👨🏫 강사님의 꿀팁 & 보충설명:
여기서 정말, 정말 중요한 포인트가 하나 있습니다! 첫 문단에서 "위치가 지정된(positioned) 요소에 사용하면 됩니다"라고 했죠? 초보자분들이 가장 많이 하는 실수가 바로position속성을 주지 않은 일반 요소(기본값인position: static)에z-index: 9999;를 주고 "왜 안 위로 안 올라오지?" 하고 고민하는 것입니다.
z-index는 반드시position속성이relative,absolute,fixed,sticky중 하나이거나, Flexbox나 Grid의 자식 아이템일 때만 동작한다는 사실! 실무에서 무조건 외워두셔야 합니다!
참고 (Note):
z-index 속성이 지정되지 않으면, 요소들은 기본 렌더링 레이어(레이어 0)에 그려집니다.z-index 값을 공유한다면 (즉, 같은 레이어 층에 배치된다면), z-index 속성 없이 쌓기 섹션에서 설명했던 기본 쌓임 규칙(HTML 문서에 나중에 작성된 요소가 위로 올라옴)이 그대로 적용됩니다.이 예제에서는 z-index를 사용해서 레이어들이 쌓이는 순서를 재배치해 보았습니다. 여기서 DIV #5의 z-index는 아무런 효과가 없는데요, 그 이유는 위치가 지정된(positioned) 요소가 아니기 때문입니다.
👨🏫 강사님의 꿀팁 & 보충설명:
아래 코드를 보면 DIV #5(id="sta1")에z-index: 8이라는 가장 높은 숫자를 주었지만,position속성이 없기 때문에 무시당하고 맨 아래에 깔리게 됩니다. 이렇게 의도적으로 작동하지 않는 예시를 섞어둔 것이니 꼭 확인해 보세요!
<div id="abs1">
<strong>DIV #1</strong>
<br />position: absolute; <br />z-index: 5;
</div>
<div id="rel1">
<strong>DIV #2</strong>
<br />position: relative; <br />z-index: 3;
</div>
<div id="rel2">
<strong>DIV #3</strong>
<br />position: relative; <br />z-index: 2;
</div>
<div id="abs2">
<strong>DIV #4</strong>
<br />position: absolute; <br />z-index: 1;
</div>
<div id="sta1">
<strong>DIV #5</strong>
<br />no positioning <br />z-index: 8;
</div>
div {
padding: 10px;
opacity: 0.7;
text-align: center;
}
strong {
font-family: sans-serif;
}
#abs1 {
z-index: 5;
position: absolute;
width: 150px;
height: 350px;
top: 10px;
left: 10px;
border: 1px dashed #990000;
background-color: #ffdddd;
}
#rel1 {
z-index: 3;
height: 100px;
position: relative;
top: 30px;
border: 1px dashed #669966;
background-color: #ccffcc;
margin: 0px 50px;
}
#rel2 {
z-index: 2;
height: 100px;
position: relative;
top: 15px;
left: 20px;
border: 1px dashed #669966;
background-color: #ccffcc;
margin: 0px 50px;
}
#abs2 {
z-index: 1;
position: absolute;
width: 150px;
height: 350px;
top: 10px;
right: 10px;
border: 1px dashed #990000;
background-color: #ffdddd;
}
#sta1 {
z-index: 8;
height: 70px;
border: 1px dashed #999966;
background-color: #ffffcc;
margin: 0px 50px;
}
아래 링크를 클릭하여 MDN Playground에서 코드가 실제로 어떻게 쌓이는지 결과를 확인해 보세요! DIV #1(z-index: 5)이 가장 위에 올라와 있고, z-index: 8을 준 DIV #5가 맨 바닥에 깔려있는 재미있는 결과를 확인하실 수 있습니다.
z-index와 요소들의 쌓임(Stacking)에 대해 더 깊이 공부하고 싶으시다면 아래 문서들도 꼭 확인해 보세요. 특히 '쌓임 맥락(Stacking context)'은 면접 질문으로도 자주 나오니 꼭 읽어보시는 것을 추천합니다!
z-index 속성 없이 쌓기 (Stacking without z-index)이 페이지가 도움이 되었나요? (Was this page helpful to you?)
[예 (Yes)]
[아니요 (No)]
이 페이지는 MDN 기여자들에 의해 2025년 11월 7일에 마지막으로 수정되었습니다.
수고하셨습니다! z-index의 작동 원리, 이제 확실하게 감이 오시죠? 실무에서 박스들이 마음대로 안 겹쳐질 때 오늘 배운 position과의 관계를 꼭 떠올려 보세요. 더 궁금한 점이 있으면 언제든 질문해주세요!