概要
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を併用しているが、別にどちらを使っても構わない。