js运动动画的八个知识点


Posted in Javascript onMarch 12, 2015

今天简单的学了一下js运动动画,记录一下自己的心得体会,分享给大家。

      下面是我整理出来的结果。

知识点一:速度动画。

      1.首先第一步实现速度运动动画,封装一个函数,用到的知识是setInterval(function(){

oDiv.style.left=oDiv.offsetLeft+10+"px";

},30).

对于这里为什么要用到offsetLeft,我特意百度了一下,我得到的有用信息是:

a.offsetLeft和left的相同之处都是表示子节点相对于父节点的左位置。

b.但是left是既可以读又可以写的,而offsetLeft是只读的;

c.并且offsetLeft是没有单位的,获取子节点位置的时候后面不带px。

这里在引申一下其他的知识,感谢这位博主,http://blog.163.com/hongshaoguoguo@126/blog/static/18046981201372885729561/。

2.让运动的节点停止下来,这里我们用if语句做一个验证,如果offsetLeft==0,clearInterval(timer),这里的timer应该事先初始化=null,然后将之前的那个运动动画赋值给它。

3.这里有一个问题,如果在运动结束之前再次触发的运动,那么运动的速度会累加,这里,只要在整个运动开始之前,clearInterval(timer)就可以了。

4.设置移入移除效果,给运动设置参数,一个是速度speed,一个是目标位置iTarget,我们发现速度也是可以通过ITarget的位置来判断的,所以只需要一个参数即可。

知识点二:透明度渐变

1.其实,跟刚刚是差不多的,只不过ITarget的值为透明度而已,流程还是清除定时器再开一个定时器判断等等。

2.定义一个参数alpha=透明度,注意定时器里面应该这样写:

alpha+=speed;

oDiv.style.filter='alpha(opacity:'+alpha+')';         //这是非常重要的一种方法,注意是这样写的

oDiv.style.opacity=alpha/100;            //注意不要忘记除以100

3.以上都是行内样式。

知识点三:缓冲运动

1.缓冲运动就是距离越大,速度就愈大,距离越小,速度就越小,即速度与距离有关。

2.根据上面的说法,对速度进行重新的定义,一开始速度为0,而现在:

var speed=iTarget-oDiv.offsetLeft;

重新定义定时器:

oDiv.style.left=oDiv.offsetLeft+speed+'px';

此时我们发现速度太大了,可以这样:

var speed=(iTarget-oDiv.offsetLeft)/10;

3.此时会有一个严重的问题,因为屏幕的最小单位为px,所以会出现最终的left值为小数,而不为目标的iTarget,可以通过判断来解决,这里要引入Math.floor(),这是向下取整,同样还有Math.ceil(),这是向上取整。在定义speed后我们这样写:

speed=speed>0?Math.ceil(speed):Math.floor(speed);           

这样就可以完全保证速度都是整数,并且在临界值上都为0。

知识点四:多物体运动

1.先获取所有的物体,形成一个数组,然后再用for循环来做(这种方法多么经典呀!),在for循环中添加节点事件,在函数中可以用this代替当前的节点,eg:startMove(this,iTarget),定义函数时startMove(obj,iTarget).

2.取当前宽度offsetWidth的时候就要用obj的值了。

3.当鼠标移动特别快的时候,节点的宽度未能恢复原状,这是因为定时器是大家公用的定时器,上一个节点还未恢复原状下一个节点就已经清除定时器了,解决的办法就是给每一个节点加一个index,就是在上面的for循环中加上aDiv[i].timer=null;然后再定义函数中用obj.timer替换timer。由此我们要注意共用定时器会出事的。

4.透明度的运动中,alpha代替了speed,但是即使定时器不共用,多物体的运动也会出现问题,这是因为alpha公用的原因,导致各物体相互撕扯,解决办法就是可以像timer那样在for循环中给每个节点都分配alpha。

      总结:解决冲突问题,要么初始化,要么个性化。

知识点五.获取样式

1.在改变节点宽度(移入大,移除小)的定时器中,如果给节点添加一个border边框,那么在移入的时候比目标节点小,移出的时候比目标节点大。注意width+padding+scrollbar(滚动条)+border,所以原因就是每次offset都会增加border*2-(定时器中每次减少的数值)。

2.解决以上问题的办法就是在行内写入width,并且使用parseInt(oDiv.style.width)代替offsetLeft,但是并不能总是写在行内,所以我们定义一个函数,获取链入样式:

function getStyle(obj,attr){


if(obj.currentStyle){



return obj.currentStyle[attr];
                     //ie浏览器 


}


else{



return getComputerStyle(obj,false)[attr];          //其他浏览器


}

}

3.对于font-size这种,在js里只有fontSize这一种写法。

知识点六:任意属性值

1.所有的offset-的都会有小bug,要用getStyle函数,这个函数经常和parseInt()一起用,并通常用变量保存。

2.在写style.width的时候,也可以写成style['width']。

3.对于多物体的属性值调整,可以将样式作为参数封装一下,这样多物体属性的函数就包括了(obj,attr,iTarget)这三个属性值。

4.以上的这个运动框架是不适合于透明度变化的,因为透明度都是小数的,因为两个原因,第一是parseInt,第二是attr=...+px,这里我们可以用一个if判读来对透明度进行单独处理,将parseInt换成parseFloat,去掉px。

5.计算机本身是有一个bug的,0.07*100并不等于7,所以我们引入一个函数是Math.round(),这是一个四舍五入的值。

知识点七:链式运动

1.引入move.js框架。

2.传入一个回调函数fn(),用if判断,如果有fn(),那么执行fn()。

知识点八:同时运动

1.如果写两个运动函数来控制同时运动,会发生函数覆盖。

2.使用json这个知识点,json的循环是使用for(i in json),运动函数的参数为obj,json,fn。

3.没有iTarget这个值了,取而代之的是json[attr].

写到这里,就已经完全结束了,希望大家能够喜欢。也希望对大家学习js运动动画能够有所帮助。

Javascript 相关文章推荐
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
jquery下checked取值问题的解决方法
Aug 09 Javascript
[原创]推荐10款最热门jQuery UI框架
Aug 19 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
transport.js和jquery冲突问题的解决方法
Feb 10 Javascript
jquery通过closest选择器修改上级元素的方法
Mar 17 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
vue使用高德地图根据坐标定位点的实现代码
Aug 22 Javascript
vue.js 实现a标签href里添加参数
Nov 12 Javascript
微信小程序点击滚动到指定位置的实现
May 22 Javascript
jquery实现简单每周轮换的日历
Sep 10 jQuery
js实现最短的XML格式化工具实例
Mar 12 #Javascript
微信中一些常用的js方法汇总
Mar 12 #Javascript
javascript实现checkBox的全选,反选与赋值
Mar 12 #Javascript
jQuery通过扩展实现抖动效果的方法
Mar 11 #Javascript
jQuery实现字符串按指定长度加入特定内容的方法
Mar 11 #Javascript
jquery利用命名空间移除绑定事件的方法
Mar 11 #Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 #Javascript
You might like
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
jQuery Validate验证框架经典大全
2015/09/23 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
详解js类型判断
2018/05/22 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
python获取指定时间差的时间实例详解
2017/04/11 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
对python 调用类属性的方法详解
2019/07/02 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
应届毕业生求职信范例分享
2013/12/17 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
学校党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
罚款通知怎么写
2015/04/22 职场文书
个人求职意向书
2015/05/11 职场文书
小马王观后感
2015/06/11 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
python中的getter与setter你了解吗
2022/03/24 Python
Nginx如何配置根据路径转发详解
2022/07/23 Servers