2026. 10. 10. 15:41ㆍCSS
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
이미지 위에 API나 서버에서 전달받은 데이터를 특정 위치에 표시해야 할 때, 반응형에서도 좌표가 안정적으로 유지되도록 잡는 방법을 정리해 봤다.
반응형 이미지 위 absolute 좌표, vw보다 %가 잘 맞았던 이유
이벤트 페이지를 작업하다 보면 한 장의 이미지 위 특정 위치에 숫자나 텍스트를 올려야 하는 경우가 있다.
특히 단순한 고정 문구가 아니라, API나 서버에서 전달받은 데이터가 화면에 동적으로 뿌려지는 경우, 해당 값을 이미지의 특정 좌표에 정확하게 표시해야 할 때가 있다.
예를 들어, 이미지 위에 현재 참여 인원이나 응모 수처럼 계속 바뀌는 데이터를 표시한다고 해보자.
디자인 시안의 기준 크기는 360 × 244px이고, 이미지가 화면 크기에 따라 줄어들면 그 위에 올라간 텍스트도 같은 위치를 유지하면서 함께 이동해야 한다.

HTML 구조는 단순하게 만들었다.
<div class="image-overlay">
<img
class="image-overlay__image"
src="./sample.png"
alt=""
/>
<span class="image-overlay__label">
{{ entryCount }}명
</span>
</div>
.image-overlay {
position: relative;
}
.image-overlay__image {
display: block;
width: 100%;
height: auto;
}
.image-overlay__label {
position: absolute;
}
여기까지는 일반적인 이미지 오버레이 구조다.
처음에는 vw로 좌표를 계산했다
처음에는 디자인이 360px 기준이었기 때문에 vw를 이용하면 화면 크기에 따라 자동으로 줄어들 것이라고 생각했다.
예를 들어 이런 식이다.
.image-overlay__label {
position: absolute;
left: calc(100vw * 145 / 360);
top: calc(100vw * 24 / 360);
}
하지만 실제 작업에서는 화면 사이즈를 바꿀 때마다 요소의 위치가 조금씩 어긋났다.
결국 이런 식의 추가 보정 코드가 계속 생겼다.
반응형 처리를 했는데 해상도마다 다시 좌표를 잡아줘야 하는 상황이었다.
@media screen and (max-width: 360px) {
.image-overlay__label {
/* 위치 보정 */
}
}
@media screen and (max-width: 320px) {
.image-overlay__label {
/* 또 위치 보정 */
}
}
문제는 vw가 아니라 '기준점'이었다
vw는 현재 요소의 부모 크기가 아니라 viewport, 즉 브라우저 화면의 너비를 기준으로 계산된다.
하지만 내가 위치를 맞추려고 하는 대상은 브라우저 화면이 아니었다. 이미지였다.
그래서 viewport가 아니라 이미지의 부모 영역을 기준으로 좌표를 계산하도록 %로 변경했다.
그리고 디자인에서 텍스트 위치가 예를 들어 다음 좌표라고 해보자.
x : 145px y : 24px
가로 위치를 퍼센트로 계산하면 145(x좌표) / 360(부모 너비값) * 100 = 약 40.28%
세로 위치는 24(y좌표) / 244(부모 높이값) * 100 = 약 9.84%
따라서 다음과 같이 작성할 수 있다.
.image-overlay__label {
position: absolute;
left: calc(145 / 360 * 100%);
top: calc(24 / 244 * 100%);
}
여기서 중요한 점, 가로와 세로의 기준이 다르다.
vw와 %의 가장 큰 차이
| vw | viewport 너비 | 화면 전체 크기를 기준으로 움직일 때 |
| % | 기준 부모 영역 | 부모와 함께 크기·위치가 변해야 할 때 |
| rem | root font-size | 폰트 및 일정한 디자인 스케일 |
| px | 고정값 | 크기가 변하지 않아야 할 때 |
중요한 건 단위 자체보다 무엇을 기준으로 위치를 계산하느냐였고, 이미지 영역을 기준으로 해야 하는 경우에는 vw보다 %가 더 안정적이었다. 이렇게 반응형 이미지 위 absolute 좌표, vw보다 %가 잘 맞았던 이유에 대해서 알아보았다.
'CSS' 카테고리의 다른 글
| [CSS] 왜 <span>은 수직 중앙 정렬이 안 맞고, <img>는 맞을까? (0) | 2025.09.17 |
|---|---|
| [CSS/defect] 특정 디바이스에서 터치 하이라이트 오류 수정 (feat. ios) (0) | 2025.05.16 |
| [CSS/SCSS] className 없이 스타일 적용하는 트릭 (0) | 2025.04.17 |
| [CSS/SCSS] React에서 Swiper 스타일이 안 먹힐 때 – .swiper 대신 :global(.swiper)를 써야 하는 이유 (0) | 2025.04.16 |
| [CSS] 입력폼에서 readonly와 disabled, 언제 어떻게 쓰고 스타일링할까? (0) | 2025.03.28 |