2012-05-13 12 views
5

मान लीजिए कि मेरे पास कुछ div है, और मैं अपने बच्चों के लिए .animate({opacity:0},400, function(){}); का उपयोग करता हूं। क्या एनीमेशन के पूरा होने के लिए शेष समय प्राप्त करना संभव है? उदाहरण के लिए, 200 एमएस शेष, या 0 अगर कोई एनीमेशन नहीं है? धन्यवाद।क्या एनीमेशन के शेष समय को पाने का कोई तरीका है?

+1

... तुम क्यों है कि मूल्य की ज़रूरत है? –

+1

@ रोकोसी बुल्जन। यह मुझे लगता है कि एक शौक है। वह संग्रह एनिमेशन समय है। – gdoron

+0

मुझे बच्चों को कुछ कॉलबैक कतार में समस्या है - यह हमेशा ट्रिगर नहीं होता है, और यह निर्धारित करना आसान नहीं है कि कौन सा बच्चा इसे कतार में रखता है, इसलिए मैं इसे अधिक विश्वसनीय बनाने के लिए सेटटाइमआउट के साथ प्रयास करना चाहता था। – Anonymous

उत्तर

6

मदद करने के लिए आप को बेहतर समझते हैं कि कैसे आप step समारोह
[के रूप में gdoron द्वारा पोस्ट की गई] मैं कदम का उपयोग कर समारोह शेष समय प्राप्त करने के लिए एक उदाहरण बनाया का उपयोग कर सकते हैं:

(एनीमेशन को रोकने और शेष समय को पुनर्प्राप्त करने के लिए get state! बटन पर क्लिक करें!)

demo with distance
demo with opacity

दूरी उदाहरण jQuery:

var time = 4000; 
var distance = 300; 
var currentTime = 0; 

$('#ball').animate({ 
    left: distance 
}, { 
    duration: time, 
    step: function (now, fx) { 

     currentTime = Math.round((now * time)/distance); 
     var data = fx.prop + ' ' + Math.round(now) + '; <b>' + currentTime + 'ms</b> '; 

     $('body').append('<p>' + data + '</p>'); 
    }, 
    easing: 'linear' 
}); 

$('#getTime').click(function() { 
    $('#ball').stop(); 
    $('body').prepend('<p>currentTime is:' + currentTime + ' ms; REMAINING: ' + (time - currentTime) + 'ms</p>'); 
}); 
  • आप देख सकते हैं कि कैसे मैं (left) संपत्ति है कि वर्तमान में एनिमेटेड है पाने के लिए animation step अंदर fx.prop इस्तेमाल किया।
  • आप देख सकते हैं कि: एनीमेशन समय और दूरी जानने (अस्पष्टता, जो कुछ भी ...) हम आसानी से प्राप्त कर सकते हैं राज्य कुछ सरल गणित ((now*time)/distance) और लौट आए now मूल्य के लिए धन्यवाद द्वारा 'बंद कर दिया/रोका गया' ।
+0

धन्यवाद यह बहुत उपयोगी है! और ऐसा लगता है कि अगर हम स्टेप फ़ंक्शन को केवल परिवर्तनीय लेखन में सीमित करते हैं तो यह अधिक प्रदर्शन नहीं करेगा। वैसे भी यह हर 1 एमएस या कुछ नहीं कहा जाएगा। – Anonymous

+0

@ user1125062 ऐसा नहीं होना चाहिए, क्योंकि हम केवल कुछ ऐसा एक्सेस कर रहे हैं जो पहले से ही हमारी एनीमेशन चला रहा है। –

3

मुझे पता नहीं क्यों आपको इसकी आवश्यकता है, लेकिन step मदद कर सकते हैं यह मान निकालें:

चरण समारोह

.animate के दूसरे संस्करण() एक कदम विकल्प प्रदान करता है - एक कॉलबैक फ़ंक्शन जिसे एनीमेशन के प्रत्येक चरण पर निकाल दिया जाता है। यह फ़ंक्शन कस्टम एनीमेशन प्रकारों को सक्षम करने या एनीमेशन को बदलने के लिए उपयोगी है क्योंकि यह हो रहा है। यह दो तर्क (अब और एफएक्स) स्वीकार करता है, और यह एनिमेटेड होने वाले डीओएम तत्व पर सेट है।

