webページをスマホで閲覧する際、モーダルウィンドウを開いた時に背景がスクロールできてしまうと煩わしかったりするのでそれを固定します。
ざっくり言うとJavaScript(私の場合jQuery)を使って、モーダルウィンドウを開いた時に土台の要素のスタイルを操作して固定します。
html
1 2 3 4 5 6 7 8 |
<div id="wrapper"> <p id="open-modal">モーダルウィンドウを開く</p> </div> <div id="filter-container"> <div id="modal-container"> <p id="close-modal">モーダルウィンドウを閉じる</p> </div> </div> |
土台の要素とモーダルウィンドウの要素を兄弟要素にします。
jQuery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$('#filter-container').css({'display': 'none'}); var pointY; $('#open-modal').click(function(){ pointY = $(window).scrollTop(); $('#wrapper').css({ 'position': 'fixed', 'width': '100%', 'top': -pointY }); $('#filter-container').fadeIn(250); }); $('#close-modal').click(function(){ closeModal(); }); function closeModal(){ $('#filter-container').fadeOut(250,releaseScrolling); } function releaseScrolling(){ $('#wrapper').css({ 'position': 'relative', 'width': '', 'top': '' }); $(window).scrollTop(pointY); } |
まずモーダルウィンドウを非表示にしておきます。ただ実際は開くときにJavaScript等で要素を追加したりしたほうが良いかもしれません。
id open-modalをクリックしたときに変数pointYに現在のスクロール値を代入し、土台の要素のスタイルをposition: fixed;にします。その際topの値にpointYを設定します。これで土台の要素が固定されるので、モーダルウィンドウをfadeInさせます。
閉じるときは土台の要素にposition: relative;を設定します。加えて開くときに取得したスクロール値が入っているpointYをウィンドウのスクロール値に指定します。
これを関数にしてモーダルウィンドウがfadeOutしたときに呼んでいます。
この記事をシェアする