animate用法 js原生_浅谈原生JS实现jQuery的animate()动画示例

本文详细解析了如何使用原生JavaScript实现类似jQuery的animate()动画效果,包括参数介绍、注意事项和示例代码。通过调整速度因子实现缓冲效果,并处理opacity属性的特殊性。在鼠标悬停li元素时,演示了动画应用。
摘要由CSDN通过智能技术生成

本文介绍了浅谈原生JS实现jQuery的animate()动画示例,希望此文章对各位有所帮助。

参数介绍:

obj

执行动画的元素

css

JSON数值对,形式为“{属性名: 属性值}",指要执行动画的书序及其对应值

interval

属性每执行一次改变的时间间隔

speedFactor

速度因子,使动画具有缓冲效果,而不是匀速不变(speedFactor为1)

func

执行完动画后的回调函数

注意:

必须为每一个元素分别添加一个定时器,否则会互相影响。

cur != css[arr]判断是否每一个属性已经达到目标值。只有所有属性都达到目标值,才会清除定时器,flag的作用是防止某个属性第一个达到目标值但还有其他属性没有达到目标值的情况下清除定时器。因此,在每次改变前初始化flag为true,只要遇到一个没有达到目标的属性,就将flag置为false,直至所有属性达到目标值才清除定时器。

属性值opacity的值有小数,所以需要特殊处理: Math.ceil(speed)和Math.floor(speed)以及* 100和 / 100操作。

function animate(obj, css, interval, speedFactor, func) {

clearInterval(obj.timer);

function getCss(obj, prop) {

if (obj.currentStyle)

return obj.currentStyle[prop]; // ie

else

return document.defaultView.getComputedStyle(obj, null)[prop]; // 非ie

}

obj.timer = setInterval(function(){

var flag = true;

for (var prop in css) {

var cur = 0;

if(prop == "opacity")

cur = Math.round(parseFloat(getStyle(obj, prop)) * 100);

else

cur = parseInt(getStyle(obj, prop));

var speed = (css[prop] - cur) * speedFactor;

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

if (cur != css[prop])

flag = false;

if (prop == "opacity") {

obj.style.filter = "alpha(opacity : '+(cur + speed)+' )";

obj.style.opacity = (cur + speed) / 100;

}

else

obj.style[prop] = cur + speed + "px";

}

if (flag) {

clearInterval(obj.timer);

if (func)

func();

}

}, interval);

}

var li = document.getElementsByTagName("li");

for(var i = 0; i < li.length; i ++){

li[i].onmouseover = function(){

animate(this, {width: 100, opacity: 0.5}, 10, 0.01, function(){

alert("Finished!");

});

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//获取任意一个元素的任意一个属性的当前的值---当前属性的位置值 function getStyle(element, attr) { return window.getComputedStyle ? window.getComputedStyle(element, null)[attr] : element.currentStyle[attr] || 0; } //动画函数 obj---要执行动画的对象 json---要执行到的目标的参数对象 fn为执行完成后的回调函数(可以再次调用此方法按照上面格式传参--顺序执行多个动画) //调用例: //zIndex:1000 //透明度opacity: 数字类型----小数---放大100倍 // my$("btn1").onclick = function () { // var json1 = {"width": 400, "height": 500, "left": 500, "top": 80, "opacity": 0.2}; // animate(my$("dv"), json1, function () { //var json2={"width": 40, "height": 50, "left": 0, "top": 0, "opacity": 1, "zIndex": 1000} // animate(my$("dv"),json2,function(){按照此格式多次重复添加动画将会顺序执行} ); // }); // }; function animate(element, json, fn) { clearInterval(element.timeId);//清理定时器 //定时器,返回的是定时器的id element.timeId = setInterval(function () { var flag = true;//默认,假设,全部到达目标 //遍历json对象中的每个属性还有属性对应的目标值 for (var attr in json) { //判断这个属性attr中是不是opacity if (attr == "opacity") { //获取元素的当前的透明度,当前的透明度放大100倍 var current = getStyle(element, attr) * 100; //目标的透明度放大100倍 var target = json[attr] * 100; var step = (target - current) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); current += step;//移动后的值 element.style[attr] = current / 100; } else if (attr == "zIndex") { //判断这个属性attr中是不是zIndex //层级改变就是直接改变这个属性的值 element.style[attr] = json[attr]; } else { //普通的属性 //获取元素这个属性的当前的值 var current = parseInt(getStyle(element, attr)); //当前的属性对应的目标值 var target = json[attr]; //移动的步数 var step = (target - current) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); current += step;//移动后的值 element.style[attr] = current + "px"; } //是否到达目标 if (current != target) { flag = false; } } if (flag) { //清理定时器 clearInterval(element.timeId); //所有的属性到达目标才能使用这个函数,前提是用户传入了这个函数 if (fn) { fn(); } } //测试代码 console.log("目标:" + target + ",当前:" + current + ",每次的移动步数:" + step); }, 20); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值