모달창 라이브러리 (react-modal)

Category
UI/UX
Status
Published
Tags
UI/UX
Modal
Description
Published
Slug
yarn add react-modal
 
만약 모달이 제대로 나오지 않는다면,
아래의 오류가 발생하는지 확인 필요
notion image
 
이 경고는 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 속성 설명

  1. isOpen={isModalOpen}:
      • 모달이 열려 있는지 여부를 결정하는 속성
      • isModalOpenuseState 훅을 통해 관리되는 상태 값으로, true일 때 모달이 열리고 false일 때 모달이 닫힘
  1. onRequestClose={closeModal}:
      • 모달 바깥을 클릭하거나 "ESC" 키를 눌렀을 때 모달을 닫기 위해 실행되는 함수
      • closeModal은 모달을 닫기 위해 isModalOpen 상태를 false로 변경하는 함수
      const closeModal = () => { setIsModalOpen(false); setSelectedImage(null); };
 

style 속성 설명

Modal의 스타일은 두 부분으로 나뉨 → overlaycontent.

overlay

모달 창이 열렸을 때, 배경을 덮는 오버레이 부분을 정의
  • backgroundColor: 'rgba(0, 0, 0, 0.75)': 반투명한 검은색 배경을 설정.
    • → 모달이 열린 동안 배경의 내용이 흐리게 보이도록 함
  • zIndex: 1000: 모달을 화면의 다른 요소들보다 위에 배치하는 속성
  • z-index: 레이어의 순서를 설정하는 CSS 속성
 

content

모달의 실제 내용이 들어가는 부분
  • top: '50%', left: '50%': 모달을 화면 중앙에 위치시키기 위한 좌표 설정
  • right: 'auto', bottom: 'auto': rightbottom 좌표를 자동으로 설정하여 모달이 수평 및 수직 중앙에 위치할 수 있도록
  • 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%로 설정되고 높이는 자동으로 조정
 

동작 방식

  1. 모달을 열 때, isModalOpentrue가 되고, 모달이 화면에 표시
  1. 오버레이가 반투명 검은색으로 배경을 덮으며, 모달은 중앙에 위치
  1. 모달의 콘텐츠로 selectedImage가 존재할 경우 해당 이미지가 화면에 표시
  1. 모달 바깥을 클릭하거나 ESC 키를 누르면 onRequestClose가 호출되어 isModalOpenfalse로 변경되고 모달이 닫힘
 
 
추가
모달창에서, 이미지를 넣을 때 하단에 미묘하게 작은 여백이 생기는 경우가 있는데,
notion image
notion image
 
 
아래와 같이, display: ‘block’속성을 추가하면 해결된다
notion image