CSS3 संक्रमण घटनाओं


जवाबों:


210

W3C सीएसएस संक्रमण ड्राफ्ट

एक सीएसएस संक्रमण के पूरा होने के एक इसी डोम घटना उत्पन्न करता है। एक घटना को प्रत्येक संपत्ति के लिए निकाल दिया जाता है जो संक्रमण से गुजरती है। यह एक कंटेंट डेवेलपर को ऐसी गतिविधियाँ करने की अनुमति देता है जो एक संक्रमण के पूरा होने के साथ सिंक्रनाइज़ होती हैं।


वेबकिट

यह निर्धारित करने के लिए कि एक संक्रमण कब पूरा होता है, एक संक्रमण के अंत में भेजे जाने वाले DOM इवेंट के लिए एक जावास्क्रिप्ट ईवेंट श्रोता फ़ंक्शन सेट करें। इवेंट WebKitTransitionEvent का एक उदाहरण है, और इसका प्रकार है webkitTransitionEnd

box.addEventListener( 'webkitTransitionEnd', 
    function( event ) { alert( "Finished transition!" ); }, false );

मोज़िला

एक एकल ईवेंट है जिसे संक्रमण पूर्ण होने पर निकाल दिया जाता है। फ़ायरफ़ॉक्स में, घटना transitionendओपेरा में oTransitionEnd, और WebKit में है webkitTransitionEnd

ओपेरा

एक प्रकार का संक्रमण घटना उपलब्ध है। oTransitionEndघटना संक्रमण के पूरा होने पर होता है।

इंटरनेट एक्स्प्लोरर

transitionendघटना संक्रमण के पूरा होने पर होता है। यदि संक्रमण पूरा होने से पहले हटा दिया जाता है, तो घटना में आग नहीं लगेगी।


स्टैक ओवरफ्लो: मैं ब्राउज़रों में सीएसएस 3 संक्रमण कार्यों को कैसे सामान्य कर सकता हूं?


3
ध्यान दें कि घटना को फ़ायरफ़ॉक्स में "ट्रांज़ेंडेंड" और ओपेरा में "ऑट्रांसिशनएंड" कहा जाता है
एंड्रियास

8
प्रश्न के संक्रमण-प्रारंभ भाग के बारे में किसी ने कुछ भी उल्लेख नहीं किया है। क्या संक्रमण शुरू होने से पहले फायर हैंडलर को पंजीकृत करने का कोई तरीका नहीं है?
टायलर

क्या अब इसे प्राप्त करने का एक मानक तरीका है? लगता है 2 साल एक लंबा समय है! चीजें संभावना बदल गई हैं।
माइल्ड फज

@tyler मैं नहीं जानता कि संक्रमण-प्रारंभ की कमी के आसपास कैसे काम किया जाए।
लूसिक

@ हल्का फुल लिंक किए गए स्टैक्वोवरफ़्लो प्रश्न का दिलचस्प समाधान है।
लूसिक

73

अपडेट करें

सभी आधुनिक ब्राउज़र अब उपसर्ग घटना का समर्थन करते हैं:

element.addEventListener('transitionend', callback, false);

https://caniuse.com/#feat=css-transitions


मैं पीट द्वारा दिए गए दृष्टिकोण का उपयोग कर रहा था, हालांकि मैंने अब निम्नलिखित का उपयोग करना शुरू कर दिया है

$(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', 
function() {
 //do something
});

वैकल्पिक रूप से यदि आप बूटस्ट्रैप का उपयोग करते हैं तो आप बस कर सकते हैं

$(".myClass").one($.support.transition.end,
function() {
 //do something
});

यह क्योंकि वे बूटस्ट्रैप में निम्नलिखित शामिल हैं। Js

+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      'WebkitTransition' : 'webkitTransitionEnd',
      'MozTransition'    : 'transitionend',
      'OTransition'      : 'oTransitionEnd otransitionend',
      'transition'       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }


  $(function () {
    $.support.transition = transitionEnd()
  })

}(jQuery);

