Answers:
除非您正在开发非常旧的iOS设备,否则此答案不再适用。请参阅其他解决方案
2011年答案:对于在iOS Safari中运行的Web / html应用程序,您需要类似
document.ontouchmove = function(event){
event.preventDefault();
}
对于iOS 5,您可能需要考虑以下因素:document.ontouchmove并在iOS 5上滚动
2014年9月更新:可在以下网址找到更彻底的方法:https : //github.com/luster-io/prevent-overscroll。有关此以及大量有用的Web应用程序建议,请参阅http://www.luster.io/blog/9-29-14-mobile-web-checklist.html
2016年3月更新:该最后一个链接不再有效-请参阅https://web.archive.org/web/20151103001838/http://www.luster.io/blog/9-29-14-mobile-web-checklist .html作为存档版本。感谢@falsarella指出这一点。
onTouchMove: function(e) { e.stopPropagation(); e.stopImmediatePropagation(); }
它可以防止事件击中主体,但是主体将保持非弹性。编辑:这是假设您设置$('div')。on('touchmove',... onTouchMove);
您还可以将body / html的位置更改为fixed:
body,
html {
position: fixed;
}
为了防止在现代移动浏览器上滚动,您需要添加被动:false。我一直在努力工作,直到找到解决方案为止。我只是在互联网上的另一个地方发现了这一点。
function preventDefault(e){
e.preventDefault();
}
function disableScroll(){
document.body.addEventListener('touchmove', preventDefault, { passive: false });
}
function enableScroll(){
document.body.removeEventListener('touchmove', preventDefault);
}
{ passive: false }
它肯定是行不通的!欢迎StackOverflow上的家伙
overflow-y: scroll
怎么办?例如,具有比主体高的视图高度的模态。
您可以使用以下jQuery代码片段执行此操作:
$(document).bind(
'touchmove',
function(e) {
e.preventDefault();
}
);
这将阻止垂直滚动以及页面上发生的任何反弹效果。
overflow: scroll;
-webkit-overflow-scrolling: touch;
在容器上,您可以在元素内部设置反弹效果
资料来源:http://www.kylejlarson.com/blog/2011/fixed-elements-and-scrolling-divs-in-ios-5/
overflow:hidden
上<body>
,这仍然是最好的解决方案。但是,当打开键盘或在屏幕底部滑动时,它将不再起作用。
我知道这有点荒唐,但是我一直在使用Swiffy将Flash转换为交互式HTML5游戏,并且遇到了相同的滚动问题,但是没有找到有效的解决方案。
我遇到的问题是Swiffy阶段占用了整个屏幕,因此一旦加载,就永远不会触发文档touchmove事件。
如果我尝试将相同事件添加到Swiffy容器,则在舞台加载后立即将其替换。
最后,我通过将touchmove事件应用于舞台中的每个DIV来解决了(相当混乱)。由于这些div也在不断变化,因此我需要继续检查它们。
这是我的解决方案,似乎效果很好。我希望这对其他尝试找到与我相同的解决方案的人有所帮助。
var divInterval = setInterval(updateDivs,50);
function updateDivs(){
$("#swiffycontainer > div").bind(
'touchmove',
function(e) {
e.preventDefault();
}
);}
删除ipad Safari的代码:禁用滚动和跳动效果
document.addEventListener("touchmove", function (e) {
e.preventDefault();
}, { passive: false });
如果文档中有canvas标签,则有时会影响Canvas中对象的可用性(例如:对象的移动);因此,请添加以下代码对其进行修复。
document.getElementById("canvasId").addEventListener("touchmove", function (e) {
e.stopPropagation();
}, { passive: false });
var xStart, yStart = 0;
document.addEventListener('touchstart', function(e) {
xStart = e.touches[0].screenX;
yStart = e.touches[0].screenY;
});
document.addEventListener('touchmove', function(e) {
var xMovement = Math.abs(e.touches[0].screenX - xStart);
var yMovement = Math.abs(e.touches[0].screenY - yStart);
if((yMovement * 3) > xMovement) {
e.preventDefault();
}
});
防止默认的Safari滚动和跳动手势而不会断开您的触摸事件监听器。
这些解决方案都不适合我。这就是我的方法。
html,body {
position: fixed;
overflow: hidden;
}
.the_element_that_you_want_to_have_scrolling{
-webkit-overflow-scrolling: touch;
}
在iphone中测试过。只需在目标元素容器上使用此CSS,它将更改滚动行为,当手指离开屏幕时,滚动行为停止。
-webkit-overflow-scrolling: auto
https://developer.mozilla.org/zh-CN/docs/Web/CSS/-webkit-overflow-scrolling
您可以使用js来防止滚动:
let body = document.body;
let hideScroll = function(e) {
e.preventDefault();
};
function toggleScroll (bool) {
if (bool === true) {
body.addEventListener("touchmove", hideScroll);
} else {
body.removeEventListener("touchmove", hideScroll);
}
}
而且,toggleScroll
当您优化/关闭模态时,不只是运行/停止 功能。
像这样 toggleScroll(true) / toggleScroll(false)
(这仅适用于iOS,不适用于Android)
试试这个切换webkitOverflowScrolling
样式的JS解决方案。这里的技巧是关闭这种样式,移动Safari可以进行普通滚动并防止过度弹跳-a,它无法取消正在进行的拖动。这种复杂的解决方案还可以跟踪,因为可能会跟踪onscroll
到顶部的反弹使scrollTop
负值出现。此解决方案已在iOS 12.1.1上进行了测试,并具有一个缺点:在加速滚动时,仍会发生单个过度反弹,因为重置样式可能不会立即取消它。
function preventScrollVerticalBounceEffect(container) {
setTouchScroll(true) //!: enable before the first scroll attempt
container.addEventListener("touchstart", onTouchStart)
container.addEventListener("touchmove", onTouch, { passive: false })
container.addEventListener("touchend", onTouchEnd)
container.addEventListener("scroll", onScroll)
function isTouchScroll() {
return !!container.style.webkitOverflowScrolling
}
let prevScrollTop = 0, prevTouchY, opid = 0
function setTouchScroll(on) {
container.style.webkitOverflowScrolling = on ? "touch" : null
//Hint: auto-enabling after a small pause makes the start
// smoothly accelerated as required. After the pause the
// scroll position is settled, and there is no delta to
// make over-bounce by dragging the finger. But still,
// accelerated content makes short single over-bounce
// as acceleration may not be off instantly.
const xopid = ++opid
!on && setTimeout(() => (xopid === opid) && setTouchScroll(true), 250)
if(!on && container.scrollTop < 16)
container.scrollTop = 0
prevScrollTop = container.scrollTop
}
function isBounceOverTop() {
const dY = container.scrollTop - prevScrollTop
return dY < 0 && container.scrollTop < 16
}
function isBounceOverBottom(touchY) {
const dY = touchY - prevTouchY
//Hint: trying to bounce over the bottom, the finger moves
// up the screen, thus Y becomes smaller. We prevent this.
return dY < 0 && container.scrollHeight - 16 <=
container.scrollTop + container.offsetHeight
}
function onTouchStart(e) {
prevTouchY = e.touches[0].pageY
}
function onTouch(e) {
const touchY = e.touches[0].pageY
if(isBounceOverBottom(touchY)) {
if(isTouchScroll())
setTouchScroll(false)
e.preventDefault()
}
prevTouchY = touchY
}
function onTouchEnd() {
prevTouchY = undefined
}
function onScroll() {
if(isTouchScroll() && isBounceOverTop()) {
setTouchScroll(false)
}
}
}
改进的答案@Ben Bos并通过@Tim评论
此css将有助于防止css重渲染时的滚动和性能问题,因为位置已更改/在没有宽度和高度的情况下几乎没有滞后
body,
html {
position: fixed;
width: 100%;
height: 100%
}
禁用野生动物园跳动滚动效果:
html,
body {
height: 100%;
width: 100%;
overflow: auto;
position: fixed;
}
类似于生气的猕猴桃,我使它使用高度而不是位置来工作:
html,body {
height: 100%;
overflow: hidden;
}
.the_element_that_you_want_to_have_scrolling{
-webkit-overflow-scrolling: touch;
}
经过解决方案测试,可在iOS 12.x上运行
这是我遇到的问题:
<body> <!-- the whole body can be scroll vertically -->
<article>
<my_gallery> <!-- some picture gallery, can be scroll horizontally -->
</my_gallery>
</article>
</body>
当我滚动画廊时,身体总是在滚动(人体滑动并不是真正的水平),这使画廊毫无用处。
这是我的图库开始滚动时的操作
var html=jQuery('html');
html.css('overflow-y', 'hidden');
//above code works on mobile Chrome/Edge/Firefox
document.ontouchmove=function(e){e.preventDefault();} //Add this only for mobile Safari
当我的画廊结束滚动时...
var html=jQuery('html');
html.css('overflow-y', 'scroll');
document.ontouchmove=function(e){return true;}
希望这会有所帮助〜