-
Modal 화면 구현 (Modal 외부 클릭 시 Modal 꺼짐)JavaScript 2023. 5. 2. 23:21
모달창을 구현하는데 있어서 뒤에 화면을 뿌옇게 하고, 모달창의 바깥을 클릭 시 모달창이 꺼지는 기능을 구현하였다.
기본적인 구현 아이디어는, 기존의 화면을 전부 덮어버리는 투명한 요소를 만들고, 이 요소 위에 Modal을 구현하는 것이다.
바깥의 투명한 화면을 클릭하면, 모달창이 꺼지게 만들며 Modal 내부에 닫기 버튼을 만들 수도 있다.
Tailwindcss를 사용한 구현
import React from 'react'; export default function Modal({ setIsShow }: { setIsShow: () => void }) { return ( <> <div className="absolute top-0 left-0 w-full h-full bg-slate-400 opacity-50" onClick={setIsShow} ></div> <div className="absolute top-40 m-auto bg-slate-50 p-16 m-4"> <p>Modal Context</p> <button className="border-2 p-4 m-4 hover:bg-sky-700" onClick={setIsShow}> close </button> </div> </> ) }Css를 이용한 기본 구현
가장 기본적인 css를 사용해서도 구현하였다.
역시 미래에 참고하기 위해서는 기본이 제일 좋은 것 같다.
<div> <div> <h1>Hello World</h1> <button class="show-button">Show Modal</button> </div> <!-- Modal --> <div id="cover-div"></div> <div id="modal-div"> <p>Modal Content</p> <button class="modal-button">close</button> </div> <!-- Modal --> </div>일단 다음과 같은 HTML을 구성한다.
바깥의 show button으로 모달창을 띄우고, 모달창 내부 close button이나 모달창 바깥의 영역을 클릭 시 모달창을 닫게 한다.
#cover-div { display: none; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #ddd; opacity: 0.5; } #modal-div { display: none; position: absolute; top: 45%; left: 45%; background-color: yellowgreen; padding: 16px; margin: 16px; }CSS를 통해서 cover-div가 화면 전체를 가리고 반투명하게 한다.
그리고 모달과 커버 영역은 보이지 않게 display 설정을 none으로 한다.
const coverDiv = document.querySelector('#cover-div'); const modalDiv = document.querySelector('#modal-div'); const showBtn = document.querySelector('.show-button'); const modalBtn = document.querySelector('.modal-button'); showBtn.addEventListener("click", () => { coverDiv.style.display = "block"; modalDiv.style.display = "block"; }); modalBtn.addEventListener("click", () => { coverDiv.style.display = "none"; modalDiv.style.display = "none"; }); // 바깥 클릭 시 모달창 닫기 coverDiv.addEventListener("click", () => { coverDiv.style.display = "none"; modalDiv.style.display = "none"; });마지막으로 적절하게 addEventListener를 사용하여 버튼과 cover-div에 이벤트를 연결한다.
위와 같이 모달창을 기본 HTML, Css, Javascript만으로 구현할 수 있다.
'JavaScript' 카테고리의 다른 글
Proxy 사용하기 (0) 2023.05.12 HTML 화면 스크린샷 찍기 (html2canvas) (0) 2023.05.04 이벤트 버블링(Event Bubbling) 및 이벤트 캡처링(Event Capture)에 대해서 (1) 2023.04.26 브라우저 Scroll Event 사용하기 (0) 2023.04.02 자바스크립트의 이벤트 루프(Event Loop) 알아보기 (0) 2023.03.27