Setelah mencoba menemukan solusi yang menangani setiap keadaan (opsi untuk menghidupkan gulir, melapisi objek setelah digulirkan ke tampilan, bekerja bahkan dalam keadaan yang tidak jelas seperti dalam iframe), akhirnya saya menulis solusi sendiri untuk ini. Karena tampaknya berfungsi ketika banyak solusi lain gagal, saya pikir saya akan membagikannya:
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
adalah objek jQuery yang berisi objek yang ingin Anda gulir ke tampilan jika diperlukan.
options
(opsional) dapat berisi opsi berikut yang dilewatkan dalam suatu objek:
options.$container
- objek jQuery yang menunjuk ke elemen yang mengandung $ target (dengan kata lain, elemen dalam dom dengan scrollbar). Default ke jendela yang berisi elemen $ target dan cukup pintar untuk memilih jendela iframe. Ingatlah untuk memasukkan $ dalam nama properti.
options.padding
- bantalan dalam piksel untuk ditambahkan di atas atau di bawah objek saat digulir ke tampilan. Dengan cara ini tidak tepat di tepi jendela. Default ke 20.
options.instant
- jika disetel ke true, jQuery animate tidak akan digunakan dan gulir akan langsung muncul ke lokasi yang benar. Default ke false.
options.animationOptions
- opsi jQuery apa pun yang ingin Anda sampaikan ke fungsi animate jQuery (lihat http://api.jquery.com/animate/ ). Dengan ini, Anda dapat mengubah durasi animasi atau menjalankan fungsi panggilan balik ketika gulir selesai. Ini hanya berfungsi jika options.instant
disetel ke false. Jika Anda perlu memiliki animasi instan tetapi dengan panggilan balik, atur options.animationOptions.duration = 0
alih-alih menggunakan options.instant = true
.