最终CSS3过渡完成后,正确使用transitionend以运行脚本?

时间:2012-11-21 18:44:28

标签: javascript jquery css css3

我正在尝试学习如何在我的CSS3过渡中使用transitionend,所以我有一组大小为网格的图像以及0到1的不透明度,理想情况下我想要做的就是等到所有这些图像都已完成,最后的transitionend事件已经启动,然后继续我的下一个代码。目前我只是试图在转发发生时尝试注销消息,但我什么也没得到,这意味着我可能正在使用这个错误。任何人都可以建议我如何做到这一点?

JS小提琴: http://jsfiddle.net/mWE9W/2/

CSS

.image img {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0.01;
  -webkit-transition: all 1s ease-in;
  -webkit-transform: scale(0);
  height: 150px;
  width: 150px;
  display:block;
}

.inner.active .image img {
  -webkit-transform: scale(1);
  top: 0;
  left: 0;
  opacity: 1;
}

JS

$('.image img').on('webkitTransitionEnd', function(e) {
  console.log('this ran')

  $('h2').fadeIn();
}, false);

1 个答案:

答案 0 :(得分:2)

1)您在false方法调用中不需要最后一个参数.on。你的回调从未被调用过。

2)一旦你删除了那个不需要的参数,你就会注意到回调实际上被调用了16次。发生这种情况是因为您有4个具有4个过渡比例的图像。动画每个属性会导致调用回调。因此,您需要对图像转换完成进行某种检查,并且只有在完成所有转换后才调用.fadeIn()方法。代码如下所示:

var imageCount = $('.image img').length, animatedCount = 0, animCompleteImages = $();
$('img').imagesLoaded(function() {
    $('.inner').addClass('active').on('webkitTransitionEnd', 'img', function(e) {
        if(!animCompleteImages.filter(this).length) {
            animCompleteImages = animCompleteImages.add(this);
            animatedCount++;

            if(animatedCount === imageCount) {
                $('h2').fadeIn();      
            }
        }
    });
});​

使用JS小提琴here