CSS에서 position 속성은 요소를 배치하는 방법을 결정한다.
요소를 문서의 흐름에 따라 배치한다. 기본값으로 설정되어 있다.
요소를 문서의 흐름에 따라 배치하며, 자기 자신을 기준으로 left
, right
, top
, bottom
의 값에 따라 오프셋을 적용한다.
이때, 적용된 오프셋은 다른 요소에는 영향을 주지 않는다. 또한, relative
속성이 적용된 Box2
가 Box3
의 위에 있는 데서 알 수 있는 것처럼 relative
속성은 새로운 쌓임 맥락을 생성한다. 쌓임 맥락은 같은 position
속성이 적용된 요소들 간에 z-index
를 기준으로 쌓임 순서가 결정된다.
요소를 일반적인 문서의 흐름 배치에서 제거하고, 페이지 레이아웃에 공간도 배정하지 않는다. 대신 가까운 위치 지정 조상 요소에 따라 배치된다. 위의 예시에서는 Box2
에 relative
로 위치가 지정되어 있으므로, absolute
가 적용된 Box2-1
는 Box2
안에서 left
와 top
을 오프셋으로 위치가 결정된다. 이때, Box2-2
위에 Box2-1
이 배치된 데서 알 수 있듯이 absolute
도 새로운 쌓임 맥락을 생성한다.
요소를 일반적인 문서의 흐름 배치에서 제거하고, 페이지 레이아웃에 공간도 배정하지 않는다. 대신 화면의 뷰포트를 컨테이닝 블록으로 기준으로 하여 배치하고 left
, right
, top
, bottom
의 값에 따라 오프셋을 적용한다. 스크롤을 내려도 요소의 위치가 변하지 않고 화면 상에 고정되는 특징을 갖는다. 단, 요소의 조상 중 하나가 어느 하나라도 filter
, transform
, perspective
속성 중 하나가 none
이 아니라면 그 조상 요소를 기준으로 배치된다.
위의 예시에서 Box4
에는 fixed
속성이 적용되어있으나, 그의 조상 요소인 Box2
가 perspective
속성이 none
이 아니므로 뷰포트가 아닌 Box2
를 기준으로 위치되어 있다.
요소를 일반적인 문서의 흐름에 따라 배치한다. 이때, 가장 가까운 조상 요소 중 스크롤 속성이 있으며, 표 관련 요소를 포함한 컨테이닝 블록으로 left
, right
, top
, bottom
의 값에 따라 오프셋을 적용한다. 이 오프셋은 다른 요소에는 영향을 주지 않는다.
sticky
가 적용된 BoxB
는 원래의 배치대로 BoxA
안에 문자 BoxA 다음에 배치되었다. 하지만 스크롤을 내리면 지정된 오프셋 top: 10px
은 적용되어 BoxA
안에 계속 보이는 상태로 존재한다.
CSS에서 z-index
는 요소의 수직 위치를 제어하여 겹쳐있는 요소의 쌓는 순서를 제어할 수 있다. 정수를 값으로 사용하며, 기본값으로 auto
가 지정되어 있다. z-index
가 지정되어 있지 않으면 HTML에 쓰여진 순서대로 배치가 결정되며, z-index
가 없을 경우
position
, float
속성이 설정되지 않은 block-level 요소position
속성이 설정되지 않은, float
속성이 설정된 block-level 요소position
속성이 설정된 in-line 요소position
속성이 설정된 요소의 순서대로 배치된다.
출처: [moonheekim0118) [CSS] z-index와 쌓임 맥락 (stacking context)]position
이 지정되지 않은 붉은 block-level 요소는 제일 아래에, position: relative
로 속성이 지정된 나머지 두 요소는 선언 순서대로 위치가 지정되었음을 알 수 있다.
position
이 설정되어 있으며, z-index
를 사용하면 요소가 쌓이는 순서는 아래와 같다.
position
속성이 설정된, z-index
가 음수인 요소position
, float
속성이 설정되지 않은 block-level 요소position
속성이 설정되지 않은 block-level 요소position
속성이 설정된 in-line 요소position
속성이 설정된, z-index
가 0
또는 auto
인 요소position
속성이 설정된, z-index
가 양수인 요소CSS에서 쌓임 맥락은 가상의 Z축을 사용한 HTML 요소의 3차원 개념화로, HTML 요소들이 겹쳐져 있을 때, 각 요소의 배치 순서와 관련하여 결정되는 컨텍스트를 일컫는다.
쌓임 맥락이 생성되는 조건은
position
이 absolute
, 또는 relative
이며 z-index
가 auto
가 아닌 요소positon
이 sticky
, 또는 fixed
인 요소flex
속성 컨테이너의 자식 요소 중 z-index
가 auto
가 아닌 요소grid
속성 컨테이너의 자식 요소 중 z-index
가 auto
가 아닌 요소opacity
가 1
보다 작은 요소mix-blend-mode
가 normal
이 아닌 요소transform
, filter
, perspective
, clip-path
, mask
속성 중 하나라도 none
이 아닌 요소isolation
이 isolate
인 요소등이 있다.
쌓이 맥락이 생성된 요소의 자식 요소는 쌓임 맥락 생성 규칙 및 z-index 규칙에 의해 동일하게 쌓인다. 이때, 자식의 z-index
값은 부모에게만 의미가 있다. 또한 하나의 쌓임 맥락은 부모 쌓임 맥락 안에서 통째로 하나의 단위로 간주된다.
즉, 요약하면
위의 예시에서 쌓임 맥락은 다음의 계층 구조를 이룬다.
D, E, F는 C의 자식이므로 C의 내에서만 쌓임 맥락이 처리되었다. C 내에서의 요소 쌓기와 렌더링이 끝나면 전체 C를 루트 요소의 쌓임 맥락에서 형제 요소들과 쌓는다. D는 A보다 z-index
값이 더 크지만 A보다 아래에 렌더링 되었다. D는 A보다 z-index
값이 더 크지만 A보다 아래에 렌더링 되었다. 왜냐하면 A의 z-index
5는 루트 엘리먼트의 쌓임 맥락 안에서 유효하나 D의 z-index
6은 C에서의 쌓임 맥락 안에서만 유효하기 때문이다. D는 자신이 속하는 C의 z-index
값이 4이므로 A보다 아래에 쌓였다. 같은 이유로 B는 E 아래에 렌더링 되었다. E는 B보다 z-index
값이 작지만 루트 엘리먼트의 쌓임 맥락안에서 유효한 E가 속한 C의 z-index
값이 B의 z-index
값 보다 더 크기 때문이다. 이때, C의 z-index
4는 D, E, F의 z-index
와 다른 쌓임 맥락에 속해있으므로 독립적이다.
mdn web docs) position - CSS
daleseo) CSS의 position 속성으로 HTML 요소 배치하기
mdn web docs) 쌓임 맥락
moonheekim0118) [CSS] z-index와 쌓임 맥락 (stacking context)