わかりました、これはあなたが望むことをするだろうと私は信じています。
ズーム係数を使用する代わりに、iOS画面に比例してdivの位置を計算する必要があります。全体を通してこれを追跡する必要があります。divが移動された(ズームされていない)ときはいつでも、開始時に次の値を取得する必要があります。
//When div moved and start
var height = window.innerHeight; //Adjust if needed
screenPos = (currentDivTop - window.pageYOffset)/height;
次に、ズームが発生したときに、gestureEndのdivの上部を、画面上のページの上部(つまり、window.pageYOffset)に加えて、iOS上の相対位置による画面上の現在のピクセル数(window.innerHeight)に設定する必要があります。以前に計算した画面(screenPos)。これにより、必要な画面上の新しい位置が得られます(前回との違いではありません)。
//GestureEnd of zoom
var height = window.innerHeight; //Adjust if needed
var newDivTop = window.pageYOffset + (screenPos*height);
この比率の値を追跡する必要があることを忘れないでください。
また、ズームの「バンディング」のロジックは非常に単純だと思います。つまり、ズームがその範囲内に戻ったときに処理するためのものである場合はどうでしょうか。iOSの画面サイズの違いは考慮されていないと思います。
innerHeightに影響を与える「バンディング」だけでなく、posYOffsetの値にも影響を与えるようです。これは本当に理にかなっています。これにより、divがページの下に配置されます。これを回避する1つの潜在的な方法は、ズームが行き過ぎたとき(参照時にバンディング)を検出し、ポーリング機能を使用して、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);