ध्यान दें कि उनमें एक emulateTransitionEnd फ़ंक्शन भी शामिल है, जिसे कॉलबैक हमेशा सुनिश्चित करने के लिए आवश्यक हो सकता है।

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false, $el = this
    $(this).one($.support.transition.end, function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

ध्यान रखें कि कभी-कभी यह घटना आग नहीं लगाती है, आमतौर पर इस मामले में जब गुण नहीं बदलते हैं या पेंट को ट्रिगर नहीं किया जाता है। यह सुनिश्चित करने के लिए कि हम हमेशा कॉलबैक प्राप्त करते हैं, चलो एक टाइमआउट सेट करते हैं जो घटना को मैन्युअल रूप से ट्रिगर करेगा।

http://blog.alexmaccaw.com/css-transitions


3
आप ऐसा कुछ नहीं कर सकते। कुछ मामलों में कॉलबॅक को एक से अधिक बार निकाल दिया जाएगा।
सेबस्टियन

11
उन ब्राउज़र में जो उपसर्ग और नियमित ईवेंट नाम दोनों के आस-पास रखते हैं। आप
.on के

61

सभी आधुनिक ब्राउज़र अब उपसर्ग घटना का समर्थन करते हैं :

element.addEventListener('transitionend', callback, false);

क्रोम, फ़ायरफ़ॉक्स और सफारी के नवीनतम संस्करणों में काम करता है। यहां तक ​​कि IE10 +।


16

ओपेरा 12 में जब आप सादे जावास्क्रिप्ट का उपयोग करके बांधते हैं, तो 'oTransitionEnd' काम करेगा:

document.addEventListener("oTransitionEnd", function(){
    alert("Transition Ended");
});

हालाँकि, यदि आप jQuery के माध्यम से बाँधते हैं, तो आपको 'ओट्रांसमेंटेंड' का उपयोग करना होगा

$(document).bind("otransitionend", function(){
    alert("Transition Ended");
});

यदि आप मॉडर्निज़र या बूटस्ट्रैप-ट्रांज़िशन का उपयोग कर रहे हैं। तो क्या आप बस एक बदलाव कर सकते हैं:

var transEndEventNames = {
    'WebkitTransition' : 'webkitTransitionEnd',
    'MozTransition'    : 'transitionend',
    'OTransition'      : 'oTransitionEnd otransitionend',
    'msTransition'     : 'MSTransitionEnd',
    'transition'       : 'transitionend'
},
transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];

आप कुछ जानकारी यहाँ भी पा सकते हैं http://www.ianlunn.co.uk/blog/articles/opera-12-otransitionend-bugs-and-workarounds/


6

बस मनोरंजन के लिए, यह मत करो!

$.fn.transitiondone = function () {
  return this.each(function () {
    var $this = $(this);
    setTimeout(function () {
      $this.trigger('transitiondone');
    }, (parseFloat($this.css('transitionDelay')) + parseFloat($this.css('transitionDuration'))) * 1000);
  });
};


$('div').on('mousedown', function (e) {
  $(this).addClass('bounce').transitiondone();
});

$('div').on('transitiondone', function () {
  $(this).removeClass('bounce');
});

3

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

function once = function(object,event,callback){
    var handle={};

    var eventNames=event.split(" ");

    var cbWrapper=function(){
        eventNames.forEach(function(e){
            object.removeEventListener(e,cbWrapper, false );
        });
        callback.apply(this,arguments);
    };

    eventNames.forEach(function(e){
        object.addEventListener(e,cbWrapper,false);
    });

    handle.cancel=function(){
        eventNames.forEach(function(e){
            object.removeEventListener(e,cbWrapper, false );
        });
    };

    return handle;
};

उपयोग:

var handler = once(document.querySelector('#myElement'), 'transitionend', function(){
   //do something
});

फिर यदि आप किसी बिंदु पर रद्द करना चाहते हैं, तब भी आप इसे कर सकते हैं

handler.cancel();

यह अन्य घटना usages के लिए अच्छा है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.