[jQuery] 全画面オーバーレイをささっと後付けする方法

JavaScript

概要

webサイトを作っている途中で、「あ、ここオーバーレイ要素にしたいな」という時に、さっと後付けできる方法の備忘録。
オーバーレイした要素が画面一杯になるため、その要素のスクロールのみ許容されます。

環境

  • HTML5
  • CSS3
  • jQuery 3.3.1

コード

コードを初めに置いておきます。

HTML

<div class="overlay-wrapper">

  <!-- 任意の要素 -->

  <!-- オーバーレイを呼び出す要素 -->
  <div id="call-overlay-btn">オーバーレイを呼び出す</div>

  <!-- オーバーレイで被せる要素 -->
  <div id="overlay">
    <div class="content">
      <p>中身のテキストなど</p>
    </div>
    <div class="close-btn">
      <p>閉じる</p>
    </div>
  </div>

  <!-- 任意の要素 -->

</div>

CSS

.overlay-wrapper.active {
  width: 100%;
  min-height: 100vh;
  overflow: hidden;
}

.overlay {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  opacity: 0;
  z-index: -123;
  transition: all .2s;
}
.overlay.active{
  min-height: 100vh;
  width: 100vw;
  background-color: white;
  opacity: 1;
  z-index: 123456788;
}

javascript

$(function () {
  var scrollTop = 0;

  $('#call-overlay-btn').click(function() {
    scrollTop = $(window).scrollTop();
    $('#overlay').addClass('active');
    var w = $('#overlay').innerHeight();
    $('.overlay-wrapper').outerHeight(w);
    $('.overlay-wrapper').addClass('active');
    $("html,body").animate({scrollTop:0},"10");
  });
  $('#overlay .close-btn').click(function() {
    $('#overlay').removeClass('active');
    $('.overlay-wrapper').removeClass('active');
    $('.overlay-wrapper').css('height', 'auto').height();
    $(window).scrollTop(scrollTop);
  });

});

解説

  • bodyの直下に、その他全ての要素を包含する要素('overlay-wrapper')を追加する。
  • オーバーレイを呼び出すボタン('#call-overlay-btn')及びオーバーレイで被せる要素(#overlay)をその中に配置しておく。
  • オーバーレイを呼び出すボタン押下時にjs発火。
    • 'overlay-wrapper'に、CSSの'.active'クラスを追加する。この時、最前面に画面一杯表示する。
    • '#overlay'の高さを'overlay-wrapper'と同じにする。
    • '#overlay'に、CSSの'.active'クラスを追加する。この時、overflow:hiddenが付与されて、オーバーレイした要素のみのスクロール制御が可能になる。
  • 閉じるときは、閉じるボタン('#overlay .close-btn')押下でjs発火。
    • 'overlay-wrapper'及び'#overlay'から、CSSの'.active'クラスを取り除く。
    • これだけだと'#overlay'の高さが残ってしまうので、height: auto;に戻す。
  • 変数scrollTopは、オーバレイ呼び出し時にスクロール位置を覚えておいて、閉じた時に元に戻すために使用。

その他

  • bodyにoverflow:hiddenのcssを追加すると全く違う挙動にため注意。
  • 要素の高さは、innerHeight, outerHeight, heightなど色々あるため、適宜使い分ける。
  • classとidを併用しているが、別にどちらを使っても構わない。
タイトルとURLをコピーしました