모달창 만들기

위정우·2022년 8월 8일
0
post-custom-banner

위코드의 2주차 과제로 만든 자기소개 페이지에 새로운 기능을 추가하려 한다.
나의 sns같은 네트워크 서비스의 아이디를 표시하기 위한 Contact 모달창을 띄우는 것이 목표다.
팝업창과 모달창 두가지가 있는데 팝업창은 현재 페이지에서 새로운 웹 페이지를 띄우는 것이고
모달창은 현재 페이지에서 다른 레이어의 공간을 띄우는것이다.
팝업창은 다른 웹 페이지로 이동해도 그대로 유지되나 모달창은 다른 웹 페이지로 이동한다면 같이 닫히게 된다.

다음은 모달창을 만들기 위한 HTML과 Script 코드이다.

<div class="modal">
	<div class="modal_body"><h1>Contact</h1>
		<P><strong>KakaoTalk</strong>: wi4020</P>
		<p><strong>Mail</strong>: wirush4020@gmail.com</p>
		<p><strong>Discord</strong>: 달봉애비#0948</p>
		<p>(달봉은 키우는 고양이 입니다^^;)</p>
	</div>
</div>
<button class="btn-open-popup">Contact</button>   
<script>
	const body = document.querySelector('body');
	const modal = document.querySelector('.modal');
	const btnOpenPopup = document.querySelector('.btn-open-popup');

	btnOpenPopup.addEventListener('click', () => {
		modal.classList.toggle('show');

		if (modal.classList.contains('show')) {
			body.style.overflow = 'hidden';
		}
	});

	modal.addEventListener('click', (event) => {
		if (event.target === modal) {
			modal.classList.toggle('show');

			if (!modal.classList.contains('show')) {
				body.style.overflow = 'auto';
			}
 		}
	});
</script>

인터넷에서 참조한 코드라 대부분 활용하면서 원리들을 살펴볼 필요가 있었다.

기초적인 코드들을 지나고 보면 낯선 코드가 눈에 띈다.
바로 querySelector()이다. 먼저 이것에 대해 알아볼 필요가 있을 것 같다.

element = document.querySelector(selectors);

selector의 구체적인 그룹과 일치하는 document안 첫번째 엘리먼트를 반환한다. 일치하는게 없으면 null반환한다.

사실 위 설명부터 무슨 소린지 이해하기가 어렵다;;
먼저 document.querySelector('body') 는 body태그를 선택한 것이고,
document.querySelector('.modal') 는 클래스가 modal인 요소를 선택한 것이다.

다음으로는 addEventListener 가 보인다.
이 메서드는 이름에서부터 추측이 가능하다. 보이는대로 이벤트를 등록하는 메서드이다.

toggle 메서드는 스위치처럼 on / off 기능을 한 줄로 구현할 수 있다.

다음은 CSS 코드이다.

.modal {
    position: absolute;
    top: 0;
    left: 0;
  
    width: 100%;
    height: 100%;
  
    display: none;
  
    background-color: rgba(0, 0, 0, 0.4);
    mix-blend-mode: normal;
  }
  
  .modal.show {
    display: block;
  }
  
  .modal_body {
    position: absolute;
    top: 50%;
    left: 50%;
  
    width: 400px;
    height: 600px;
  
    padding: 40px;
  
    text-align: center;
    font-size: 22px;
  
    background-color: #d6cfc7;
    border-radius: 10px;
    box-shadow: 0 2px 3px 0 rgba(34, 36, 38, 1);
  
    transform: translateX(-50%) translateY(-50%);
    z-index: 2;
  }

여기서 중요한 것은 z-index로 레이어 순위를 지정해야 모달창의 요소들이 아래의 레이어와 겹치지 않고 표시가 된다.

결과물은 다음과 같다.

profile
열심히 하자!
post-custom-banner

0개의 댓글