프로젝트를 진행하면서 고생을 했던 부분은 사이드바와 스켈레톤 이미지를 추가하는 부분이었다. 사이드바는 네비게이션 바와 같이 feed의 오른쪽에 고정되어 있어 스크롤을 하더라도 같은 위치에 있어야 한다.
main태그에 대해 position: relative를 부여하고 사이드바에 해당하는 .sidebar에 position: fixed를 주었지만 사이드바는 main이 아닌 뷰포트 전체에 대해 position이 fixed된 것처럼 행동 하였다.
구글링 결과 main, 즉 position의 기준점이 될 요소에 transform을 사용했기 때문이다.
transform이라는 속성 자체가 해당 element에 대해 새로운 좌표계 시스템을 만드는 것이기 때문에 자식 요소의 position의 기준점이 될 수 없다는 것이다.
결과적으로 main이 기준점의 성질을 상실했으므로 사이드바는 main보다 위에 position이 적용된 (프로젝트에서는 없었기에) body태그를 기준점으로 잡은 것이다.
transform을 사용한 element에 대해서는 z-index: 0처럼 동작하는 새로운 stacking context가 생겨난다 (심지어 이는 해당 element에 position이 적용되지 않더라도 발생할 수 있다!)
1) 만약 z-index가 같은 요소들이 존재한다면 (즉, 같은 stacking context에 존재한다면) HTML의 구조상 나중에 작성된 element가 위로 쌓인다.
2) pseudo element를 사용하는 경우 기존요소 또는 가상 요소에 z-index 및 transform, opacity등이 설정되어 있는지 체크한다.
- 특히 before, after는 각각 요소의 첫번째, 마지막으로 새로운 요소가 생기는 것이므로 순서에 유의할 것!
- opacity, transform등은 새로운 stacking context를 생성
3) 해당 element에 대해 부모요소가 z-index를 가진다면 자식요소의 stacking context는 부모 요소의 stackgin context에 국한된다는 것이다.
<!-- HTML -->
<section class="content">
<div class="modal"></div>
</section>
<div class="side-tab"></div>
<!-- CSS -->
.content { z-index : 1; background-color: gray;}
.modal { z-index : 100;}
.side-tab{ z-index : 5;}
자식 element의 z-index는 부모 element의 틀을 벗어날 수 없고 국한된다!