실무에 바로 적용할 수 있는 웹 제작 꿀팁 및 유용한 자료실 공간입니다.
나눔웹이 제공하는 핵심 노하우와 마케팅 인사이트를 자유롭게 활용해 보십시오.

나눔웹 퍼블리싱 꿀팁

모달 팝업 만들기, dialog 태그로 ESC 닫기와 배경 클릭 닫기까지 처리하는 법

모달 팝업은 이제 div를 겹겹이 쌓지 않고 HTML의 <dialog> 태그와 showModal()만으로 만들 수 있습니다.
ESC 키로 닫기, 다른 요소 위로 띄우기, 뒤쪽 화면 클릭 막기가 기본으로 들어 있어서, 직접 짜던 코드의 절반 이상이 필요 없어집니다.

💡 기존 div 팝업은 뭐가 문제였나요?

유지보수 의뢰로 들어오는 사이트를 열어 보면 팝업이 헤더 밑에 깔리거나, 팝업이 떠 있는데도 Tab 키를 누르면 뒤쪽 메뉴로 초점이 넘어가는 경우가 흔합니다. z-index 숫자를 계속 올리고, 키보드 처리를 따로 붙이다 보니 생기는 문제입니다. showModal()로 연 dialog는 브라우저가 맨 위 층(top layer)에 따로 그려 주고, 뒤쪽 화면은 클릭도 초점 이동도 되지 않게 막아 줍니다.

1. 기본 구조: 여는 버튼과 dialog

dialog는 처음에는 숨겨져 있다가 showModal()을 부르면 뜹니다. 안쪽에 method="dialog"인 form을 두면 그 안의 버튼을 누르는 것만으로 닫히기 때문에, 닫기 버튼에는 따로 스크립트를 달 필요가 없습니다.

<button type="button" id="openNotice">공지 보기</button>

<dialog id="notice">
  <h2>연말 배송 안내</h2>
  <p>연말 기간 주문은 순차 발송됩니다.</p>
  <form method="dialog">
    <button>닫기</button>
  </form>
</dialog>

// 열기
const notice = document.getElementById('notice');
document.getElementById('openNotice')
  .addEventListener('click', () => notice.showModal());

여기까지만 해도 ESC 키를 누르면 닫히고, 열리는 순간 초점이 팝업 안으로 들어가며, 닫히면 원래 누른 버튼으로 초점이 돌아옵니다. show()로 열면 모달이 아닌 일반 창이 되어 이런 처리가 빠지니, 팝업 용도라면 꼭 showModal()을 쓰세요.

2. 배경 어둡게, 배경 클릭으로 닫기

뒤쪽 어두운 막은 ::backdrop으로 꾸밉니다. 배경을 눌러 닫는 기능은 기본으로 들어 있지 않아서 몇 줄을 더해야 합니다. 배경을 누르면 클릭 대상이 dialog 자신으로 잡히는 점을 이용하는데, 이때 dialog의 padding을 0으로 두고 안쪽 여백은 내부 div에 주어야 팝업 가장자리를 눌렀을 때 닫히는 일이 없습니다.

dialog { padding: 0; border: 0; border-radius: 12px;
         max-width: min(90vw, 480px); }
dialog > .inner { padding: 24px; }
dialog::backdrop { background: rgba(0, 0, 0, .5); }

/* 팝업이 떠 있는 동안 뒤쪽 스크롤 고정 */
body:has(dialog[open]) { overflow: hidden; }

// 배경(dialog 바깥 영역) 클릭 시 닫기
notice.addEventListener('click', (e) => {
  if (e.target === notice) notice.close();
});

3. 적용 전에 확인할 것

  • dialog의 모달 기능은 아이폰 사파리 15.4부터 지원합니다. 그보다 오래된 기기 비중이 높은 사이트라면 기존 방식을 유지하는 편이 안전합니다.
  • :has()는 비교적 최근 문법이라, 오래된 브라우저에서는 뒤쪽 스크롤만 고정되지 않을 뿐 팝업 자체는 정상 동작합니다.
  • "오늘 하루 보지 않기"처럼 자동으로 뜨는 팝업도 같은 구조로 만들고, 쿠키나 localStorage 값을 확인한 뒤 showModal()을 부르면 됩니다.

"브라우저가 이미 해 주는 일은 브라우저에 맡기는 것이 가장 튼튼한 코드입니다."

나눔웹은 리뉴얼 때 오래된 팝업 스크립트를 걷어내고
키보드와 모바일에서도 자연스럽게 닫히는 팝업으로 정리해 드립니다.


List of Articles
번호 분류 제목 글쓴이
60 웹 성능 홈페이지 로딩 속도를 3배 높이는 '이미지 최적화' 실무 가이드 나눔웹
59 퍼블리싱 CSS 변수로 유지보수와 테마 기능을 한 번에! (CSS Custom Properties) 나눔웹
58 마케팅 카카오톡 링크 썸네일의 비밀! 클릭률을 높이는 '오픈 그래프(OG)' 세팅법 나눔웹
57 모바일 모바일 꽉 찬 화면 하단 짤림 현상! '100vh'의 함정과 완벽 해결법 나눔웹
56 웹 성능 홈페이지 첫 화면 글자 깜빡임(투명 현상) 1초 만에 해결하는 법 나눔웹
55 퍼블리싱 스마트폰에서 로고가 흐리게 보인다고요? 'SVG' 포맷이 정답입니다. 나눔웹
54 웹 성능 클릭 실수 유발하는 '화면 덜컹거림(CLS)', 단 한 줄로 해결하는 법 나눔웹
53 모바일 고객의 이탈을 막는 1초 디테일, '모바일 맞춤형 키보드' 세팅법 나눔웹
52 UI/UX 모바일에서 버튼 누를 때 생기는 촌스러운 '회색 박스' 없애는 법 나눔웹
51 UI/UX 레이아웃을 망치는 긴 글, 예쁘게 '...'으로 자르는 마법의 CSS 나눔웹
50 UI/UX 상단 메뉴에 제목이 가려진다고요? '부드러운 스크롤' 마법의 2줄 나눔웹
49 모바일 아이폰에서 입력창 누를 때 화면 '자동 확대'되는 현상 막는 법 나눔웹
48 퍼블리싱 지저분한 모바일 스크롤바, 기능은 남기고 쏙 숨기는 마법의 CSS 나눔웹
47 모바일 모바일 웹을 진짜 '앱(App)'처럼! 이미지 꾹 누를 때 뜨는 팝업 막기 나눔웹
46 UI/UX 애플(Apple) 사이트처럼 고급스러운 '반투명 유리' 메뉴 만드는 법 나눔웹
45 퍼블리싱 무거운 플러그인 NO! 넷플릭스처럼 쫀득한 '가로 스와이프' CSS로 뚝딱 만들기 나눔웹
44 UI/UX 1%의 디테일이 브랜딩을 완성합니다! '텍스트 드래그 색상' 바꾸기 나눔웹
43 UI/UX 투박한 파란색 체크박스는 그만! 단 1줄로 우리 회사 컬러 입히기 나눔웹
42 모바일 하단 고정 버튼이 아이폰 '검은 줄'에 겹친다면? (Safe Area 대응법) 나눔웹
41 모바일 앗, 실수로 새로고침! 튕기는 모바일 화면 꽉 잡는 법 (Overscroll) 나눔웹
Board Pagination Prev 1 2 3 Next
/ 3
rhwlsghkcocndgus XE2.1.39 STAGE1.5.4