CSS position 속성 생성기
GUI로 static·relative·absolute·fixed·sticky 5가지 CSS position 값을 전환하며 top/right/bottom/left와 z-index의 효과를 실시간 미리보기로 확인하고, 해당 CSS 코드를 무료로 생성할 수 있습니다.
position의 다섯 값을 나란히 놓고 견주기
`position`은 요소가 어디에 놓일지를 정하는 속성으로 `static`·`relative`·`absolute`·`fixed`·`sticky`의 다섯 값을 갖습니다. 이 도구는 이들 사이를 오가며 `top`·`right`·`bottom`·`left`와 `z-index`가 어떻게 듣는지를 그 자리에서 확인하고 CSS를 만들어 냅니다.
**`absolute`로 놓은 요소가 엉뚱한 자리로 날아가는 까닭은 거의 언제나 하나입니다. 「`position`이 `static`이 아닌 가장 가까운 조상」을 기준으로 놓이기 때문입니다.** 그런 조상이 하나도 없으면 요소는 페이지 전체를 기준으로 삼아 버립니다. **부모에 `position: relative`를 붙이는 것을 잊은 것**이 이런 일의 거의 전부입니다. **`sticky`에도 널리 알려진 함정이 있어, 조상 가운데 어디엔가 `overflow: hidden`이나 `overflow: auto`가 있으면 달라붙지 않습니다.** 또 `z-index`는 「쌓임 맥락」이라는 겹겹의 단위 안에서 닫히므로, **바깥보다 아래에 있는 맥락에 든 요소는 값을 아무리 키워도 그 위로 올라서지 못합니다.**
사용하는 방법
- position의 값을 바꿉니다 다섯 가지를 차례로 시험해 보면 저마다 무엇을 기준으로 삼는지가 드러납니다.
- 오프셋을 움직입니다 **값이 `static`일 때에만 `top` 따위가 전혀 듣지 않는다는 점을 확인해 보십시오.**
- z-index를 바꿉니다 겹치는 차례가 어떻게 바뀌는지 볼 수 있습니다.
- 만들어진 CSS를 복사합니다 노린 자리가 나오면 그대로 코드에 붙여 넣을 수 있습니다.
더 잘 활용하기 위한 팁
- position: relative로 전환하고 top/left를 설정하면 Box B가 원래 위치에서 시각적으로만 이동합니다. Box C(뒤 요소)의 위치는 전혀 바뀌지 않는다는 점에 주목하세요.
- absolute나 fixed로 전환하면 Box B가 일반적인 문서 흐름에서 완전히 벗어나므로, Box C가 그만큼 앞으로 당겨져 배치되는 모습을 확인할 수 있습니다.
- z-index는 요소가 겹칠 때 쌓임 순서를 결정하지만 position: static인 요소에는 효과가 없습니다. "z-index 지정"을 테스트하기 전에 position을 먼저 바꿔보세요.
- position: sticky는 스크롤 가능한 컨테이너 안에서만 효과가 있습니다. 미리보기 영역 자체를 스크롤해서 요소가 중간에 고정되는 모습을 확인해 보세요.
- 생성된 CSS 코드는 복사해서 그대로 자신의 스타일시트에 붙여넣을 수 있습니다. 실제 페이지에서도 같은 모양이 되는지 확인해 보세요.
이럴 때 쓸 수 있습니다
머리글을 화면 위에 붙여 둘 때
**`sticky`를 쓰면 스크롤해도 머리글이 그 자리에 남습니다.**
배지나 아이콘을 모서리에 겹칠 때
부모에 `relative`, 자식에 `absolute`가 가장 기본이 되는 짜임입니다.
고정된 단추를 둘 때
`fixed`는 화면을 기준으로 놓이므로 아무리 스크롤해도 움직이지 않습니다.
겹침의 탈을 살필 때
**어떤 요소가 다른 요소 아래로 숨는다면 쌓임 맥락을 먼저 의심할 수 있습니다.**
position 용어
- static
- 기본값입니다. **이 값인 동안에는 `top` 같은 오프셋도 `z-index`도 듣지 않습니다.**
- relative
- **본래 놓였을 자리를 기준으로** 요소를 비껴 놓습니다. 저는 움직여도 원래 자리는 그대로 비워 둡니다.
- absolute
- **`position`이 `static`이 아닌 가장 가까운 조상을 기준으로 놓습니다.** 그런 조상이 없으면 페이지 전체가 기준이 됩니다.
- fixed
- 화면(뷰포트)을 기준으로 놓이므로 아무리 스크롤해도 자리가 바뀌지 않습니다.
- sticky
- 여느 자리에 있다가 주어진 오프셋에 이르면 달라붙습니다. **조상에 `overflow`가 있으면 듣지 않습니다.**
- 쌓임 맥락
- 겹치는 차례가 닫히는 겹겹의 단위입니다. **그 안의 `z-index`는 바깥 요소와 곧바로 견줄 수 없습니다.**
자주 묻는 질문
여담 ― position: sticky가 표준화되기까지의 여정
CSS에는 오래전부터 static·relative·absolute·fixed 4가지 값이 존재했지만, "스크롤하다 어느 지점부터 고정되는" 헤더나 사이드바를 구현하려면 오랫동안 JavaScript로 스크롤 이벤트를 감시하며 position: fixed로 수동 전환하는 방법밖에 없었습니다. CSS만으로 이 동작을 표현할 방법은 없었던 것입니다.
position: sticky의 아이디어 자체는 2012년경 CSS Positioned Layout Module Level 3 명세에 이미 포함되어 있었지만, 구현이 까다로워 Safari가 벤더 프리픽스(-webkit-sticky)를 붙인 형태로 먼저 구현한 것이 2013년경이었습니다. Chrome이 표준 sticky 키워드를 지원한 것은 2017년이었고, Firefox를 포함한 주요 브라우저에서 안심하고 쓸 수 있게 된 것은 그로부터 몇 년이 더 지난 2020년 무렵이었습니다.
position: sticky의 "스크롤 도중 고정되는" 동작은 구현상 relative와 fixed의 하이브리드로 설명할 수 있습니다. 평소에는 relative처럼 일반적인 흐름을 따르다가, 스크롤 위치가 지정된 오프셋에 도달하면 그 자리에서 fixed로 전환된 것처럼 동작합니다. 이 전환이 부모 요소의 스크롤 범위 안에서만 일어난다는 점이, sticky가 의도치 않게 "작동하지 않는다"고 느껴지는 원인의 상당수를 차지합니다.
오늘날 sticky는 테이블의 헤더 행을 고정하거나 목차를 스크롤에 따라오게 하는 등, 웹 디자인의 정석 기법으로 널리 쓰이고 있습니다. JavaScript로 스크롤을 감시할 필요가 없어진 것은 성능과 코드 단순함 양쪽 모두에서 큰 진전이었습니다.