账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    用jQuery的addClass给div添加css动画,动画反复播放,animationend有的不触发
    43
    0

    问题:
    我遇到了一个非常奇怪的问题,在electron下我想用animate.css做一个顶部通知弹出的动画效果,用的是fadeInDown,在用addClass添加动画之后,我发现只要先添加的动画还没有执行完,此时给另一个新的通知div添加动画的css class,这两个div的动画都会播放一次,而且之前那个div的animationend不会触发。

    代码:

    var infobar_id = 0;
    
    //显示Infobar
    function displayInfobar(type, text, timeout = 3000) {
        var html = "";
        switch (type) {
            case 'success':
                html += '<div class="infobar infobar-success" id="infobar_' + infobar_id + '"><i class="fa fa-check"></i><span>';
                html += text;
                html += '</span></div>';
                infobar_container.innerHTML += html;
                break;
            case 'warning':
                html += '<div class="infobar infobar-warning" id="infobar_' + infobar_id + '"><i class="fa fa-warning"></i><span>';
                html += text;
                html += '</span></div>';
                infobar_container.innerHTML += html;
                break;
            case 'error':
                html += '<div class="infobar infobar-error" id="infobar_' + infobar_id + '"><i class="fa fa-warning"></i><span>';
                html += text;
                html += '</span></div>';
                infobar_container.innerHTML += html;
                break;
            case 'info':
            default:
                html += '<div class="infobar infobar-info" id="infobar_' + infobar_id + '"><i class="fa fa-info-circle"></i><span>';
                html += text;
                html += '</span></div>';
                infobar_container.innerHTML += html;
                break;
        }
        //animate
        //timeout > 0则自动关闭,否则需要用户手动关闭
        if (timeout > 0) {
            //用t中转
            var t = infobar_id;
            $('#infobar_' + t).animateCss('fadeInDown', function () {
                setTimeout(function () {
                    $('#infobar_' + t).animateCss('fadeOutUp', function(){
                        $('#infobar_'+t).remove();
                    });
                }, timeout);
            });
        } else {
            $('#infobar_' + infobar_id).animateCss('fadeInDown');
        }
        infobar_id++;
    }

    如果同时存在多个infobar,最后container里是这样的:

    <div class="container-infobar">
        <div class="infobar infobar-success animated fadeInDown" id="infobar_0"><i class="fa fa-check"></i><span>删除成功</span></div>
        <div class="infobar infobar-success animated fadeOutUp" id="infobar_1"><i class="fa fa-check"></i><span>删除成功</span></div>
    </div>

    始终会有一部分infobar不能自动关闭,animationend也不能正常触发。

     $.fn.extend({
                animateCss: function (animationName, callback) {
                    var animationEnd = (function (el) {
                        var animations = {
                            animation: 'animationend',
                            OAnimation: 'oAnimationEnd',
                            MozAnimation: 'mozAnimationEnd',
                            WebkitAnimation: 'webkitAnimationEnd',
                        };
    
                        for (var t in animations) {
                            if (el.style[t] !== undefined) {
                                return animations[t];
                            }
                        }
                    })(document.createElement('div'));
                    
                    console.log(this);
    
                    this.addClass('animated ' + animationName).one(animationEnd, function () {
                        $(this).removeClass('animated ' + animationName);
                        console.log(this);
                        if (typeof callback === 'function') callback();
                    });
    
                    return this;
                },
            });

    animateCss方法是这么写的。

    难道一个页面上同样的CSS动画只能播放一个?我是否有必要改成JS动画来实现相应的效果

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 梦想在前方 普通会员 1楼

      在jQuery中,我们可以使用addClass和removeClass方法给元素添加和移除类。如果一个元素已经被addClass了某个类,那么我们再给它这个类时,它就不会再添加新的类。相反,如果我们给一个元素移除了某个类,那么我们再给它这个类时,它就会添加新的类。

      如果你想要给一个div添加一个CSS动画,你可以使用addClass方法给它添加动画类,然后在动画结束后使用removeClass方法移除动画类。但是,动画的结束条件可能并不是你想要的,比如动画的结束条件是animationend触发。在这种情况下,你需要在动画的end条件之前调用动画的结束方法,然后在动画结束后再移除动画类。

      以下是一个简单的示例:

      ```javascript // 获取div元素 var div = document.getElementById('myDiv');

      // 给div添加动画类 divaddClass('myAnimation');

      // 在动画结束之前调用动画的结束方法 div animationEnd();

      // 在动画结束后移除动画类 div.removeClass('myAnimation'); ```

      在这个示例中,我们首先获取了div元素,然后使用addClass方法给它添加了一个名为'myAnimation'的动画类。然后,我们在动画的end条件之前调用了动画的结束方法。最后,我们在动画结束后移除了动画类。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部