yarn add react-modal만약 모달이 제대로 나오지 않는다면,
아래의 오류가 발생하는지 확인 필요

이 경고는
react-modal에서 접근성 문제를 해결하기 위한 것으로, 모달이 열릴 때 화면에 표시되는 다른 콘텐츠를 스크린 리더기가 읽지 않도록 하는 설정과 관련이 있음. 이를 해결하려면,
Modal.setAppElement()를 사용하여 애플리케이션의 루트 요소를 지정해주면 됨
그래도 안보이는 문제가 발생한다면,
overlay의 z-index속성을 1000등으로 높은 값으로 설정해줄 것
모달을 import해준 뒤
import Modal from 'react-modal';
이미지 클릭하면 모달창 상태 on
클릭한 이미지 주소를 상태로 저장
const [isModalOpen, setIsModalOpen] = useState(false); const [selectedImage, setSelectedImage] = useState<string | null>(null); useEffect(() => { // 모달이 앱의 특정 요소를 기준으로 접근성을 유지하도록 설정 Modal.setAppElement('#root'); // '#root'는 애플리케이션의 루트 요소 ID입니다. }, []); const openModal = (image: string) => { setSelectedImage(image); setIsModalOpen(true); }; const closeModal = () => { setIsModalOpen(false); setSelectedImage(null); };
onClick속성 줌
<StyledRoomCardImg key={`Room-detail-img-${index}`} src={image} onClick={() => { openModal(image); }} // 이미지 클릭 시 모달 열기 />
이미지가 선택되면, 모달창 띄우기
<Modal isOpen={isModalOpen} onRequestClose={closeModal} style={{ overlay: { backgroundColor: 'rgba(0, 0, 0, 0.75)', zIndex: 1000 }, content: { top: '50%', left: '50%', right: 'auto', bottom: 'auto', marginRight: '-50%', transform: 'translate(-50%, -50%)', padding: '0.5rem', borderRadius: '10px', backgroundColor: 'rgba(0, 0, 0, 0.75)', width: '90%' } }} > {selectedImage && <img src={selectedImage} alt="Selected" style={{ width: '100%', height: 'auto' }} />} </Modal>
Modal 속성 설명
isOpen={isModalOpen}:- 모달이 열려 있는지 여부를 결정하는 속성
isModalOpen은useState훅을 통해 관리되는 상태 값으로,true일 때 모달이 열리고false일 때 모달이 닫힘
onRequestClose={closeModal}:- 모달 바깥을 클릭하거나 "ESC" 키를 눌렀을 때 모달을 닫기 위해 실행되는 함수
closeModal은 모달을 닫기 위해isModalOpen상태를false로 변경하는 함수
const closeModal = () => { setIsModalOpen(false); setSelectedImage(null); };
style 속성 설명
Modal의 스타일은 두 부분으로 나뉨 → overlay와 content.overlay
모달 창이 열렸을 때, 배경을 덮는 오버레이 부분을 정의
backgroundColor: 'rgba(0, 0, 0, 0.75)': 반투명한 검은색 배경을 설정.
→ 모달이 열린 동안 배경의 내용이 흐리게 보이도록 함
zIndex: 1000: 모달을 화면의 다른 요소들보다 위에 배치하는 속성
- z-index: 레이어의 순서를 설정하는 CSS 속성
content
모달의 실제 내용이 들어가는 부분
top: '50%',left: '50%': 모달을 화면 중앙에 위치시키기 위한 좌표 설정
right: 'auto',bottom: 'auto':right와bottom좌표를 자동으로 설정하여 모달이 수평 및 수직 중앙에 위치할 수 있도록
marginRight: '-50%': 수평 중앙 정렬을 보정
transform: 'translate(-50%, -50%)': 화면의 가운데로 모달을 이동
padding: '0.5rem': 모달 내부에 패딩(여백)을 추가하여 내용이 모달의 가장자리에 붙지 않도록
selectedImage && <img src={selectedImage} alt="Selected" style={{ width: '100%', height: 'auto' }} />
- 이 부분은
selectedImage가 존재할 때만 이미지를 렌더링
src={selectedImage}:selectedImage변수에 저장된 이미지 경로
style={{ width: '100%', height: 'auto' }}: 이미지를 모달 내부에 맞게 표시하며, 너비는 100%로 설정되고 높이는 자동으로 조정
동작 방식
- 모달을 열 때,
isModalOpen이true가 되고, 모달이 화면에 표시
- 오버레이가 반투명 검은색으로 배경을 덮으며, 모달은 중앙에 위치
- 모달의 콘텐츠로
selectedImage가 존재할 경우 해당 이미지가 화면에 표시
- 모달 바깥을 클릭하거나 ESC 키를 누르면
onRequestClose가 호출되어isModalOpen이false로 변경되고 모달이 닫힘
추가
모달창에서, 이미지를 넣을 때 하단에 미묘하게 작은 여백이 생기는 경우가 있는데,


아래와 같이, display: ‘block’속성을 추가하면 해결된다


