使用 jQuery 动画 addClass/removeClass

IT技术 javascript jquery css jquery-ui jquery-animate
2021-02-04 04:17:59

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

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

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

另一种方法是使用addClass()andremoveClass()但我无法重新创建我可以使用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 向元素添加一个临时样式,然后增加适当的值,直到它们达到提供的类的值,然后才真正添加/删除类。

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

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


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

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

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

6个回答

既然你不担心 IE,为什么不直接使用 css transitions 来提供动画和 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;
}
截至- IE 10+ - Chrome 26+ - FireFox 16+ - Safari 6.1+ - Opera 12.1+ 2015 年 6 月 12 日-webkit、-moz、-o 仅支持更旧的浏览器。您可能可以将其省略以节省一些空间。
2021-04-01 04:17:59
@clst,我更喜欢向后兼容旧浏览器而不是节省几个字节的空间。
2021-04-07 04:17:59

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

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

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

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

@Richard Neil Ilagan:感谢您的通知。我真的错过了这一点。
2021-03-14 04:17:59
您能否指出要下载并包含在 .html 文件中的文件,以便我可以仅使用 jQueryUI 以xxxClass这种方式进行动画补间?
2021-03-27 04:17:59
[jqueryui.com](jqueryui.com) @sodiumnitrate
2021-03-28 04:17:59
此解决方案也不以与 slide() 或 animate() 相同的方式制作动画。毫秒值是一个延迟,它不是动画。
2021-03-31 04:17:59
请注意,这需要 jQuery UI。开箱即用的 jQuery 不支持xxxClass()函数的动画补间
2021-04-06 04:17:59

你可以使用 jquery ui's switchClass,这是一个例子:

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

或者看这个jsfiddle

-1. 您不符合我在原始帖子中列出的限制 1、2 和 3。特别是 switchClass 处理要求 2 和 3 很差。
2021-04-06 04:17:59

您只需要jQuery UI 效果核心(13KB),即可启用添加的持续时间(就像 Omar Tariq 指出的那样)

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

这就是我最终做的:

//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 秒内缓慢恢复正常。

这是一把小提琴