2016-01-25 7 views
7

मेरे पास है कि मैं jQuery और setInterval के साथ बनाया अपनी वेबसाइट पर कोई उछल तीर, इस तरह:अंतराल थोड़ी देर के लिए दोहराने के बाद तुरंत स्पष्ट नहीं है

bouncing = setInterval(function() { 
    $("div").animate({ 
     top:"30px" 
    },100,"easeInCubic",function() { 
     $("div").animate({ 
      top:"0px" 
     },100,"easeOutCubic"); 
    }); 
    console.log("bounced"); 
},200); 

आप यहां codepen में जगह में देख सकते हैं : http://codepen.io/mcheah/pen/wMmowr

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

  1. क्यों उछाल वाली सिंक्रनाइज़ेशन से बाहर कभी कभी हो जाता है:

    मेरे सवालों इन कर रहे हैं?

  2. स्पष्ट अंतराल को थोड़ी देर के लिए दोहराने के लिए कुछ समय क्यों लगता है?

  3. क्या बाउंसिंग तीर रखने का कोई बेहतर तरीका है? सीएसएस संक्रमण अधिक भरोसेमंद हैं?

आपकी मदद के लिए धन्यवाद!

+1

के दौरान: http://codepen.io/luminaxster/pen/XKzLBg

मैं पूरा कॉलबैक का उपयोग करते समय दूसरे एनीमेशन बजाय समाप्त हो जाती है और चर है इस संस्करण में एक उछाल पुनरावर्ती कॉल को नियंत्रित करने की सिफारिश करेंगे जेएस प्रसंस्करण, अंतराल कार्यों असीमित हैं। तो वे कोड चलाने में 'ब्रेक' तक इंतजार करते हैं। घटना होने पर आग लग जाती है जब मौका होता है। अंतराल बहुत असंगत होते हैं और उन घटनाओं के लिए अनुशंसित नहीं होते हैं जिन्हें एक विशिष्ट समय पर चलाने की आवश्यकता होती है। देखें: http://ejohn.org/blog/how-javascript-timers-work/ – ryan0319

+0

मैं ईमानदारी से लगता है कि यह बुरा UX है इस उछाल/फ्लैश/चमक/धड़कन/जो कुछ भी (ऑफिस 2007 "फाइल करना था की तरह सामान बनाने के लिए "मेन्यू प्रतिस्थापन बटन चमक क्योंकि यह स्पष्ट नहीं था कि यह एक बटन था और यह $% से अधिक है! और मेरे बाहर) लेकिन यह क्यों है कि यह वांछित के रूप में काम नहीं कर रहा है, यह एक अच्छा सवाल है (और मेरे पास नहीं है एक जवाब)। – Draco18s

+0

एनिमेशन के लिए जावास्क्रिप्ट का उपयोग न करें (ठीक है, हो सकता है कि आप वेग या समान का उपयोग करेंगे), सीएसएस एनिमेशन से चिपके रहें। साथ ही, 'setInterval' ऐसा कुछ नहीं है जिसे आप एनीमेशन के लिए उपयोग करेंगे क्योंकि यह असीमित है। निचली पंक्ति: सीएसएस में स्टाइल रखना ;-) –

उत्तर

3

कि दोनों पूरी तरह से समन्वय बाहर आते हैं। यह परेशानी के लिए पूछ रहा है और दोनों समय के साथ अलग हो सकते हैं, इसलिए इसे एक खराब डिजाइन पैटर्न माना जाता है।

, तो इसके बजाय, आप बस दूसरा एनीमेशन के पूरा होने के पहले पुनरारंभ करें और इस तरह अपने को दोहराने के लिए उपयोग करते हैं, तो आप सही समन्वय हर बार की है।

आप अपने codepen का एक और संस्करण में है कि यहाँ देख सकते हैं: http://codepen.io/anon/pen/NxYeyd

function run() { 
    var self = $("div"); 
    if (self.data("stop")) return; 
    self.animate({top:"30px"},100, "easeInCubic") 
     .animate({top:"0px"}, 100, "easeOutCubic", run); 
} 

run(); 


$("div").click(function() { 
    // toggle animation 
    var self = $(this); 
    // invert setting to start/stop 
    self.data("stop", !self.data("stop")); 
    run(); 
    console.log("toggled bouncing"); 
}); 
+0

यह मेरे लिए काम किया, आपकी मदद के लिए धन्यवाद! – mcheah

+0

वैश्विक चर का उपयोग करने से बचने के लिए कुछ बदलाव किए गए हैं। – jfriend00

