ルークの回答のコメントの1つで、最後にどこにいたかを覚えておく必要があると述べたように、これを再評価しました。
現在の場所を追跡し、サイズ変更後にそこに戻る必要があります。
次のようなコードを使用します。
var lastPosition = "middle";
var $body = $('html, body');
window.scrollTo(($(document).width() - $(window).width()) / 2, 0);
$('#go_left').click(function() {
$body.scrollTo('0px', 800);
lastPosition = "left";
});
$('#go_right').click(function() {
$body.scrollTo('100%', 800);
lastPosition = "right";
});
$('#left_link').click(function() {
$body.scrollTo('50%', 800);
lastPosition = "middle";
});
$('#right_link').click(function() {
$('html, body').scrollTo('50%', 800);
lastPosition = "middle";
});
$(window).off('resize.menu').on('resize.menu', function() {
switch(lastPosition)
{
case "left":
$body.scrollTo('0px', 0);
break;
case "middle":
$body.scrollTo('50%', 0);
break;
case "right":
$body.scrollTo('100%', 0);
break;
}
})
デモを見る
また、 body 要素をキャッシュしたので、スクロール時に常に再トラバースする必要はありませんが、パフォーマンスはほとんど向上しません。
前と同じように、ページを離れるときは忘れずにイベントのバインドを解除してください。そうしないと、メモリ リークが発生する可能性があります。
私はまだ遅れている再配置を取り除くことができていませんが、それは後で取り組むべきことです.
編集
最後に、サイズ変更時のラグ/ちらつきを最小限に抑える方法を見つけました。
代わりにサイズ変更メソッドで使用scrollLeft()
すると、完璧/完璧ではなく、はるかにうまく機能します。
$(window).off('resize.menu').on('resize.menu', function() {
var elementToScrollTo = "div#main";
switch(lastPosition)
{
case "left":
elementToScrollTo = "div#left";
break;
case "middle":
elementToScrollTo = "div#main";
break;
case "right":
elementToScrollTo = "div#right";
break;
}
$(window).scrollLeft($(elementToScrollTo).position().left);
})
更新されたデモ