मैंने हाल ही में इस समस्या को हल करने के लिए एक ऐसी स्थिति में सेट किया था जहाँ jQuery एक विकल्प नहीं था, इसलिए मैं यहाँ अपना समाधान सिर्फ पोस्टरिटी के लिए कर रहा हूँ।
var scroll = (function() {
var elementPosition = function(a) {
return function() {
return a.getBoundingClientRect().top;
};
};
var scrolling = function( elementID ) {
var el = document.getElementById( elementID ),
elPos = elementPosition( el ),
duration = 400,
increment = Math.round( Math.abs( elPos() )/40 ),
time = Math.round( duration/increment ),
prev = 0,
E;
function scroller() {
E = elPos();
if (E === prev) {
return;
} else {
prev = E;
}
increment = (E > -20 && E < 20) ? ((E > - 5 && E < 5) ? 1 : 5) : increment;
if (E > 1 || E < -1) {
if (E < 0) {
window.scrollBy( 0,-increment );
} else {
window.scrollBy( 0,increment );
}
setTimeout(scroller, time);
} else {
el.scrollTo( 0,0 );
}
}
scroller();
};
return {
To: scrolling
}
})();
scroll.To('elementID');
scroll()फ़ंक्शन का उपयोग करता खुलासा मॉड्यूल पैटर्न इसके लिए लक्ष्य तत्व की आईडी पारित करने के लिए scrolling()के माध्यम से, समारोह scroll.To('id'), जिसके द्वारा इस्तेमाल किया मूल्यों सेट scroller()समारोह।
टूट - फूट
इन scrolling():
el : लक्ष्य DOM ऑब्जेक्ट
elPos: एक फ़ंक्शन elememtPosition()देता है जिसके माध्यम से प्रत्येक बार पृष्ठ के शीर्ष पर स्थित लक्ष्य तत्व की स्थिति बताई जाती है।
duration : मिलीसेकंड में संक्रमण का समय।
increment : लक्ष्य तत्व की प्रारंभिक स्थिति को 40 चरणों में विभाजित करता है।
time : प्रत्येक चरण का समय निर्धारित करता है।
prev: लक्ष्य तत्व की पिछली स्थिति में scroller()।
E: लक्ष्य तत्व की स्थिति रखता है scroller()।
वास्तविक कार्य उस scroller()फ़ंक्शन द्वारा किया जाता है जो तब तक खुद को (के माध्यम से setTimeout()) कॉल करना जारी रखता है जब तक कि लक्ष्य तत्व पृष्ठ के शीर्ष पर नहीं होता है या पृष्ठ अधिक नहीं स्क्रॉल कर सकता है।
हर बार scroller()कहा जाता है यह लक्ष्य तत्व (चर में आयोजित की वर्तमान स्थिति की जांच करता है E) और है कि अगर है > 1या < -1और पृष्ठ अभी भी स्क्रॉल बदलाव से खिड़की है अगर incrementपिक्सल - अप या यदि आधार पर नीचे Eएक सकारात्मक या नकारात्मक मूल्य है। जब Eन तो > 1OR < -1, या E=== prevफ़ंक्शन रुक जाता है। मैंने DOMElement.scrollTo()यह सुनिश्चित करने के लिए विधि को पूरा करने पर जोड़ा कि लक्ष्य तत्व खिड़की के शीर्ष पर धमाका था (ऐसा नहीं है कि आप इसे पिक्सेल के एक अंश से बाहर होने की सूचना देंगे!)।
यह देखने के लिए कि क्या पेज स्क्रॉल कर रहा है, यह देखने के लिए ifलाइन 2 के स्टेटमेंट scroller()में (उन मामलों में जहां लक्ष्य पेज के नीचे की ओर हो सकता है और पेज Eअपनी पिछली स्थिति के खिलाफ जांच करके) और आगे नहीं स्क्रॉल कर सकता है prev)।
इसके नीचे की टर्नरी स्थिति शून्य के करीब आते ही incrementमूल्य को कम कर देती Eहै। यह पृष्ठ को एक तरह से ओवरशूट करना बंद कर देता है और फिर दूसरे को ओवरशूट करने के लिए वापस उछलता है, और फिर दूसरे पर फिर से ओवरशूट करने के लिए उछलता है, पिंग-पॉन्ग शैली, अनंत और उससे आगे।
यदि आपका पृष्ठ अधिक है जो c.4000px उच्च है, तो आप टर्नरी अभिव्यक्ति की पहली स्थिति (यहाँ +/- 20) और / या विभाजक में मान बढ़ा सकते हैं जो incrementमूल्य निर्धारित करता है (यहाँ पर 40)।
के साथ खेलना duration, विभाजक जो सेट करता है increment, और की दयनीय स्थिति में मूल्यों को scroller()आपको अपने पृष्ठ के अनुरूप कार्य करने की अनुमति देना चाहिए।