视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
原生js实现jquery函数animate()动画效果的简单实例
2020-11-27 20:27:40 责编:小采
文档


通过在公司一个月的实习,慢慢的对css跟html算是比较熟悉了,这几天开始研究js,今天用js写了一个jquery的animate函数,测试了下,性能还可以。个人觉得jquery并不是万能的,因为是个框架,所以有些东西写的比较死,就像animate函数一样,可选的参数不多有时候可能并不能实现我们想要的效果。   

注释的部分是用来测试用的,写代码的过程并不是十分顺利,因为用js平时用的不是很细,都是大体知道方法,也用过,但等到真正要实现动画函数的时候,细枝末节写错了就可能把人难住了。

函数里面有几个参数解释一下,

?obj, 函数的对象

?json, 数值对,形式{attr:”value”, attr: “value”},在这里是指要动画对象的运动属性

?interval, 每执行一次改变的间隔,这里改变的是对象是属性值

?sp, 值变换的速度,使动画具有缓冲效果,而不只是匀速不变(sp为1)的

?fn, 回调函数,执行完动画之后的行为

代码比较简单,只是有几个细节需要注意,在这里提醒一下:

?对象的属性不必直接声明,所以函数的第一句clearInterval(obj.timer);并不会报错。

?必须为每一个对象分别添加一个定时器,否则互相会影响,一个定时器公用的结果是定时器的多个对象运动出现卡顿。

?son数据格式了解一下,当遍历对象的动画属性的时候,需要icur != json[arr]判断是否每一个属性已经达到目标值。flag的作用是防止当其中某个属性第一个达到目标值后,clearInterval(obj.timer)清除了定时器,结果其他动画属性并没有达到目标值。所以在每次遍历的时候初始化flag值为true,只要遇到一个没有达到目标属性的对象,就将flag置为false,直至对象的所有属性达到目标值,清除定时器。

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

这一句的作用是将属性值取整,因为属性值除了opacity没有小数。

?最后调用的时候注意动画的对象,在使用for循环的时候不能随意使用arr[i]形式,尤其是嵌套循环的时候i的值已经变成了最大值。

js

function animate(obj, json, interval, sp, fn) {
 clearInterval(obj.timer);
 //var k = 0;
 //var j = 0;
 function getStyle(obj, arr) {
 if(obj.currentStyle){
 return obj.currentStyle[arr]; //针对ie
 } else {
 return document.defaultView.getComputedStyle(obj, null)[arr]; 
 }
 }
 obj.timer = setInterval(function(){
 //j ++;
 var flag = true;
 for(var arr in json) {
 var icur = 0;
 //k++;
 if(arr == "opacity") {
 icur = Math.round(parseFloat(getStyle(obj, arr))*100);
 } else {
 icur = parseInt(getStyle(obj, arr));
 }
 var speed = (json[arr] - icur) * sp;
 speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);
 if(icur != json[arr]){
 flag = false;
 } 
 if(arr == "opacity"){
 obj.style.filter = "alpha(opacity : '+(icur + speed)+' )";
 obj.style.opacity = (icur + speed)/100;
 }else {
 obj.style[arr] = icur + speed + "px";
 }
 //console.log(j + "," + arr +":"+ flag);
 }
 
 if(flag){
 clearInterval(obj.timer);
 //console.log(j + ":" + flag); 
 //console.log("k = " + k);
 //console.log("j = " + j);
 //console.log("DONE");
 if(fn){
 fn();
 }
 }
 },interval);
}

调用方式:

<script>
 var move = document.getElementById("move").getElementsByTagName("li");
 for(var i = 0; i < move.length; i ++){
 move[i].onmouseover = function(){
 var _this = this;
 animate(_this, {width: 500, height: 200},10, 0.01, function(){
 animate(_this, {width: 300, height: 200},10, 0.01);
 });
 
 }
 }
 
</script>

以上这篇原生js实现jquery函数animate()动画效果的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHP中文网。

更多原生js实现jquery函数animate()动画效果的简单实例相关文章请关注PHP中文网!

下载本文
显示全文
专题