以前iOSでスクロールできないようにする記事を投稿しましたが、iOS10でうまくいかないことがあったので、別の対応方法を試してみました。
サンプルコード
モーダルを表示した時だけスクロールできないようにしてみます。
HTML
<button class="modal-link" data-modaibody="modal">モーダル表示</button> <div class="modal-bg"></div> <div class="modal-contents"> <button class="modal-close">閉じる</button> <p>モーダルの中身です。</p> </div>
要素にclassを追加して表示・非表示を切り替える形ですが、CSSは今回の内容と関係ないので紹介は省略します。
JavaScript
$(function() { $('.modal-link').on('click', function() { $('.modal-bg').addClass('is-show'); $('.modal-contents').addClass('is-show'); // タッチイベントを解除 $(window).on('touchmove.is-fixed', function(e) { e.preventDefault(); }); }); $('.modal-close').on('click', function() { $('.modal-bg').removeClass('is-show'); $('.modal-contents').removeClass('is-show'); // タッチイベントを復帰 $(window).off('.is-fixed'); }); });
コメントにも書いているタッチイベントの制御部分で、モーダルを開いた時にはタッチイベントでスクロールしないように、モーダルを閉じた時に解除するようにしています。
スクロールできないようにするとき
$(window).on('touchmove.is-fixed', function(e) { e.preventDefault(); });
スクロールできるようにするとき
$(window).off('.is-fixed');
これで意図したタイミングでスクロールさせないようにすることができました。
iOSでスクロールできないようにするデモページ
コメントが承認されるまで時間がかかります。