문제 상황
디자이너님이 제작해주신 모달창은 input button의 좌측에 생성되어야 하기에 input button의 위치를 알아야 하며, 또한 반응형으로 모바일로 크기가 작아졌을 때에는 bottom sheet로 바뀌어야 한다.
디자이너님의 모달창 요구 사항 1
디자이너님의 모달창 요구 사항 2
디자이너님의 모달창 요구 사항 3
첫 번째 해결 방법
element.getBoundingClientRect();
으로 버튼의 위치 정보를 불러온다.첫 번째 해결 방법의 문제점
두 번째 해결 방법
해당 모달창이 필요한 위치의 부모 element에 relative를 걸고 그 내부에 모달창 컴포넌트를 선언한다.
예시 코드
return (
...
<InputCard>
{isCalendarOpen && (
<BottomSheetModal>
<DateModal onClick={handleCalendarClick} selectedDateStr={selectedDateStr} />
</BottomSheetModal>
)}
<button className="flex flex-row w-full gap-[12px]" onClick={handleCalendarClick}>
<CalendarIcon className="flex-shrink-0 w-[20px] h-[20px] stroke-[#2F323C]" />
<Typography variant="Subtitle16px" color="grey700Black">
{date}
</Typography>
</button>
</InputCard>
...
)
예시 코드
return (
<>
{isOpen2 && <div className="absolute inset-0 bg-black opacity-40 lg:opacity-0 z-[49]" onClick={setClose} />}
<div className="absolute flex h-full lg:relative z-50">
<div
className={`fixed overflow-hidden max-h-[calc(100%-50px)] flex flex-col bottom-0 left-0 right-0 rounded-t-2xl bg-white
lg:absolute lg:overflow-visible
${isOpen2 ? 'flex' : 'hidden'}`}
>
<div className="flex justify-center p-3 lg:hidden" onClick={setClose}>
<div className="w-20 h-1 bg-grey900 rounded flex-shrink-0" />
</div>
<div
className={`bg-white shadow-md rounded-[6px]
lg:fixed lg:w-[375px] lg:-translate-x-[calc(100%+24px)] ${isUp && 'lg:-translate-y-[calc(100%-78px)]'}`}
>
{children}
</div>
</div>
</div>
</>
);
<div className="absolute flex h-full lg:relative z-50">
lg:relative
를 넣어 해당 위치에 absolute가 걸리게 설계하였다.결과