好的,我相信这可以满足您的要求。
您需要根据 iOS 屏幕按比例计算 div 的位置,而不是使用缩放因子。您将需要全程跟踪这一点。每当 div 被移动(未缩放)并且在开始时,您需要获取此值:
//When div moved and start
var height = window.innerHeight; //Adjust if needed
screenPos = (currentDivTop - window.pageYOffset)/height;
然后当缩放发生时,您需要将gestureEnd上的div顶部设置为屏幕上页面的顶部(即window.pageYOffset)加上屏幕上的当前像素数(window.innerHeight)乘以iOS上的相对位置我们之前计算的屏幕(screenPos)。这为您提供了所需的屏幕上的新位置(与上次不同)。
//GestureEnd of zoom
var height = window.innerHeight; //Adjust if needed
var newDivTop = window.pageYOffset + (screenPos*height);
请记住,您需要跟踪此比例值。
此外,我认为您的缩放“条带”逻辑过于简单,也就是说,如果这是为了在缩放反弹回其范围内时进行处理?我认为它没有考虑到不同的 iOS 屏幕尺寸。
除了影响 innerHeight 的“条带”之外,它似乎也影响了 posYOffset 的值,这确实很有意义。这将导致 div 被放置在页面下方。解决此问题的一种潜在方法是检测缩放何时过远(如您所指的带状)并使用轮询函数检测 innerHeight 何时回落到最小值,然后获取 posYOffset。如果在带状轮询之后存在事件,显然不需要。
您可能能够从 innerHeight 值带计算正确的屏幕顶部(posYOffset),但我认为它可能取决于缩放时手指在缩放时的位置。
同样,posYOffset 和innerHeight 的值在gestureEnd 事件之后似乎确实发生了变化,因此即使没有出现条带,您也需要一些机制来获取pageYOffset 和innerHeight 的确定值。您可以通过将以下内容添加到gestureEnd来测试此效果:
//In gestureEnd
alert ('gestureEnd pageY:'+window.pageYOffset+' height:'+height);
setTimeout(function () {
alert ('later pageY:'+window.pageYOffset+' height:'+window.innerHeight);
},
2000);