Reemplazo de CSS3 para jQuery.fadeIn y fadeOut

He escrito una pequeña cantidad de código para tratar de replicar jQuery's.fadeIn() y.fadeOut() Funciones que utilizan transiciones CSS para verse mejor en dispositivos táctiles.

Idealmente, me gustaría evitar usar una biblioteca para poder escribir exactamente lo que quiero y como un ejercicio de aprendizaje.

fadeOut funciona bien.

La idea defadeIn es usar transiciones CSS3 para ajustar la opacidad de un elemento, después de lo cual el elemento se configurará endisplay:block; (utilizandois-hidden clase) para asegurarse de que aún no se pueda hacer clic o que cubra algo debajo de él.

fadeIn aunque no esta funcionando Creo que es por agregar elis-animating clase al mismo tiempo que la eliminación de lais-hiding clase. El evento transitionEnd nunca se dispara porque no se produce una transición:

function fadeIn (elem, fn) {
  var $elem = $(elem);

  $elem.addClass('is-animating');
  $elem.removeClass('is-hidden');
  $elem.removeClass('is-hiding');

  $elem.on(transitionEndEvent, function () {

    $elem.removeClass('is-animating');

    if (typeof fn === 'function') {
      fn(); 
    }
  });
}; 

Y el CSS

.is-animating {
  @include transition(all 2000ms);
}

.is-hiding {
  // Will transition
  @include opacity(0);
}

.is-hidden {
  // Won't transition
  display: none;
}

Aquí está el código:CodePen link

Actualización: he encontrado lo que describiría como un hack, pero eso funciona muy bien:Reemplazo de CSS3 para jQuery.fadeIn y fadeOut

Código de trabajo después de esta corrección:Fijo

Una solución sinsetTimeout Sin embargo sería muy valioso.

Respuestas a la pregunta(4)

Su respuesta a la pregunta