スマホサイトでローディング画面を表示させる機会があったのですが、position: fixed;で画面全体に要素を表示させていた時にスクロールすると下部に隙間ができてしまうことがあったので、対応した方法をメモしておきます。
対応前
対応前に行っていた実装です。
HTML
<div class="loading_box"> <p>ローディング</p> <button class="close">閉じる</button> </div>
CSS
.loading_box { position: fixed; top: 0; left: 0; width: 100%; height: 100%; text-align: center; background: #666666; }
JavaScript
$(function() { $('.close').on('click', function() { $('.loading_box').hide(); }); });
ローディングが出ている状態で下にスクロールすると、アドレスバーやツールバーが非表示になった分?下部に隙間ができていました。
対応前のデモページ
対応方法
最初に試してみてうまくいかなかった方法です。
JavaScript
$(function() { $('html,body').css({ 'overflow': 'hidden' }); $('.close').on('click', function() { $('.loading_box').hide(); $('html,body').removeAttr('style'); }); });
htmlとbodyにoverflow: hidden;を指定すればスクロールできなくなるかと思いましたが、うまくいきませんでした。
うまくいかなかった場合のデモページ
最終的に、touchmoveイベントを使ってスクロールをキャンセルさせるようにしました。
JavaScript
$(function() { $(window).on('touchmove.noScroll', function(e) { e.preventDefault(); }); $('.close').on('click', function() { $('.loading_box').hide(); $(window).off('.noScroll'); }); });
【参考サイト】
コメントが承認されるまで時間がかかります。