すべての状況を処理するソリューション(スクロールをアニメーション化するオプション、オブジェクトがスクロールして表示されるとオブジェクトの周囲をパディングするオプション、iframeなどのあいまいな状況でも機能する)を見つけた後、最終的にこれに独自のソリューションを記述しました。他の多くの解決策が失敗したときに機能するように見えるので、私はそれを共有したいと思いました:
function scrollIntoViewIfNeeded($target, options) {
var options = options ? options : {},
$win = $($target[0].ownerDocument.defaultView), //get the window object of the $target, don't use "window" because the element could possibly be in a different iframe than the one calling the function
$container = options.$container ? options.$container : $win,
padding = options.padding ? options.padding : 20,
elemTop = $target.offset().top,
elemHeight = $target.outerHeight(),
containerTop = $container.scrollTop(),
//Everything past this point is used only to get the container's visible height, which is needed to do this accurately
containerHeight = $container.outerHeight(),
winTop = $win.scrollTop(),
winBot = winTop + $win.height(),
containerVisibleTop = containerTop < winTop ? winTop : containerTop,
containerVisibleBottom = containerTop + containerHeight > winBot ? winBot : containerTop + containerHeight,
containerVisibleHeight = containerVisibleBottom - containerVisibleTop;
if (elemTop < containerTop) {
//scroll up
if (options.instant) {
$container.scrollTop(elemTop - padding);
} else {
$container.animate({scrollTop: elemTop - padding}, options.animationOptions);
}
} else if (elemTop + elemHeight > containerTop + containerVisibleHeight) {
//scroll down
if (options.instant) {
$container.scrollTop(elemTop + elemHeight - containerVisibleHeight + padding);
} else {
$container.animate({scrollTop: elemTop + elemHeight - containerVisibleHeight + padding}, options.animationOptions);
}
}
}
$target
必要に応じてスクロールして表示したいオブジェクトを含むjQueryオブジェクトです。
options
(オプション)オブジェクトに渡される次のオプションを含めることができます。
options.$container
-$ targetを含む要素を指すjQueryオブジェクト(つまり、スクロールバーを備えたdom内の要素)。デフォルトは、$ target要素を含み、iframeウィンドウを選択するのに十分スマートなウィンドウです。プロパティ名に$を含めることを忘れないでください。
options.padding
-オブジェクトがスクロールされて表示されるときに、オブジェクトの上または下に追加するピクセル単位のパディング。この方法では、ウィンドウの端に対して正しくありません。デフォルトは20です。
options.instant
-trueに設定すると、jQuery animateは使用されず、スクロールがすぐに正しい場所に表示されます。デフォルトはfalseです。
options.animationOptions
-jQueryアニメーション関数に渡したいjQueryオプション(http://api.jquery.com/animate/を参照)。これにより、アニメーションの継続時間を変更したり、スクロールが完了したときにコールバック関数を実行したりできます。これoptions.instant
は、がfalseに設定されている場合にのみ機能します。インスタントアニメーションが必要だがコールバックがある場合は、options.animationOptions.duration = 0
を使用する代わりにを設定しoptions.instant = true
ます。