JavaScript 实现类似 jQuery animate 的链式动画效果

作者:小圆点

时间:2026-10-29

浏览:97

本文介绍如何使用原生JavaScript实现类似jQuery animate的链式动画效果。通过递归调用定时器函数,依次改变元素的宽度、高度和透明度,并在运动结束后执行回调函数,实现鼠标移入移出时的平滑过渡效果。

文章目录

JavaScript 链式动画实现原理

本文详细介绍了一种使用原生JavaScript实现类似jQuery中animate()方法动画效果的技术方案,供开发者参考学习。

该示例展示了鼠标悬停时的交互逻辑:元素先改变宽度,随后改变高度,最后调整透明度;鼠标移开时,则按相反顺序依次恢复各项属性。

实现该效果的关键点之一在于函数参数的应用。

核心函数与调用逻辑


startrun(obj,attr,target,fn)
box.onmouseover = function(){
startrun(box,"width",200,function(){
startrun(box,"height",200,function(){
startrun(box,"opacity","100")
});
});
}

通过将回调函数作为参数传递,可以实现动作的串行执行,即确保前一个动画动作完成后,再触发下一个动作。

实现该效果的第二个关键点在于定时器的管理。

运动结束与回调处理


if(cur == target){
clearInterval(obj.timer);
if(fn){
fn();
}
}

当元素运动到达目标值时,需要清除当前的定时器,并立即执行后续传入的回调函数,从而保证动画步骤的准确衔接。

以下是完整的实现代码示例。

完整 HTML 与 CSS 结构


<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312" />
<title>无标题文档</title>
<style>
<!--
body{margin:0; padding:0; font:12px/1.5 arial;}
#box{width:100px; height:100px; position:absolute;
background:#06c; left:0;filter:alpha(opacity=30); opacity:0.3;}
-->
</style>
<script>
<!--
function getstyle(obj,name){
 if(obj.currentStyle){
  return obj.currentStyle[name];
 }else{
  return getComputedStyle(obj,false)[name];
 }
}
window.onload = function(){
 var box = document.getElementById("box");
 box.onmouseover = function(){
  startrun(box,"width",200,function(){
   startrun(box,"height",200,function(){
    startrun(box,"opacity","100")
   });
  });
 }
 box.onmouseout = function(){
  startrun(box,"height",100,function(){
   startrun(box,"width",100,function(){
    startrun(box,"opacity","30");
   });
  });
 }
}
function startrun(obj,attr,target,fn){
 clearInterval(obj.timer);
 obj.timer = setInterval(function(){
  var cur = 0;
  if(attr == "opacity"){
   cur = Math.round(parseFloat(getstyle(obj,attr))*100);
  }else{
   cur = parseInt(getstyle(obj,attr));
  }
  var speed = (target-cur)/8;
  speed = speed>0?Math.ceil(speed):Math.floor(speed);
  
  if(cur == target){
   clearInterval(obj.timer);
   if(fn){
    fn();
   }
  }else{
   if(attr == "opacity"){
    obj.style.filter = "alpha(opacity="+(cur+speed)+")";
    obj.style.opacity = (cur+speed)/100;
   }else{
   obj.style[attr] = cur + speed + "px";
   }
  }
 },30)
}
//-->
</script>
</head>
<body>
<div id="box">
</div>
</body>
</html>

希望上述内容能对掌握JavaScript程序设计及动画实现有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章