기존 페이지 위에 새로운 윈도우 창이 아닌 레이어를 까는 것
- 팝업
현재 페이지에 또 다른 페이지를 띄우는 것.
외부설정으로 제어할 수 있음(강제로 창을 막는 등)- 모달
새로운/다른 페이지가 아니라 레이어를 보여주는 것.
페이지를 이동하면 사라짐.
외부설정의 옵션에 영향을 받지 않음.
export const Modal = () => {
// 모달창을 보여주는 true/false 값
const [isOpen, setIsOpen] = useState(false);
const openModalHandler = () => {
setIsOpen(!isOpen);
};
return (
<>
<div>
<button
onClick={openModalHandler}
>
Open!
</button>
{isOpen && (
<div onClick={openModalHandler}> // 모달창의 배경
<div onClick={(e) => e.stopPropagation()}> // 모달창
<div>Hello?</div>
<button onClick={openModalHandler}>Close</button>
</div>
</div>
)}
</div>
</>
);
};
해당 요소를 항상 고정된 위치에 배치
fixed 속성값의 배치 기준은 뷰포트가 된다.
top, left, bottom, right 속성은 각 브라우저의 상단, 좌측, 하단, 우측으로부터 해당 요소가 얼마나 떨어져있는지를 결정
현재 이벤트가 캡처링/버블링 단계에서 더 이상 전파되지 않도록 방지
이벤트의 기본 동작을 막는 것은 아님( !== preventDefault() )
해당 모달 컴포넌트에서는 모달창의 외부를 클릭했을 때 발생하는 openModalHandler 함수가 모달창 내부에서는 작동하지 않도록 하기 위해 사용되었다.