
어드벤트 캘린더 프로젝트에서 사용자가 업로드한 이미지를 모달로 표시하는 기능을 구현했다.
이미지 상세보기 모달과 업로드 미리보기 모달 두 곳에서 이미지를 보여주는데, 이미지의 가로세로 비율이나 크기에 따라 모달의 높이가 동적으로 변하도록 구현했었다.
세로로 긴 이미지 업로드시 일부 모바일 기기에서 세로로 이미지가 길어 업로드 버튼이 보이지 않아 업로드가 불가했다.
ImageDetailModal, ImageUploadModal세로로 긴 이미지를 업로드하거나 상세보기를 열면 다음과 같은 문제가 발생했다:
// 기존 코드 - 이미지 높이 제한 없음
<div className="relative">
<img
src={preview}
alt="Preview"
className="w-full rounded-lg"
/>
<button
onClick={() => {
setFile(null);
setPreview(null);
}}
className="absolute top-2 right-2 bg-red-500 text-white rounded-full p-1 hover:bg-red-600"
>
<UploadCloud className="w-4 h-4"/>
</button>
</div>
고정 높이가 없어 내용에 따라 전체 모달 구조가 유동적으로 변하는 것이 근본적인 원인이었다.
컨테이너에 고정 높이를 부여하고, 그 안에서 이미지가 비율을 유지하며 중앙 정렬되도록 변경했다.
상세 모달 (ImageDetailModal.tsx)
// 수정 후 - 컨테이너 높이 고정
<div className="relative flex-shrink-0 h-[60vh] bg-slate-100 flex items-center justify-center">
<img
src={currentImage.imageUrl}
className="max-w-full max-h-full object-contain"
/>
</div>
업로드 모달 (ImageUploadModal.tsx)
// 수정 후 - 미리보기 영역 높이 고정
<div className="relative h-[60vh] bg-slate-100 rounded-lg flex items-center justify-center">
<img
src={preview}
className="max-w-full max-h-full object-contain rounded-lg"
/>
</div>
핵심 변경사항:
h-[60vh]: 컨테이너 높이를 화면의 60%로 고정flex items-center justify-center: 이미지를 컨테이너 중앙에 배치max-w-full max-h-full object-contain: 이미지가 컨테이너를 넘지 않으면서 비율 유지bg-slate-100: 빈 공간을 시각적으로 구분이제 어떤 비율의 이미지가 오더라도 모달 높이는 일정하게 유지되고, 하단 버튼과 정보 영역이 항상 접근 가능해졌다.
이미지 크기가 유동적일 때는 컨테이너의 높이를 고정하라.
컨테이너에 고정 높이(h-[60vh])를 주고, 그 안에서 object-contain과 flex 중앙 정렬로 이미지를 배치하면 일관된 UI를 유지할 수 있다.
느낀 점
UI 구현할 때 "원본을 최대한 살리자"는 생각이 오히려 사용자 경험을 해칠 수 있다는 걸 배웠다. 이미지 비율을 유지하는 것도 중요하지만, 모달이라는 제한된 공간에서는 일관된 레이아웃과 접근성이 우선이어야 한다. 컨테이너 기반 사고로 전환하니 문제가 명확하게 보였다.