<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>모달 테스트</title> <script> function toggle(){ let body = document.getElementsByTagName('body')[0]; body.classList.toggle("not-scroll"); popup(); } function openModal(){ let body = document.getElementsByTagName('body')[0]; let modalHtml = ` <div id="modal" class="container"> <div class="wrapModal"> <div class="modal"> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> <button onclick="openCheck()">확인</button> <button onclick="closeModal()">닫기</button> </div> </div> </div> ` body.classList.add("not-scroll"); body.insertAdjacentHTML('afterend',modalHtml); } function closeModal(){ let body = document.getElementsByTagName('body')[0]; let modal = document.getElementById('modal'); body.classList.remove("not-scroll"); modal.remove(); } function openCheck(){ let body = document.getElementsByTagName('body')[0]; let modalHtml = ` <div id="check" class="container level"> <div class="wrapModal"> <div class="modal"> 정말 실행하시겠습니까? <button onclick="closeCheck()">닫기</button> </div> </div> </div> ` body.classList.add("not-scroll"); body.insertAdjacentHTML('afterend',modalHtml); } function closeCheck(){ let check = document.getElementById('check'); check.remove(); } </script> </head> <body> <div> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> <button onclick="openModal()">모달</button> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> <button onclick="openModal()">모달</button> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> <button onclick="openModal()">모달</button> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> 본문<br> </div> </body> </html>
.not-scroll { overflow: hidden; } .container { /* relative: 상대적 위치, 내 위 엘리먼트로부터 T B L R 이라 생각하면 좋을듯 fixed: 현재 보여지는 화면으로부터 T B L R (*모바일 브라우저에서 지원이 불안정) absolute: 부모 엘리먼트로부터 T B L R, 없으면 body */ position: fixed; left: 0; right: 0; top: 0; bottom: 0; background: #8a8a8ab3; } .wrapModal { /* T B L R 은 부모로부터 기준점 transform은 내 크기로 부터 기준점 */ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; max-height: 100vh; /* 단위 em : 최상위 속성에 값을 상속받아 %단위로 비례함 1.2 -> 120% rem : em하위에 em이 중첩되면 중첩이 누적되기 때문에 root로부터 계산할 수 있도록 함(일반적으로 html태그에 붙이는듯) vh, vw : fixed 조건에서 각 높,너비를 1/100로 표현 vmin, vmax : 화면의 높,너비 값 중 min과 max */ overflow-y: scroll; } .modal { width: 300px; } .level { z-index: 2; }