O evento de fim de transição do Webkit é chamado webkitTransitionEnd, Firefox é transactionEnd, opera é oTransitionEnd. Qual é uma boa maneira de lidar com todos eles em JS puro? Devo fazer uma detecção de navegador? ou implementar cada um separadamente? Alguma outra maneira que não me ocorreu?
ie:
//doing browser sniffing
var transitionend = (isSafari) ? "webkitTransitionEnd" : (isFirefox) ? "transitionEnd" : (isOpera) ? "oTransitionEnd";
element.addEventListener(transitionend, function(){
//do whatever
},false);
ou
// Assigning an event listener per browser
element.addEventListener("webkitTransitionEnd", fn);
element.addEventListener("oTransitionEnd", fn);
element.addEventListener("transitionEnd", fn);
function fn() {
//do whatever
}
javascript
css
css-transitions
dom-events
método de ação
fonte
fonte
Respostas:
Há uma técnica usada na Modernizr, melhorada:
Então, você pode simplesmente chamar essa função sempre que precisar do evento de término da transição:
fonte
transition
etransitionend
são suficientes. Veja: caniuse.com/#search=transitionsundefined
?De acordo com o comentário de Matijs, a maneira mais fácil de detectar eventos de transição é com uma biblioteca, jquery neste caso:
Em javascript sem biblioteca, fica um pouco prolixo:
fonte
msTransitionend
não é necessário aqui.Atualizar
O que segue é uma maneira mais limpa de fazer isso e não requer modernização
alternativamente
Isso é baseado no código sugerido pela Modernizr, mas com o evento extra para versões mais recentes do Opera.
http://modernizr.com/docs/#prefixed
fonte
one
vez deon
. Era tão óbvio!Se você usar jQuery e o Bootstrap
$.support.transition.end
retornará o evento correto para o navegador atual.Ele é definido no Bootstrap e usado em seus callbacks de animação , embora os documentos do jQuery digam para não confiar nessas propriedades:
fonte
A partir de 2015, este one-liner deve fazer o negócio (IE 10+, Chrome 1+, Safari 3.2+, FF 4+ e Opera 12 +): -
Anexar o ouvinte de evento é simples: -
fonte
transitionend
não é compatível:var transEndEventName = ('WebkitTransition' in document.documentElement.style) ? 'webkitTransitionEnd' : ('transitionend' in document.documentElement.style) ? 'transitionend' : false;
E então faça uma verificação simples:if(transEndEventName) element.addEventlistener(transEndEventName, theFunctionToInvoke)
O segundo é o caminho a seguir. Apenas um desses eventos será acionado em cada navegador, portanto, você pode definir todos eles e funcionará.
fonte
Aqui está uma maneira mais limpa
fonte
o fechamento do Google garante que você não precise fazer isso. Se você tiver um elemento:
olhando para a fonte de goog.events.eventtype.js, TRANSITIONEND é calculado olhando para o useragent:
fonte
Eu uso código assim (com jQuery)
Isso me permite usar JS para adicionar coisas especificando vP concatenado com a propriedade, e se não atingiu um navegador, ele apenas usa o padrão. Os eventos me permitem ligar facilmente como:
fonte
object.bind('transitionend oTransitionEnd webkitTransitionEnd', function() { // callback } );
transitionend
, nãoTransitionEnd
.substituição de jquery:
e uso como:
fonte
A resposta aceita está correta, mas você não precisa recriar esse elemento repetidamente e ...
Crie uma variável global e adicione a (s) função (ões):
fonte