ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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만으로 구현할 수 있다.

Designed by Tistory.