JavaScript
Modal 화면 구현 (Modal 외부 클릭 시 Modal 꺼짐)
citron031
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만으로 구현할 수 있다.