【问题标题】:animating addClass/removeClass with jQuery使用 jQuery 动画 addClass/removeClass
【发布时间】:2011-11-10 07:06:50
【问题描述】:

我正在使用 jQuery 和 jQuery-ui 并希望为各种对象的各种属性设置动画。

为了解释这里的问题,我将它简化为一个 div,当用户将鼠标悬停在它上面时,它会从蓝色变为红色。

使用animate() 时,我能够获得我想要的行为,但是这样做时,我制作动画的样式必须在动画代码中,因此与我的样式表是分开的。 (参见示例 1

另一种方法是使用addClass()removeClass(),但我无法重新创建使用animate() 可以获得的确切行为。 (参见示例 2


示例 1

让我们看看我有animate()的代码:

$('#someDiv')
  .mouseover(function(){
    $(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
  })
  .mouseout(function(){
    $(this).stop().animate( {backgroundColor:'red'}, {duration:500});
  });

它显示了我正在寻找的所有行为:

  1. 在红色和蓝色之间平滑动画。
  2. 当用户将鼠标快速移入和移出 div 时,没有动画“排队”。
  3. 如果用户在动画仍在播放时将鼠标移出/移入,则它会在当前的“中途”状态和新的“目标”状态之间正确缓和。

但是由于样式更改是在animate() 中定义的,我必须在那里更改样式值,并且不能让它指向我的样式表。这种定义样式的“碎片化”确实让我很困扰。


示例 2

这是我目前使用addClass()removeClass 的最佳尝试(请注意,要使动画正常工作,您需要jQuery-ui):

//assume classes 'red' and 'blue' are defined

$('#someDiv')
  .addClass('blue')
  .mouseover(function(){
    $(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
  })
  .mouseout(function(){
    $(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
  });

这展示了我最初要求的属性 1. 和 2.,但是 3 不起作用。

我明白原因:

当动画addClass()removeClass() 时,jQuery 会为元素添加一个临时样式,然后递增适当的值,直到它们达到提供的类的值,然后才实际添加/删除类。

因此,我必须删除样式属性,否则如果动画中途停止,样式属性将保留并永久覆盖任何类值,因为标签中的样式属性比类样式更重要。

但是,当动画完成一半时,它还没有添加新的类,因此在这个解决方案中,当用户在动画完成之前移动鼠标时,颜色会跳转到之前的颜色。


理想情况下我想要的是能够做这样的事情:

$('#someDiv')
  .mouseover(function(){
    $(this).stop().animate( getClassContent('blue'), {duration:500});
  })
  .mouseout(function(){
    $(this).stop().animate( getClassContent('red'), {duration:500});
  });

getClassContent 只会返回所提供类的内容。关键是这样我就不必到处保留样式定义,而是可以将它们保存在样式表中的类中。

【问题讨论】:

  • 您需要支持哪些版本的IE?你会对 IE9 满意吗?还是需要低支持?
  • 老实说,我根本不关心 IE。这一切都只在 webkit 浏览器(safari/chrome)上进行了测试。
  • getClassContent 长什么样子?

标签: javascript jquery css jquery-ui jquery-animate


【解决方案1】:

既然你不担心 IE,为什么不直接使用 css 过渡来提供动画和 jQuery 来改变类。实例:http://jsfiddle.net/tw16/JfK6N/

#someDiv{
    -webkit-transition: all 0.5s ease;
    -moz-transition: all 0.5s ease;
    -o-transition: all 0.5s ease;
    transition: all 0.5s ease;
}

【讨论】:

  • 从 2015 年 6 月 12 日起,- IE 10+ - Chrome 26+ - FireFox 16+ - Safari 6.1+ - Opera 12.1+ -webkit、-moz、-o 仅在更旧的浏览器中才需要此功能。您可能可以不使用它以节省一些空间。
  • @clst,我更喜欢与旧浏览器的向后兼容性,而不是节省几个字节的空间。
【解决方案2】:

另一种解决方案(但它需要 jQueryUI,正如 Richard Neil Ilagan 在 cmets 中指出的那样):-

addClass、removeClass 和 toggleClass 也接受第二个参数;从一种状态到另一种状态的持续时间。

$(this).addClass('abc',1000);

见 jsfiddle:- http://jsfiddle.net/6hvZT/1/

【讨论】:

  • 请注意,这需要 jQuery UI。开箱即用的 jQuery 不支持 xxxClass() 函数的动画补间。
  • @Richard Neil Ilagan:感谢您的通知。我真的错过了这一点。
  • 你能指出要下载什么文件并将其包含在 .html 文件中,以便我可以将 jQueryUI 仅用于 xxxClass 动画补间吗?
  • [jqueryui.com](jqueryui.com) @sodiumnitrate
  • 此解决方案的动画方式也与 slide() 或 animate() 不同。毫秒值是延迟,不是动画。
【解决方案3】:

你可以使用 jquery ui 的switchClass,下面是一个例子:

$( "selector" ).switchClass( "oldClass", "newClass", 1000, "easeInOutQuad" );

或者看到这个jsfiddle

【讨论】:

  • -1。您不符合我在原帖中列出的限制 1、2 和 3。特别是 switchClass 处理需求 2 和 3 很差。
【解决方案4】:

您只需要 jQuery UI effects-core (13KB),以启用添加的持续时间(就像 Omar Tariq 指出的那样)

【讨论】:

    【解决方案5】:

    我正在研究这个问题,但希望有一个不同的进出转换率。

    这就是我最终做的:

    //css
    .addedClass {
        background: #5eb4fc;
    }
    
    // js
    function setParentTransition(id, prop, delay, style, callback) {
        $(id).css({'-webkit-transition' : prop + ' ' + delay + ' ' + style});
        $(id).css({'-moz-transition' : prop + ' ' + delay + ' ' + style});
        $(id).css({'-o-transition' : prop + ' ' + delay + ' ' + style});
        $(id).css({'transition' : prop + ' ' + delay + ' ' + style});
        callback();
    }
    setParentTransition(id, 'background', '0s', 'ease', function() {
        $('#elementID').addClass('addedClass');
    });
    
    setTimeout(function() {
        setParentTransition(id, 'background', '2s', 'ease', function() {
            $('#elementID').removeClass('addedClass');
        });
    });
    

    这会立即将背景颜色变为#5eb4fc,然后在 2 秒内慢慢变回正常。

    这是fiddle

    【讨论】:

      【解决方案6】:

      虽然这个问题已经相当老了,但我正在添加其他答案中不存在的信息。

      一旦事件完成,OP 正在使用 stop() 停止当前动画。但是,在函数中使用正确的参数组合应该会有所帮助。例如。 stop(true,true) 或 stop(true,false) 因为这会很好地影响排队的动画。

      以下链接演示了一个演示,该演示显示了 stop() 可用的不同参数以及它们与 finish() 的区别。

      http://api.jquery.com/finish/

      虽然 OP 使用 JqueryUI 没有问题,但这适用于可能遇到类似场景但无法使用 JqueryUI/也需要支持 IE7 和 8 的其他用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 2018-03-02
        • 2012-01-15
        • 1970-01-01
        • 2017-12-06
        • 2013-08-14
        相关资源
        最近更新 更多