jQuery 动画效果

动画是 jQuery 当年的"杀手特性"之一——在那个没有 CSS transition 的年代,jQuery 用纯 JS 帮你实现淡入淡出、滑动、自定义动画,一行代码搞定。即使在 CSS 动画普及的今天,动态属性动画仍是 jQuery 的强项。

1. 显示与隐藏:show / hide / toggle

最基础的三个动画方法。不带参数是瞬间切换,带速度参数就变成动画。它们的本质是改 display 属性

// 基础:显示 / 隐藏 / 切换
$("#box").hide();              // display: none,瞬间隐藏
$("#box").show();              // 恢复原来的 display,瞬间显示
$("#box").toggle();            // 当前是显示就隐藏,反之显示

// 带速度参数:slow / normal / fast / 毫秒数
$("#box").hide(1000);          // 1 秒内淡出消失
$("#box").show("slow");        // ~600ms 内显示
$("#box").toggle("fast");      // ~200ms 切换

// 带回调:动画结束后执行
$("#box").hide(1000, function () {
  console.log("隐藏完成了");
});

速度参数支持三个字符串(slow 600ms、normal 400ms、fast 200ms)或任意毫秒数。回调在动画完成时触发,常用来串联下一步操作。

2. 淡入淡出:fadeIn / fadeOut / fadeTo

这组方法只改 opacity,比 show/hide 更适合"柔和"的视觉效果。淡出后元素会自动设为 display:none,不影响布局。

// 淡入淡出:只改 opacity,再改 display
$("#box").fadeIn();            // 隐藏 → 显示(淡入)
$("#box").fadeOut();           // 显示 → 隐藏(淡出)
$("#box").fadeToggle();        // 切换

// 淡到指定透明度(不隐藏)
$("#box").fadeTo(1000, 0.5);   // 1 秒淡到 50% 透明

// 速度同样支持 slow/fast/毫秒
$("#box").fadeIn("slow");
$("#box").fadeOut(300, function () {
  console.log("淡出完了");
});

fadeTo 是个被低估的方法——它不会让元素消失,只是淡到指定透明度。做"半透明遮罩"、"高亮当前项、淡化其他"时特别有用。

3. 滑动:slideDown / slideUp / slideToggle

滑动动画改 height,是最适合做折叠菜单、抽屉面板的效果。十年前的网站侧栏、手风琴、下拉菜单几乎全用这套。

// 滑动:改 height,适合折叠菜单
$("#panel").slideDown();        // 展开(从上往下)
$("#panel").slideUp();          // 收起(从下往上)
$("#panel").slideToggle();      // 切换

// 速度 + 回调
$("#panel").slideDown(500, function () {
  console.log("展开了");
});

// 最经典的折叠菜单
$(".menu-header").on("click", function () {
  $(this).next(".menu-body").slideToggle();
});

配合 .next().children(),可以做出任意层级的折叠菜单。注意滑动动画在元素未设固定高度时表现最佳——已设固定高度的元素动画会显得"卡顿"。

4. 自定义动画:animate

前面三组都是预设效果,真正万能的是 .animate()——你可以让任意数值型 CSS 属性平滑过渡。这是 CSS transition 出现前唯一的"属性动画"方案。

// 自定义动画:.animate(目标属性, 时长, 缓动, 回调)
$("#box").animate({
  width: "400px",
  height: "200px",
  marginLeft: "50px",   // 注意:CSS 的 margin-left 在这里用连字符或驼峰都行
  opacity: 0.5,
}, 1000);

// 缓动函数:默认 "swing"(慢-快-慢),可设 "linear"(匀速)
$("#box").animate({ left: "+=200" }, 1000, "linear");

// 链式排队:多个动画自动排队执行
$("#box")
  .animate({ left: 200 }, 500)
  .animate({ top: 100 }, 500)
  .animate({ left: 0 }, 500)
  .animate({ top: 0 }, 500);  // 走一个方形回到原点

// 回调
$("#box").animate({ width: 500 }, {
  duration: 1000,
  easing: "linear",
  complete: function () { console.log("动画完了"); },
  step: function (now) { /* 每一帧调用 */ },
});

// 限制:animate 只能动画"数值型"属性
// 不能动画 background-image 切换、transform 矩阵(老 jQuery 不支持)
// 现代项目要用 transform 动画,推荐 jQuery 3 + jquery-color 插件

几个要点:动画属性值必须是数值(数字或带单位的字符串);+= / -= 表示相对当前值变化;多个 animate 链式调用会自动排队(这是 jQuery 的"动画队列"机制)。

注意 animate 的局限:它只能动画数值属性(width/height/left/opacity/margin 等),不能动画颜色(要装 jquery-color 插件)和 transform 矩阵。新项目做复杂动画,CSS transition + transform 性能更好。

5. 停止、延迟、清空队列

实际项目中常遇到动画累积问题:用户快速来回操作,动画队列堆了几十个,按钮松开后页面还在动半天。解法是 .stop()

// 停止当前动画
$("#box").stop();              // 立即停止当前动画,停在当前位置
$("#box").stop(true);          // true = 清空队列,后续排队的也取消
$("#box").stop(true, true);    // 第二个 true = 直接跳到当前动画的终点

// finish:清空所有队列,把所有动画跳到终点
$("#box").finish();

// delay:在队列里插入等待
$("#box")
  .fadeOut(500)
  .delay(1000)         // 等待 1 秒
  .fadeIn(500);

// 防止"动画累积"的经典写法
// 场景:用户疯狂移入移出 mouseenter,动画排队堆 100 次
$("#box").on("mouseenter", function () {
  $(this).stop(true).animate({ width: 300 });  // 先 stop 再 animate
});

记住这条规则:动画前先 .stop(true)。这是 jQuery 动画的"防御性编程"——能避免绝大多数累积问题。delay() 则是用来在队列中插入等待时间,做"渐次出现"效果时常用。

6. jQuery 动画 vs CSS 动画

现代项目该用哪个?简单对比一下:

结论:新项目优先 CSS transition + animation,老项目维护或需要复杂序列动画时再用 jQuery。千万别用 jQuery 做高频动画(如游戏循环、滚动视差),性能完全跟不上。

小结

jQuery 动画的"四组一招":show/hide/togglefadeIn/fadeOut/fadeToslideDown/slideUp/slideToggleanimate 自定义、外加 stop 防累积。会这五样,应付绝大多数老 jQuery 代码绰绰有余。下一篇我们看 jQuery 的另一招牌——AJAX 请求

← 上一篇 jQuery DOM 操作

下一篇 jQuery AJAX

✈️💬