Show [JavaScript] 모달창(Modal Window) backdrop(모달창 바깥 부분) 클릭시 모달창 닫지 않기페이지 정보짧은주소
평점
본문모든 모달창에 적용하도록 하기 위해 그누보드5/eyoom/theme/설치된 테마/layout/tail_bs.html 을 에디터로 열어 소스 가장 하단 </script> 아래쪽에 다음 스크립트를 추가하자.
키보드의 esc 키 또한 사용하지 않고자 한다면 다음과 같다.
댓글첫 번째 댓글을 남겨 주세요 <!DOCTYPE html> <html lang="ko"> <head> <title>javascript modal</title> <meta charset="utf-8"> <style> /* reset */ body, html { height:100%; } h2, p, div, h3 { margin:0; padding:0 } /* modal trigger */ button { border:none; font-size:18px; background:#f44336; color:#f9f9f9; padding:8px 16px; } h2 { padding:20px 0; } body { text-align:center; } /* modal overlay */ #overlay { width:100%; height:100%; background:rgba(0,0,0,0.4); position:fixed; top:0; left:0; z-index:1; visibility:hidden; opacity:0; transition:all 0.5s ease; } /* modal box */ .modal { width:80%; background:#f5f5f5; margin:150px auto; } .modal_header { width:100%; position:relative; } .modal_header h3 { padding:20px 0; color:#333; } .modal_content { width:100%; background:#fefefe; border:1px solid #888; box-sizing:border-box; height:200px; } .modal_content p {} .modal_footer { width:100%; padding:10px 0; font-size:14px; } .close { position:absolute; top:10px; right:20px; font-size:28px; color:#aaa; font-weight:bold; } .close:hover, .close:focus { color:#000; cursor:pointer; } </style> </head> <body> <h2>자바스크립로 모달을 만들어 보자</h2> <button id="myBtn">모달창 열기</button> <div id="overlay"> <div id="myModal" class="modal"> <div class="modal_header"> <h3>모달 헤더 부분입니다</h3> <span class="close">×</span> </div> <div class="modal_content"> <p>Some text in the Modal....</p> </div> <div class="modal_footer"> <p>copyright by KMS</p> </div> </div> </div> <!-- script> var btn = document.getElementById("myBtn"); var modal = document.getElementById("overlay"); var close = document.getElementsByClassName("close")[0]; btn.onclick = function(){ modal.style.visibility = "visible"; modal.style.opacity = 1; } close.onclick = function(){ modal.style.visibility = "hidden"; modal.style.opacity = 0; } /* 어디를 클릭해도 창이 닫힌다 modal.onclick = function(){ modal.style.visibility = "hidden"; modal.style.opacity = 0; } */ /* overlay영역만 해당이 됨, 모달 바깥쪽 윈도우를 클릭할 때 실행*/ window.onclick = function(e){ if(e.target == modal) { modal.style.visibility = "hidden"; modal.style.opacity = 0; } } </script --> <script src="http://code.jquery.com/jquery-latest.js"> </script> <script> // 모달창 열기 이벤트 $("#myBtn").on("click", function(){ $("#overlay").css({ visibility:"visible", opacity:1 }); }); // 모달창 닫기 이벤트 $(".close").on("click", function(){ $("#overlay").css({ visibility:"hidden", opacity:0 }); }); $(document).on("click", function(e){ if( $("#overlay").is(e.target)) { $("#overlay").css({ visibility:"hidden", opacity:0 }); } }); </script> </body> </html>
SILVERTORY
IT/SCRIPT by Wise Silver 2020. 6. 24. 외부영역 클릭할 경우 레이어팝업이 닫히는 스크립트입니다. See the Pen
외부영역 클릭시 레이어팝업 닫기 by wisesilver (@wisesilver) on CodePen. LIST
저작자표시 레이어팝업 닫기, 팝업 닫기 비밀글 모달 창이란 사용자 인터페이스 디자인 개념에서 자식 윈도에서 부모 윈도로 돌아가기 전에 사용자의 상호동작을 요구하는 창을 말합니다. 아래 그림에서 가운데 하얀색 부분이 그 예라고 할 수 있습니다. 이 모달창은 팝업과 비슷하게 정보를 전달하나 팝업과 다르게 별도의 창이나 탭을 생성하지 않고 페이지 내에서 레이어를 이용해 정보를 보여준다는 점이 차이점이라고 할 수 있습니다. 여기서 만들 모달 창은 디자인이나 모듈화 같은 고급 기법보다는 기본적인 이벤트 중심으로만 설명하겠습니다. 모달 창은 기본적으로 다음 이벤트를 가집니다.
HTML + CSS로 모달창 만들기일단 아무 기능이 없는 모달창을 만들어 보겠습니다. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Modal</title> <style> #modal.modal-overlay { width: 100%; height: 100%; position: absolute; left: 0; top: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; background: rgba(255, 255, 255, 0.25); box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); backdrop-filter: blur(1.5px); -webkit-backdrop-filter: blur(1.5px); border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.18); } #modal .modal-window { background: rgba( 69, 139, 197, 0.70 ); box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 ); backdrop-filter: blur( 13.5px ); -webkit-backdrop-filter: blur( 13.5px ); border-radius: 10px; border: 1px solid rgba( 255, 255, 255, 0.18 ); width: 400px; height: 500px; position: relative; top: -100px; padding: 10px; } #modal .title { padding-left: 10px; display: inline; text-shadow: 1px 1px 2px gray; color: white; } #modal .title h2 { display: inline; } #modal .close-area { display: inline; float: right; padding-right: 10px; cursor: pointer; text-shadow: 1px 1px 2px gray; color: white; } #modal .content { margin-top: 20px; padding: 0px 10px; text-shadow: 1px 1px 2px gray; color: white; } </style> </head> <body> <div id="container"> <h2>Lorem Ipsum</h2> <button id="btn-modal">모달 창 열기 버튼</button> <div id="lorem-ipsum"></div> </div> <div id="modal" class="modal-overlay"> <div class="modal-window"> <div class="title"> <h2>모달</h2> </div> <div class="close-area">X</div> <div class="content"> <p>가나다라마바사 아자차카타파하</p> <p>가나다라마바사 아자차카타파하</p> <p>가나다라마바사 아자차카타파하</p> <p>가나다라마바사 아자차카타파하</p> </div> </div> </div> <script> const loremIpsum = document.getElementById("lorem-ipsum") fetch("https://baconipsum.com/api/?type=all-meat¶s=200&format=html") .then(response => response.text()) .then(result => loremIpsum.innerHTML = result) </script> </body></html> 이 모달창은 기본적인 틀만 유지한다면 자유롭게 디자인해도 상관없습니다. 다만, 맨 위의 그림에서 배경이 어두워진것을 볼 수 있는데 이런 식으로 모달창과만 인터랙션하도록 유도할 필요가 있습니다. 이 부분을 오버레이라 하며, 브라우저 창 전체를 덮는 형태로 설정한 다음 모달창을 그 위에 올려놓으면 됩니다. 그리고 오버레이 레이어 이 모달에 이벤트를 부여하겠습니다. 특정 버튼을 누르면 모달창이 켜지게 하기모달의 초기 상태를 #modal.modal-overlay { ... display: none; ... } const modal = document.getElementById("modal") const btnModal = document.getElementById("btn-modal") btnModal.addEventListener("click", e => { modal.style.display = "flex" }) 모달창의 클로즈(x) 버튼을 누르면 모달창이 꺼지게 하기X(클로즈) 버튼에 위 예제와 반대되는 이벤트를 부여합니다. const closeBtn = modal.querySelector(".close-area") closeBtn.addEventListener("click", e => { modal.style.display = "none" }) 모달창 바깥 영역을 클릭하면 모달창이 꺼지게 하기모달 영역 외의 오버레이를 클릭하면 꺼지는 이벤트를 만들면 됩니다. modal.addEventListener("click", e => { const evTarget = e.target if(evTarget.classList.contains("modal-overlay")) { modal.style.display = "none" } }) 모달 창 외의 영역을 클릭하면 이벤트 타깃 요소에 그리고 모달 오버레이에 이벤트를 부여함으로써 모달 창 및 오버레이 외 다른 요소에 이벤트를 부여할 필요도 없습니다. 모달창이 켜진 상태에서 ESC 버튼을 누르면 모달창이 꺼지게 하기window.addEventListener("keyup", e => { if(modal.style.display === "flex" && e.key === "Escape") { modal.style.display = "none" } }) 모달이 켜져 있는 상태에서, 그 키가 전체 자바스크립트 코드는 다음과 같습니다. const loremIpsum = document.getElementById("lorem-ipsum") fetch("https://baconipsum.com/api/?type=all-meat¶s=200&format=html") .then(response => response.text()) .then(result => loremIpsum.innerHTML = result) const modal = document.getElementById("modal") function modalOn() { modal.style.display = "flex" } function isModalOn() { return modal.style.display === "flex" } function modalOff() { modal.style.display = "none" } const btnModal = document.getElementById("btn-modal") btnModal.addEventListener("click", e => { modalOn() }) const closeBtn = modal.querySelector(".close-area") closeBtn.addEventListener("click", e => { modalOff() }) modal.addEventListener("click", e => { const evTarget = e.target if(evTarget.classList.contains("modal-overlay")) { modalOff() } }) window.addEventListener("keyup", e => { if(isModalOn() && e.key === "Escape") { modalOff() } }) |