原⽣js实现jquery函数animate()动画效果的简单实例
通过在公司⼀个⽉的实习,慢慢的对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 ? il(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 ComputedStyle(obj, null)[arr];
}
}
obj.timer = setInterval(function(){
/
/j ++;
var flag = true;
for(var arr in json) {
var icur = 0;
//k++;
if(arr == "opacity") {
icur = und(parseFloat(getStyle(obj, arr))*100);
} else {
icur = parseInt(getStyle(obj, arr));
}
var speed = (json[arr] - icur) * sp;
speed = speed > 0 ? il(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 = ElementById("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>
jquery翻书效果以上这篇原⽣js实现jquery函数animate()动画效果的简单实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论