2012-06-10 43 views
26

मैं उपयोगकर्ता को सामग्री ब्लॉक हमेशा दिखाया जा रहा हूं, भले ही वह पृष्ठ को नीचे स्क्रॉल करता हो। उसे सामग्री ब्लॉक को ऊपर और नीचे स्क्रॉल करने में भी सक्षम होना चाहिए। यहाँ आप को दिखाने के लिए मैं क्या मतलब है एक नीचे छीन संस्करण के साथ एक बेला है: जब नीचे स्क्रॉल, लाल ब्लॉक के नीचे तक पहुंच गया जब तकक्रोम और आईई पर चॉपी/लैगी स्क्रॉल इवेंट

http://jsfiddle.net/9ehfV/2/

एक नोटिस देना चाहिए, यह खिड़की पर ब्लॉक ठीक कर देंगे, और जब बैक अप स्क्रॉल करते हैं, तो यह इसे वापस रखता है।

फ़ायरफ़ॉक्स में कोई ऊपर और नीचे स्क्रॉल कर सकता है और उपरोक्त वर्णित फिक्सिंग/unfixing अव्यवस्थित है - रेशम के रूप में चिकनी।

एक बार जब कोई क्रोम या आईई में स्क्रॉल करने का प्रयास करता है, तो ऐसा लगता है कि स्क्रॉल ईवेंट की तरह लग रहा है और कोई एक सेकंड के लिए ब्लॉक "गड़बड़ाना" देख सकता है। यह कोड अंतराल नहीं है - ऐसा लगता है कि ब्राउज़र के साथ कुछ ऐसा लगता है।

तो इसे ठीक करने कोई तरीका है? मेरा विवेक खत्म हो रहा है।

मुझे लगता है मैं एक अलग तरीके से एक ही प्रभाव कैसे प्राप्त कर सकते हैं पर सुझाव की सराहना करेंगे ... धन्यवाद

+0

मैं इसे और अधिक कुछ कैसे फ़ायरफ़ॉक्स स्क्रॉल आसान है और कैसे छिपकली/राइनो आग/पुस्तक घटना की व्याख्या किसी और चीज से अन्य ब्राउज़र से अलग ढंग से, तो यह होगा के साथ क्या करना है लगता था शायद 'स्क्रॉल' श्रोता दृष्टिकोण का उपयोग करके अभी भी ठीक करने के लिए कुछ कठिन हो, और मुझे कोई अन्य संभावित दृष्टिकोण नहीं दिखाई देता है, लेकिन भाग्यशाली व्यक्ति का सबसे अच्छा। –

उत्तर

42

के बाद से जावास्क्रिप्ट यूआई के रूप में ही धागे में चलता है, एक स्क्रॉल घटना कॉलबैक यूआई ब्लॉक कर सकते हैं:

jQuery स्क्रोलर प्लगइन्स के लिए उदाहरण थ्रेड और इस प्रकार अंतराल का कारण बनता है। आपको स्क्रॉल इवेंट श्रोता को थ्रॉटल करना होगा क्योंकि कुछ ब्राउज़र उनमें से बहुत से आग लगते हैं। विशेष रूप से यदि आप एक एनालॉग स्क्रॉल डिवाइस के साथ ओएस एक्स पर हैं। चूंकि आप अपने श्रोता में बहुत अधिक ऊंचाई गणना करते हैं, इसलिए निकाल दिए गए प्रत्येक स्क्रॉल ईवेंट के लिए it will trigger a reflow (बहुत महंगा)।

श्रोता को थ्रॉटल करने के लिए, आपको श्रोता को हर बार फायरिंग से रोकना होगा। आमतौर पर आप प्रतीक्षा करते हैं जब तक कि ब्राउज़र x मिलीसेकंड के लिए कोई ईवेंट ट्रिगर नहीं करता है, या आपके कॉलबैक को कॉल करने के बीच न्यूनतम समय होता है। प्रभाव देखने के लिए मूल्य समायोजित करने का प्रयास करें। यहां तक ​​कि 0 मिलीसेकंड भी मदद कर सकते हैं, क्योंकि ब्राउज़र में समय होने पर कॉलबैक के निष्पादन में देरी होगी (आमतौर पर 5-40 एमएस)।

जावास्क्रिप्ट में हार्ड-कोडिंग के बजाय राज्यों (स्थिर और निश्चित स्थिति) के बीच स्विच करने के लिए कक्षा को टॉगल करना भी एक अच्छा अभ्यास है। फिर आपके पास चिंताओं का क्लीनर अलगाव और avoid potential extra redraws by mistake है (देखें "ब्राउज़र स्मार्ट हैं" अनुभाग देखें)।(example on jsfiddle) x एमएस के एक ठहराव

// return a throttled function 
function waitForPause(ms, callback) { 
    var timer; 

    return function() { 
     var self = this, args = arguments; 
     clearTimeout(timer); 
     timer = setTimeout(function() { 
      callback.apply(self, args); 
     }, ms); 
    }; 
} 