अब: संपत्ति के संख्यात्मक मान प्रत्येक चरण में एनिमेटेड किया जा रहा
fx: jQuery.fx प्रोटोटाइप वस्तु के लिए एक संदर्भ है, जो इस तरह के एनिमेटेड तत्व, शुरुआत के लिए ELEM के रूप में संपत्तियों की एक संख्या में शामिल और क्रमशः एनिमेटेड संपत्ति के पहले और अंतिम मूल्य के लिए समाप्त होता है, और एनिमेटेड संपत्ति के लिए प्रोप।

docs

+0

हमम, लेकिन मुझे इसके साथ क्या करना चाहिए? :) – Anonymous

+0

@ user1125062। आप वर्तमान मूल्य, पहला मूल्य, अंतिम मूल्य इत्यादि प्राप्त कर सकते हैं, बस इसके साथ खेलें। वैसे भी मुझे यकीन है कि आप जो करने की कोशिश कर रहे हैं, उसके अन्य तरीके हैं ... – gdoron

+0

बिना सेट के अंतराल या इस विधि, नहीं, AFAIK। इसे पाने का यही एकमात्र तरीका है। – inhan

3

सुनो, step फ़ंक्शन को ध्यान में रखें, हर कोई इस बारे में बात करता रहता है। मुझे एक बार अपनी ज़रूरत की ज़रूरत होती थी और मैंने खुद लिखा था कि कुल एनीमेशन समय पर एक बार देखकर इसे पीछे छोड़ दिया गया है (आपको पहले से ही यह ज्ञात होना चाहिए क्योंकि आपने इसे एक बार jQuery में दिया था) और के वर्तमान और लक्ष्य अस्पष्टता। फिर कुल एनीमेशन समय के साथ उस मात्रा को गुणा करें, कुल योग से कुल घटाया गया है। इतना ही आसान।

छद्म कोड:

func calculate-time-left-in-a-running-fade-in-animation: 
{ 
    var current_opacity = $elem.css('opacity'); 
    var target_opacity = this.getTargetOpacity(); 

    var total = this.getTotalAnimationTime(); 

    var quotient = current_opacity/target_opacity; 
    return total - quotient * total; 
} 
बस जिज्ञासा से बाहर
+0

दिलचस्प दृष्टिकोण, इसके बावजूद नहीं है! हालांकि अगर परिशुद्धता महत्वपूर्ण थी, तो कदम ही जाने का एकमात्र तरीका है। – Anonymous

+0

विशेषता मान को स्वयं प्राप्त करना या अब परिवर्तनीय का उपयोग करना वही बात है, जब तक एनीमेशन रोका जाता है। JQuery चरण-उदाहरण @roXon में एनीमेशन के प्रत्येक चरण पर, बहुत अधिक ओवरहेड चल रहा होगा। वास्तव में किए गए उदाहरण जैसे वैश्विक चर भी पेश कर सकते हैं। यदि आप गणना से पहले एनीमेशन को रोकना चाहते हैं (फिर से उदाहरण की तरह) और प्रोग्रामेटिक रूप से बाद में एनीमेशन फिर से शुरू करें, तो बिल्कुल बिल्कुल कोई अंतर नहीं है। मैं यह भी कहूंगा कि एक चल रहे एनीमेशन के तहत इस गणना मूल्य को एक ही परिणाम देगा। –

+0

चरण तर्क का संग्रहित उत्पाद, शेष समय का गणना मूल्य, लाइव सूची की तरह नहीं है, मान स्वयं को सटीक मूल्य पर अपडेट नहीं करता है। और जब भी आप इसका उपयोग करेंगे, तब भी यह "पुरानी" गणना के अलावा कुछ भी नहीं होगा। इस जानकारी अंतर को ब्रिज करने के लिए आपके पास एक मध्यम व्यक्ति भी जिम्मेदार होगा, चरण कार्य, जो सिद्धांत में सटीकता को विफल करना चाहिए। लेकिन यदि आप इसके बजाय एक ही गणना बनाते हैं तो ठीक है जब आपको शेष समय जानने की आवश्यकता होती है, तो क्या यह और भी सटीक नहीं होगा? और कोड और प्रसंस्करण ओवरहेड की पठनीयता दोनों में भी सस्ता है। –

संबंधित मुद्दे

 संबंधित मुद्दे