Dans Chrome 63+, Firefox 59+ et Opera 50+, vous pouvez le faire en CSS:
body {
overscroll-behavior-y: none;
}
Cela désactive l'effet de bande élastique sur iOS montré dans la capture d'écran de la question. Cependant, il désactive également le pull-to-refresh, les effets d'éclat et le chaînage de défilement.
Vous pouvez cependant choisir d'implémenter votre propre effet ou fonctionnalité lors du défilement excessif. Si vous souhaitez par exemple flouter la page et ajouter une animation soignée:
<style>
body.refreshing #inbox {
filter: blur(1px);
touch-action: none; /* prevent scrolling */
}
body.refreshing .refresher {
transform: translate3d(0,150%,0) scale(1);
z-index: 1;
}
.refresher {
--refresh-width: 55px;
pointer-events: none;
width: var(--refresh-width);
height: var(--refresh-width);
border-radius: 50%;
position: absolute;
transition: all 300ms cubic-bezier(0,0,0.2,1);
will-change: transform, opacity;
...
}
</style>
<div class="refresher">
<div class="loading-bar"></div>
<div class="loading-bar"></div>
<div class="loading-bar"></div>
<div class="loading-bar"></div>
</div>
<section id="inbox"><!-- msgs --></section>
<script>
let _startY;
const inbox = document.querySelector('#inbox');
inbox.addEventListener('touchstart', e => {
_startY = e.touches[0].pageY;
}, {passive: true});
inbox.addEventListener('touchmove', e => {
const y = e.touches[0].pageY;
// Activate custom pull-to-refresh effects when at the top of the container
// and user is scrolling up.
if (document.scrollingElement.scrollTop === 0 && y > _startY &&
!document.body.classList.contains('refreshing')) {
// refresh inbox.
}
}, {passive: true});
</script>
Prise en charge du navigateur
Au moment d'écrire ces lignes, Chrome 63+, Firefox 59+ et Opera 50+ le prennent en charge. Edge l'a pris en charge publiquement alors que Safari est un inconnu. Suivez les progrès ici et la compatibilité actuelle du navigateur dans la documentation MDN
Plus d'information