博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript匀速动画和缓冲动画
阅读量:6638 次
发布时间:2019-06-25

本文共 2732 字,大约阅读时间需要 9 分钟。

hot3.png

关于网页中的动画,在css3中我们已经可以使用一些属性快速的做出来,但是有时候为了浏览器的兼容性我们还是需要使用js来制作网页中的动画。

使用js做动画最重要的一个函数就是setInterval函数,这里不再赘述,不懂可以直接百度用法。本文主要讲动画的原理已经在制作过程中的要点。

老规矩,先上代码,能直接看懂的可以节省时间。

html部分:

    
move

css部分:

*{    margin: 0px;    padding: 0px;}.box{    width: 100px;    height: 100px;    background-color: green;    position: relative;    margin-top: 10px;}
js部分:

/** * 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基本就是为了我们的js部分搭框架,不讲太多,
要注意的是,一定要对全局的margin和padding清零,否则的话他在计算的时候初始的margin和padding会影响计算,从而导致有时候运动不停止的情况。

javascript部分代码的解析在源码中已经很详细了,下面主要讲解原理。

匀速运动:

通过setInterval函数我们控制每多少毫秒运动的距离,然后在快要到达指定位置的时候,判断步长(每多少毫秒运动的距离)和此时和目标位置的距离,如果步长大于此时和目标位置的距离,则直接定位到目标位置,这样做是为了避免步长和总距离不是整数倍关系而产生最后到达位置和目标位置有差值的错误。

缓冲运动:

缓冲运动的基本函数是和匀速运动一样的,只是缓冲运动的步长我们是通过和目标位置的距离来确定的,这样我们的步长是不断变小的,从而实现缓冲运动的效果。在确定步长的时候我们使用Math.ceil和Math.floor对步长值进行取整是为了避免出现小数,因为如果出现小数后面最后到达的位置肯定是和目标位置有误差的。

注意事项:在每次移动开始前一定要使用clearInterval清除定时器。

转载于:https://my.oschina.net/u/2966158/blog/760535

你可能感兴趣的文章
百度地图SDK for Android【Demo兴趣点搜索】
查看>>
动态规划6-最长上升子序列
查看>>
shell 中各种符号的含义
查看>>
Zabbix 3.0 LTS安装配置
查看>>
PHP基础
查看>>
【IPC进程间通讯之三】内存映射文件Mapping File
查看>>
easyui 时间段校验,开始时间小于结束时间,并且时间间隔不能超过30天
查看>>
centos上安装配置java WEB环境_java(转)
查看>>
oracle procedure存储过程
查看>>
logstash进程杀不掉
查看>>
Linux中磁盘分区、格式化、挂载等管理
查看>>
HTML5学习之FileReader接口
查看>>
在QT搭建的播放器外壳中嵌入SDL的窗口
查看>>
让anujs支持rc-select
查看>>
iphone微信 h5页音乐自动播放
查看>>
018_nginx_proxy死循环问题
查看>>
MySQL主从复制搭建教程收集(待实践)
查看>>
简要分析webpack打包后代码
查看>>
解决AJAX跨域:1、利用JSONP;2、JS设置Header
查看>>
Zephyr的Power Management
查看>>