jQuery)쿠키를 사용하여 하루만 뜨는 모달창 만들기 + 로딩 시 첫 화면 스크롤 막기

2022. 5. 23. 12:04jQuery

HTML

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>

jQuery Cookie라는 기능을 이용하여 하루만 혹은 기간을 정하여 모달창을 띄울 수 있다.

jQuery기능을 기본적으로 사용하기에 jQuery도 로드해야 한다.

<body onload="noScroll();">
   <section id="popup" class="popup_js">
    <div class="event">
      <div>
        <a href="javascript:;" class="btnTodayHide_js">오늘 그만 보기</a>
        <a href="javascript:;" class="btnClose_js"><img src="./image/main_popEvent_close.png" alt="팝업닫기"></a>
      </div>
      <a href="#"><img src="./oneday.png" alt="하루만보기"></a>
    </div>
  </section>
</body>

원하는 모달을 마크업 한다.

구현하고자 하는 기능은 화면이 처음 로딩됐을 때 모달이 뜨며 스크롤이 안돼게 고정시키는 것(클릭 등은 모달의 반투명 배경으로 자연스럽게 막힘)

body영역에 스크롤을 막을 함수를 onload를 사용하여 불러와준다.

클릭(a링크)했을 때 상단으로 올라가지 않도록 javascript:; 입력

onload 참고페이지

https://itworldyo.tistory.com/101

href="" 참고 페이지

https://minimal-dev.tistory.com/28

 

a href="#", void(0) 의 의미 차이점

⚓ #, javascript:, void(0); 차이점 이 글은 anchor tag의 href 속성만 다룹니다. 링크로 이동시켜주는 앵커태그의 href 속성은 작성된 value값으로 이동시켜주는 HTML태그입니다. 간단하게 속성 살펴보기 URL

minimal-dev.tistory.com

CSS

#popup {
  display: none;
}

매번 뜨는 모달창이라면 모달 영역을 항상 띄우겠지만 하루만 띄우는 등의 조건을 줄 경우 스크립트로 출력유무를 제어하기 때문에 display:none;을 부여함.

JS

const $popup = document.querySelector('.popup_js');
const $btnPopClose = document.querySelector('#popup .btnClose_js');
const $btnPopupTodayHide = document.querySelector('#popup .btnTodayHide_js');
const $body = document.querySelector('body');

// 최초 팝업 노출 (oneDay라는 이름의 쿠키가 존재하지 않으면 팝업 노출)
if (!$.cookie('oneDay')) {
  layerPopupShow();
}

// 팝업 닫기버튼
$btnPopClose.addEventListener('click', function () {
  layerPopupHide(0);
});

// 팝업 오늘 그만 보기 버튼
$btnPopupTodayHide.addEventListener('click', function () {
  layerPopupHide(1);
});

// 팝업노출, 스크롤 막기 함수
function layerPopupShow() {
  $popup.style.display = 'block';
  $body.style.overflow = 'hidden';
}

// 팝업 비노출 함수
function layerPopupHide(state) {
  // 닫기, 오늘그만보기 버튼 무관하게 일단 닫고 body의 스크롤 막힘을 제거.
  $popup.style.display = 'none';
  $body.style.overflow = 'auto';
  // 오늘그만보기 버튼을 누른 경우
  if (state === 1) {
    // oneDay라는 이름의 쿠키가 있는지 체크
    if ($.cookie('oneDay') == undefined) {
      // 쿠키가 없는 경우 oneDay쿠키를 추가하고 값에 임의로 Y라는 값을 넣어줌
      $.cookie('oneDay', 'Y', {
        // 쿠키 유지 시간(즉, 팝업이 안보길 기간 설정. 이 기간이 지나면 쿠키가 삭제됨)
        expires: 1,
        // 전체사이트 적용 (특정 페이지만 적용 시 해당 페이지 경로 작성)
        path: '/'
      });
    }
  }
}

oneDay, Y 등 쿠키의 이름과 값은 다른 값을 넣어도 된다

 

혹시라도 맨 처음부터 body의 스크롤을 막고싶다면 아래의 방법을 사용하면 된다

<body onload="noScroll();">
  <div>내용</div>
</body>

<script>
  function noScroll(){
    $('body').css({"overflow":"hidden"});
  }
</script>

 

스크롤 막기 참고 사이트

https://aboooks.tistory.com/84

 

참고사이트

https://code-study.tistory.com/34