本文详解如何使用JavaScript实现网页动画,重点解析匀速运动与缓冲运动的原理。通过setInterval控制步长,匀速动画需处理步长与目标距离的非整数倍误差,缓冲动画则根据距离动态调整步长。代码包含HTML/CSS/JS完整示例,强调清除定时器和重置边距的关键注意事项。
JavaScript动画实现背景
虽然CSS3提供了丰富的属性来快速实现网页动画效果,但为了确保在不同浏览器中的兼容性,有时仍需借助JavaScript来编写动画逻辑。
利用JavaScript实现动画的核心在于setInterval函数,其基本用法此处不再赘述,如有需要可自行查阅相关资料。本文的重点在于阐述动画背后的实现原理以及开发过程中的关键要点。
按照惯例,首先展示完整代码,读者若已熟悉流程可直接跳过阅读。
代码结构示例
HTML结构部分如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>move</title>
<link rel="stylesheet" href="move1.css">
</head>
<body>
<input type="button" value="匀速移动" id="move1">
<input type="button" value="渐变移动" id="move2">
<div id="box1" class="box"></div>
<div id="box2" class="box"></div>
<script type="text/javascript" src="move1.js"></script>
</body>
</html>
CSS样式部分如下:
*{
margin: 0px;
padding: 0px;
}
.box{
width: 100px;
height: 100px;
background-color: green;
position: relative;
margin-top: 10px;
}
JavaScript逻辑部分如下:
/**
* Created by siri on 2016/9/10.
*/
window.onload=function () {
var btn1 = document.getElementById('move1');
var btn2 = document.getElementById('move2');
var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
btn1.onclick = function () {
animate1(box1,500);
}
btn2.onclick = function () {
animate2(box2,500);
}
//匀速动画
function animate1(ele,target){
//要用定时器,先清除定时器
//一个盒子只能有一个定时器,这样儿的话,不会和其他盒子出现定时器冲突
//而定时器本身讲成为盒子的一个属性
clearInterval(ele.timer);
//我们要求盒子既能向前又能向后,那么我们的步长就得有正有负
//目标值如果大于当前值取正,目标值如果小于当前值取负
var speed = target>ele.offsetLeft?3:-3;
ele.timer = setInterval(function () {
//在执行之前就获取当前值和目标值之差
var val = target - ele.offsetLeft;
ele.style.left = ele.offsetLeft + speed + "px";
//目标值和当前值只差如果小于步长,那么就不能再前进了
//因为步长有正有负,所有转换成绝对值来比较
console.log(val);
if(Math.abs(val)<=Math.abs(speed)){
ele.style.left = target + "px";
clearInterval(ele.timer);
}
},30);
}
//缓动动画封装
function animate2(ele,target) {
clearInterval(ele.timer); //清楚历史定时器
ele.timer = setInterval(function () {
//获取步长 确定移动方向(正负值) 步长应该是越来越小的,缓动的算法。
var step = (target-ele.offsetLeft)/10;
//对步长进行二次加工(大于0向上取整,小于0项下取整)
step = step>0?Math.ceil(step):Math.floor(step);
//动画原理: 目标位置 = 当前位置 + 步长
console.log(step);
ele.style.left = ele.offsetLeft + step + "px";
//检测缓动动画有没有停止
if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){
ele.style.left = target + "px"; //直接移动指定位置
clearInterval(ele.timer);
}
},30);
}
}
HTML和CSS主要起到搭建框架的作用,此处不做过多展开。需要特别注意的是,必须将全局的margin和padding清零,否则初始的边距值会干扰位置计算,导致动画无法正确停止。
JavaScript代码的具体解析已在源码中详细标注,下文将重点讲解其核心原理。
匀速运动原理
匀速运动实现方式:
通过setInterval函数控制每固定毫秒数运动的距离。当接近目标位置时,需判断当前步长与剩余距离的关系:若步长大于剩余距离,则直接将元素定位到目标位置。这一处理旨在避免因步长与总距离非整数倍关系而导致的最终位置偏差。
缓冲运动原理
缓冲运动实现方式:
缓冲运动的基础函数与匀速运动相同,区别在于步长的计算方式。缓冲运动中,步长由当前元素与目标位置的距离决定,随着距离缩短,步长逐渐减小,从而产生缓冲效果。在计算步长时,使用Math.ceil和Math.floor进行取整处理,以避免小数带来的累积误差,确保最终位置准确。
开发注意事项
关键注意事项:在每次启动新的移动逻辑前,务必使用clearInterval清除之前的定时器,防止多个定时器叠加导致动画异常。
以上内容涵盖了本文的所有知识点,希望对各位的学习有所帮助,也欢迎大家继续支持本站。