本文介绍如何使用原生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程序设计及动画实现有所帮助。