You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jQuery animate()实现box-shadow动画效果?

解决jQuery animate实现box-shadow悬停动画失效的问题

嘿,我来帮你搞定这个hover时的box-shadow动画问题~

你的问题出在jQuery原生的animate方法不支持直接动画复合CSS属性,比如box-shadow这种包含多个值(x偏移、y偏移、模糊度、颜色)的属性,它只能处理单一数值类型的属性(比如top、width这类)。下面给你两种解决方案,优先推荐第一种哦:

方案一:用CSS Transition实现(更简单高效)

其实这个需求完全不需要JavaScript,用CSS的transition就能轻松实现,代码更简洁,性能也更好:

首先给你的li元素添加基础样式(记得加上position: relative,不然top属性不会生效):

#skill_list li {
  position: relative;
  /* 定义过渡动画的参数:所有属性、时长100ms、linear缓动 */
  transition: all 0.1s linear;
}

然后写hover伪类的样式:

#skill_list li:hover {
  top: -5px;
  box-shadow: 10px 10px red;
}

这样鼠标悬停时就会自动触发动画,离开时也会平滑恢复,完全不用写JS代码~

方案二:用jQuery实现(需要扩展支持)

如果一定要用jQuery来做,你有两个选择:

1. 引入jQuery UI

jQuery UI扩展了原生animate的能力,支持box-shadow这类复合属性。引入之后,你只需要稍微调整一下box-shadow的写法(尽量写完整的属性值):

$(document).ready(function () {
  $('#skill_list li').hover(function () {
    $(this).animate({ 
      top: "-5px", 
      boxShadow: "10px 10px 0 red" // 补充模糊度参数,让jQuery UI更好识别
    }, 100, "linear").clearQueue();
  }, function () {
    $(this).animate({ 
      top: "0px", 
      boxShadow:"0px 0px 0 red" 
    }, 100, "linear").clearQueue();
  });
});

2. 自定义step函数(无需额外库)

如果不想引入jQuery UI,可以通过animate的step函数手动更新box-shadow属性,用一个自定义数值属性作为动画的过渡变量:

$(document).ready(function () {
  $('#skill_list li').hover(function () {
    $(this).animate(
      { 
        top: "-5px",
        // 自定义两个数值属性,用来控制阴影的偏移量
        shadowX: 10,
        shadowY: 10
      }, 
      {
        duration: 100,
        easing: "linear",
        step: function(now, fx) {
          // 每次动画帧更新时,同步设置box-shadow
          if (fx.prop === "shadowX" || fx.prop === "shadowY") {
            $(this).css("box-shadow", `${fx.shadowX}px ${fx.shadowY}px red`);
          }
        },
        // 动画结束后确保样式正确
        complete: function() {
          $(this).css("box-shadow", "10px 10px red");
        }
      }
    ).clearQueue();
  }, function () {
    $(this).animate(
      { 
        top: "0px",
        shadowX: 0,
        shadowY: 0
      }, 
      {
        duration: 100,
        easing: "linear",
        step: function(now, fx) {
          if (fx.prop === "shadowX" || fx.prop === "shadowY") {
            $(this).css("box-shadow", `${fx.shadowX}px ${fx.shadowY}px red`);
          }
        },
        complete: function() {
          $(this).css("box-shadow", "0px 0px");
        }
      }
    ).clearQueue();
  });
});

总结

个人强烈推荐用CSS Transition的方案,不仅代码少,而且浏览器对CSS动画的优化比JS动画更好,体验更流畅~

内容的提问来源于stack exchange,提问作者Kashyap Pavra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:27:56