Reputation: 1041
I want to prevent pull-down-to-refresh of mobile chrome(especially iOS chrome). My web application has vertical panning event with device-width and device-height viewport, but whenever panning down, mobile chrome refreshes itself because of browser's default function. Plus, on Safari browser, screen is rolling during panning event. I want to disable these moves.
Of course, I tried event.preventDefault(); and touch-action: none; But it doesn't look work. Should I add eventListner and touch-action "on body tag"? I expect useful answer with example.
Upvotes: 57
Views: 49405
Reputation: 313
a few years late to this one but this works
<style>
html {
overflow: hidden;
overscroll-behavior: none;
}
</style>
Peace,
Upvotes: 0
Reputation: 8079
For iOS I did the following for a single html page which expands to the size of the viewport. This solution doesn't allow any scrolling at all (which may not suit everyone, but worked well for me).
html, body {
width: 100%;
height: 100%;
}
body {
overflow: hidden;
}
Upvotes: 4
Reputation: 2399
Scroll behavior none works for me like this.
body {
overscroll-behavior: none
}
Upvotes: 10
Reputation: 1223
For latest versions of Chrome:
html,
body {
overscroll-behavior-y: contain;
}
Old solution:
Since mobile Chrome >= 56 event listeners are passive by default and passive event listeners can't prevent defaults anymore. See here You have to use active event listeners instead like so:
document.addEventListener('touchstart', touchstartHandler, {passive: false});
document.addEventListener('touchmove', touchmoveHandler, {passive: false});
Upvotes: 62
Reputation: 976
The css-only answers posted here did not work for me. I ended up doing the following:
(function() {
var touchStartHandler,
touchMoveHandler,
touchPoint;
// Only needed for touch events on chrome.
if ((window.chrome || navigator.userAgent.match("CriOS"))
&& "ontouchstart" in document.documentElement) {
touchStartHandler = function() {
// Only need to handle single-touch cases
touchPoint = event.touches.length === 1 ? event.touches[0].clientY : null;
};
touchMoveHandler = function(event) {
var newTouchPoint;
// Only need to handle single-touch cases
if (event.touches.length !== 1) {
touchPoint = null;
return;
}
// We only need to defaultPrevent when scrolling up
newTouchPoint = event.touches[0].clientY;
if (newTouchPoint > touchPoint) {
event.preventDefault();
}
touchPoint = newTouchPoint;
};
document.addEventListener("touchstart", touchStartHandler, {
passive: false
});
document.addEventListener("touchmove", touchMoveHandler, {
passive: false
});
}
})();
Upvotes: 6
Reputation: 713
Try this.
body {
/* Disables pull-to-refresh but allows overscroll glow effects. */
overscroll-behavior-y: contain;
}
It worked well for me. I had weird scrolling issues due to other javascript hacks. Read this article for more details.
https://developers.google.com/web/updates/2017/11/overscroll-behavior
Upvotes: 18