एक समाधान खोजने की कोशिश करने के बाद, जिसने हर परिस्थिति को संभाला (स्क्रॉल को एनिमेट करने का विकल्प, ऑब्जेक्ट के चारों ओर पैडिंग एक बार जब यह स्क्रॉल हो जाता है, तो एक अस्पष्ट रूप में अस्पष्ट परिस्थितियों में भी काम करता है), मैंने आखिरकार इस पर अपना समाधान लिखना शुरू कर दिया। जब से यह काम करने लगता है जब कई अन्य समाधान विफल हो गए, मैंने सोचा कि मैं इसे साझा करूंगा:
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- $ लक्ष्य के दूसरे तत्व की ओर इशारा करते हुए एक jQuery वस्तु (दूसरे शब्दों में, स्क्रॉलबार के साथ डोम में तत्व)। विंडो में डिफ़ॉल्ट जिसमें $ लक्ष्य तत्व होता है और एक iframe विंडो का चयन करने के लिए पर्याप्त स्मार्ट होता है। $ को संपत्ति के नाम में शामिल करना याद रखें।
options.padding- जब यह दृश्य में स्क्रॉल किया जाता है तो ऑब्जेक्ट के ऊपर या नीचे जोड़ने के लिए पिक्सेल में पैडिंग। इस तरह यह खिड़की के किनारे के खिलाफ सही नहीं है। 20 की कमी।
options.instant- अगर सही पर सेट किया गया है, तो jQuery के चेतन का उपयोग नहीं किया जाएगा और स्क्रॉल तुरंत सही स्थान पर पॉप होगा। झूठे की अवहेलना करता है।
options.animationOptions- कोई भी jQuery विकल्प जिसे आप jQuery के चेतन समारोह में देखना चाहते हैं ( http://api.jquery.com/animate/ देखें )। इसके साथ, आप एनीमेशन की अवधि को बदल सकते हैं या स्क्रॉल पूरा होने पर कॉलबैक फ़ंक्शन निष्पादित कर सकते हैं। यह केवल तभी काम करता है जब options.instantझूठे के लिए सेट किया गया हो। अगर आपको इंस्टेंट एनिमेशन की जरूरत है लेकिन कॉलबैक के साथ, options.animationOptions.duration = 0उपयोग करने के बजाय सेट करें options.instant = true।