以前よりhtml, body への overflow:hidden;
はiOS Safari(webkit)では効かないため
主にjQueryで touchmove
イベントに preventDefault();
で対応していたが
以前のコード
// スクロール無効
$(window).on('touchmove.noScroll', function(e) {
e.preventDefault();
});
// スクロール無効を解除
$(window).off('.noScroll');
iOS 11.3 Safari 11.1
及び Chrome 51
以降は addEventlistner
の第3引数に { passive: false }
を渡して対応する必要がある。
document.addEventListener('touchmove', function(e) {
e.preventDefault();
}, { passive: false });
ex
function scroll_control(e) {
e.preventDefault();
}
function no_scroll(){
document.addEventListener("touchmove", scroll_control, {passive: false});
}
function return_scroll(){
document.removeEventListener('touchmove', scroll_control, {passive: false});
}
preventDefault()
の付け外しは ex
のように関数化しないとうまくいかなかった。
また'passive' オプションに未対応ブラウザのために Polyfill
を書く必要がある。
polyfill
// Test via a getter in the options object to see if the passive property is accessed
var supportsPassive = false;
try {
var opts = Object.defineProperty({}, 'passive', {
get: function() {
supportsPassive = true;
}
});
window.addEventListener("testPassive", null, opts);
window.removeEventListener("testPassive", null, opts);
} catch (e) {}
// Use our detect's results. passive applied if supported, capture will be false either way.
elem.addEventListener('touchstart', fn, supportsPassive ? { passive: true } : false);
※ elem
fn
の箇所と { passive: true }
を適宜変更して使用
Browser
- webkit
- chrome
対応方法の参考リンク
- スクロール禁止が
overflow:hidden
やpreventDefault();
でできないときの対処法 - マウスによるスクロールやスマホのスワイプを制御するjs(passive: false)
- Not working with iOS 11.3 Mobile Safari
- Can't prevent
touchmove
from scrolling window on iOS
Passive Event Listenersについての参考リンク
- Passive event listeners
- Passive Event Listeners によるスクロールの改善
- Passive Event Listenersのミニマムpolyfillを書いた。
- addEventListener の第3引数が拡張されてるという話