Jquery Animate高度切换

时间:2013-04-14 13:33:14

标签: javascript jquery widget

我正在使用JQuery来制作小部件效果,即最小化和最大化小部件..

但问题是,当我快速点击最小化按钮时,小部件崩溃..

我认为问题在于它需要将动画中间高度作为切换时的新高度...

请帮忙......

$(document).ready(function () {
        $('.widget-minimize').click(function () {
            toggleMinimize($(this).parents('.widget').attr('id'));
        });

        $('.widget-close').click(function () {
            closeWidget($(this).parents('.widget').attr('id'));
        });
    });

    function toggleMinimize(widgetId) {
        var $content = $('#' + widgetId + ' .widget-content');
        if ($content.height()) {
            $content.data('oldheight', $content.height());
            $content.animate({height: 0});
            $('#' + widgetId).find('.widget-minimize').attr('src', 'http://dl.dropbox.com/u/638285/SO/images/icon-maximize.png').attr('alt', 'maximize');
        }
        else {
            $content.animate({height: $content.data('oldheight')});
            $('#' + widgetId).find('.widget-minimize').attr('src', 'http://dl.dropbox.com/u/638285/SO/images/icon-minimize.png').attr('alt', 'minimize');
        }
    }

    function closeWidget(widgetId) {
         $('#' + widgetId).animate({ "opacity": 0, "height": 0 }, 200, "swing");
    } 

Click here to see jsFiddle

3 个答案:

答案 0 :(得分:3)

如果您的内容目前正在动画,只需从您的toggleMinimize函数返回,如下所示:

function toggleMinimize(widgetId) {
   var $content = $('#' + widgetId + ' .widget-content');
   if ($content.is(':animated')) {
       return;
   }

请参阅working fiddle

答案 1 :(得分:0)

查看jQuery的.stop()方法及其:animated选择器。我经常在这种情况下使用它们来帮助我处理已经运行的动画。

例如:

$("#element").on("click", function() {
    if ($(this).not(":animated")) {
        ...animation code...
    }
});

$("#element").on("click", function() {
    $(this).stop();
    ...animation code...
});

答案 2 :(得分:0)

在我的情况下,小提琴正常工作,但我建议您在身高的情况下使用max-height,因此请使用max-height: 0max-height: 80(假设80更多一点)最大高度)。您也可以传递元素,而不仅仅是ID。

$(document).ready(function () {
    $('.widget-minimize').click(function () {
        toggleMinimize($(this).parents('.widget'));
    });

    $('.widget-close').click(function () {
        closeWidget($(this).parents('.widget'));
    });
});

function toggleMinimize(selector) {
    var $content = $('.widget-content', selector);
    if ($content.height()) {
        $content.data('oldheight', $content.height());
        $content.animate({maxHeight: 0});
        $('.widget-minimize', selector).attr('src', 'http://dl.dropbox.com/u/638285/SO/images/icon-maximize.png').attr('alt', 'maximize');
    }
    else {
        $content.animate({maxHeight: $content.data('oldheight')});
        $('.widget-minimize', selector).attr('src', 'http://dl.dropbox.com/u/638285/SO/images/icon-minimize.png').attr('alt', 'minimize');
    }
}

function closeWidget(widgetId) {
     $('#' + widgetId).animate({ "opacity": 0, "max-height": 0 }, 200, "swing");
}