Her durumu ele alan bir çözüm bulmaya çalıştıktan sonra (kaydırmayı canlandırma seçenekleri, görünüme kaydırıldığında nesnenin etrafında dolgu, iframe gibi belirsiz durumlarda bile çalışır), sonunda buna kendi çözümümü yazdım. Diğer birçok çözüm başarısız olduğunda işe yaradığından, paylaşacağımı düşündüm:
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 gerekiyorsa görünüme kaydırmak istediğiniz nesneyi içeren bir jQuery nesnesidir.
options (isteğe bağlı) bir nesneye iletilen aşağıdaki seçenekleri içerebilir:
options.$container- $ target içeren öğeyi işaret eden bir jQuery nesnesi (başka bir deyişle, dom'daki kaydırma çubuklarına sahip öğe). Varsayılan olarak $ target öğesini içeren ve bir iframe penceresi seçecek kadar akıllı penceredir. Mülk adına $ eklemeyi unutmayın.
options.padding- görünüme kaydırıldığında nesnenin üstüne veya altına eklemek için piksel cinsinden dolgu. Bu şekilde pencerenin kenarına doğru değil. Varsayılan değer 20'dir.
options.instant- true olarak ayarlanırsa, jQuery animate kullanılmaz ve kaydırma anında doğru konuma açılır. Varsayılanı false değerindedir.
options.animationOptions- jQuery animate işlevine iletmek istediğiniz tüm jQuery seçenekleri (bkz. http://api.jquery.com/animate/ ). Bununla, animasyonun süresini değiştirebilir veya kaydırma tamamlandığında bir geri arama işlevinin yürütülmesini sağlayabilirsiniz. Bu yalnızca options.instantfalse olarak ayarlandığında çalışır . Anında animasyona sahip olmanız ancak geri arama ile options.animationOptions.duration = 0kullanmanız gerekiyorsa, kullanmak yerine ayarlayın options.instant = true.