1
  1. टाइमर के साथ animate() मिश्रण करना अच्छा नहीं है। नहीं मौका है कि आप इस तरह कुछ सिंक्रनाइज़ कर सकते हैं। और इसकी कोई आवश्यकता नहीं है। आप बस एनीमेशन कतार में एक समारोह जोड़ सकते हैं, यहाँ देखो: https://stackoverflow.com/a/11764283/3227403

  2. क्या animate() है एक नौकरी कतार जो बाद में कार्रवाई की जाएगी, जब सही समय आता है में एक एनीमेशन अनुरोध डाल दिया है। जब आप अंतराल तोड़ते हैं तो कतार में जमा की गई सामग्री अभी भी संसाधित की जाएगी। कतार को साफ़ करने और तुरंत सभी एनीमेशन को रोकने के लिए एक तरीका है।

  3. JQuery एनीमेशन फ़ंक्शन वास्तव में सीएसएस में हेरफेर करते हैं, और HTML में इससे परे कुछ भी नहीं है। एक और विकल्प कैनवास का उपयोग करेगा, लेकिन यह एक पूरी तरह से अलग दृष्टिकोण है और मैं इसकी अनुशंसा नहीं करता। JQuery के एनीमेशन के साथ आप पहले से ही सबसे अच्छी पसंद पर हैं।

यह आपकी समस्या का एक सरल उपाय है:

function bounce() 
{ 
    $("div") 
    .animate({ 
     top: "30px" 
    }, 100, "easeInCubic") 
    .animate({ 
     top: "0px" 
    }, 100, "easeOutCubic", bounce); // this loops the animation 
} 

प्रारंभ के साथ पृष्ठ लोड पर उछल:

$(bounce); 

बंद करो के साथ क्लिक पर उछल:

$("div").click(function() { 
    $("div").stop().clearQueue().css({ top: "0px" }); 
    // you want to reset the style because it can stop midway 
}); 

संपादित करें: कुछ त्रुटियां थीं जिन्हें मैंने अभी सही किया था। चल रहा उदाहरण codepen now पर है।

+0

के लिए एक प्रश्न है, मैं वास्तव में यह काम करने में सक्षम नहीं था। clearQueue ने एनीमेशन को रोकने के लिए काम किया लेकिन मैंने बटन को उछालते समय मुझे दिखाने के लिए एक console.log() भी जोड़ा और जब मुझे इसकी आवश्यकता होती है तो बटन बंद हो जाता है, लेकिन यह बाउंस लॉगिंग पर रखा जाता है, जो अन्य एनिमेशन के समय को गड़बड़ कर देता है। यह निर्दिष्ट करने के लिए पैरामीटर के साथ बाउंस कॉल करने की आवश्यकता के साथ कुछ करना पड़ सकता था, यह निर्दिष्ट करने के लिए कि मुझे किस तत्व को उछालने की आवश्यकता है, लेकिन मुझे यकीन नहीं है। मैंने jfriend00 के कामकाज का उपयोग किया जो मेरे लिए काम करता था - हालांकि आपकी मदद के लिए धन्यवाद! – mcheah

+0

आह, हाँ। वह एक बग था जिसे मैंने नोटिस नहीं किया था। मैंने 'clearQueue()' से पहले 'स्टॉप() 'जोड़ा। यह अब इरादे के रूप में काम करता है। बस आपकी रुचि के लिए – pid

+0

, एक 'console.log डाल()' 'से पहले अगर (self.data (" रोक ")) वापसी;' jfriend00 के कोड में है और आप इसे एक ही समस्या मैं था है कि देखेंगे। – pid

0

आप एनीमेशन के लिए जावास्क्रिप्ट का उपयोग करने की Greensock ट्वीन पुस्तकालय की तरह बेहतर कुछ का उपयोग कर सकते http://greensock.com/docs/#/HTML5/GSAP/TweenMax/to/ कुछ इस तरह चाहते हैं: अपने पूरी तरह से एक setInterval() टाइमर और दो jQuery एनिमेशन ऐसे समन्वय करने के लिए कोशिश कर रहे हैं

var tween = TweenMax.to($("div"), 100, {y: "100px", yoyo: true, repeat: -1}); 
0

आप के साथ अपने अंतराल कोड लपेट सकता है:

if(!$("div").is(":animated")) 

यह अपने एनीमेशन आरंभ हो जाएगा केवल अगर अपने पिछले एक है ख़त्म होना। कारण यह अजीब उछाल रहा था कि आपके एनिमेशन कतारबद्ध हैं। आप देख सकते हैं कि यह कैसे अब काम करता है:

http://codepen.io/luminaxster/pen/qNVzLY

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