this.start = function() { 
    // wrap around your callback 
    $window.scroll(waitForPause(30, self.worker)); 
}; 

प्रतीक्षा में कम से कम एक्स एमएस (jsfiddle)

function throttle(ms, callback) { 
    var timer, lastCall=0; 

    return function() { 
     var now = new Date().getTime(), 
      diff = now - lastCall; 
     console.log(diff, now, lastCall); 
     if (diff >= ms) { 
      console.log("Call callback!"); 
      lastCall = now; 
      callback.apply(this, arguments); 
     } 
    }; 
} 

this.start = function() { 
    // wrap around your callback 
    $window.scroll(throttle(30, self.worker)); 
}; 

jQuery वेपाइंट आप कर रहे हैं के बाद से के लिए

प्रतीक्षा पहले से ही jQuery का उपयोग कर, मैंपर एक नज़र डालेगाप्लगइन जिसमें आपकी समस्या का एक सरल और सुरुचिपूर्ण समाधान है। जब उपयोगकर्ता किसी निश्चित तरीके से स्क्रॉल करता है तो बस कॉलबैक को परिभाषित करें।

उदाहरण: (jsfiddle)

$(document).ready(function() { 
    // throttling is built in, just define ms 
    $.waypoints.settings.scrollThrottle = 30; 

    $('#content').waypoint(function(event, direction) { 
     $(this).toggleClass('sticky', direction === "down"); 
     event.stopPropagation(); 
    }, { 
     offset: 'bottom-in-view' // checkpoint at bottom of #content 
    }); 
}); 
+0

मैं समझता हूं कि आप कहां से आ रहे हैं। लेकिन क्या आप मुझे एक jsfiddle दिखा सकते हैं जो मेरे जैसा ही कार्यक्षमता रखेगा, लेकिन आपके द्वारा वर्णित फायदे प्रदान करेगा? –

+0

मुझे समझ में नहीं आता कि आप किस विशिष्ट कार्यक्षमता का जिक्र कर रहे हैं। क्या आप क्लास-टॉगलिंग और थ्रॉटलिंग के साथ अपना कोड चाहते हैं? – gregers

+2

ओह, मैं देखता हूं। स्क्रॉल-लॉजिक पहले की तुलना में थोड़ा अधिक जटिल था। सोचें कि निश्चित पदों के बीच कुछ गणना करना जरूरी है, लेकिन निश्चित स्थिति के लिए कक्षाएं सरल होंगी। यहां अपडेट किया गया jsfiddle: http://jsfiddle.net/b5hU8/4/ – gregers

1

आप स्क्रॉलबार के लिए कुछ jQuery प्लगइन की कोशिश की या नीचे स्क्रॉल करें और अप करने के लिए एनीमेशन का उपयोग करता है? यह सभी ब्राउज़रों को उसी तरह काम करने के लिए मजबूर करेगा (या एनोट बंद करता है) ..

क्या होता है कि फ़ायरफ़ॉक्स (कम से कम v12) में "मूल" स्क्रॉल एनीमेशन होता है। जब आप किसी भी यूआरएल के लिए नेविगेट करते हैं तो आप स्क्रॉल क्रियाओं के लिए चिकनीता देख सकते हैं और यह क्रोम या आईई जैसे अन्य ब्राउज़रों में लागू नहीं होता है।

+0

मदद नहीं करता है। वे प्लगइन्स एक ही स्क्रॉल ईवेंट का उपयोग करते हैं, न ही वास्तव में उन ब्राउज़रों को चिकनी स्क्रॉलिंग देते हैं जिनके पास नहीं है। न ही गड़बड़ाना ठीक करें। –

+0

ये प्लगइन्स सिर्फ एक उदाहरण हैं। Jquery स्क्रॉल प्लगइन के लिए एक साधारण Google खोज में कई अन्य हैं। आपको डिफॉल स्क्रॉल ईवेंट के बिना इन प्लगइन का उपयोग करना है ... आपको स्क्रॉलबार को "निकालना" और स्क्रॉल के साथ अपनी स्क्रॉल करना होगा एनीमेशन और प्लगिंग को आसान बनाना ... इस तरह http://stackoverflow.com/questions/ 4710438/कैसे-उपयोग-आसान-आसान-में-jquery-plugin-jquery-scrollto क्या आपको कोड उदाहरण की आवश्यकता है? –

-6

कारण है कि आप शैली = "स्थिति: तय, शीर्ष: 00px; सही; 00px;" का उपयोग न करें

तो इसकी हमेशा choppyness किए बिना देखा जा

+0

क्योंकि तत्व व्यूपोर्ट से अधिक है, इसलिए जब तक आप स्क्रॉल नहीं करते हैं तब तक इसका नीचे दिखाई नहीं देता है। – gregers