모달창 만들기

위정우·2022년 8월 8일
0

위코드의 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
열심히 하자!

0개의 댓글