闲来没事就封装一个关于缓冲运动的函数,与其说这是一个缓冲运动函数,不如称这个东西是一个简易的动画库。使用方法也很简单,调用方法传入需要运动的对象、变化的属性集和对应的目标值、变化速率(可选)、方法回调(可选)。支持多个属性同时变化,还可以连续回调,屡试不爽!因为是手写难免会有BUG,后面会持续更新。
版本一:单物体多参数运动,带回调,带速度
function cacheMove (ele, obj, callback, duration) {
clearInterval(ele.timer);
ele.timer = undefined;
var d = duration || 15;
ele.timer = setInterval(function () {
for (var props in obj) {
var s = (obj[props] - getStyle(ele, props)) / d;
if (props === 'opacity') {
var speed = s.toFixed(2) * 1;
ele.style['filter'] = 'alpha(opacity:' + getStyle(ele, props) + speed + ')';
ele.style['opacity'] = (getStyle(ele, props) + speed) / 100;
} else {
var speed = s > 0 ? Math.ceil(s) : Math.floor(s);
ele.style[props] = getStyle(ele, props) + speed + 'px';
}
if (parseFloat(ele.style[props]).toFixed(1) * 1 === (props === 'opacity' ? obj[props] / 100 : obj[props])) {
clearInterval(ele.timer);
ele.timer = undefined;
if (callback && Object.prototype.toString.call(callback) === '[object Function]') callback();
}
}
}, 1000 / 60)
}
function getStyle (ele, attr) {
if (ele.currentStyle) {
if (attr === 'opacity') {
return parseFloat(ele.currentStyle[attr]) * 100;
} else {
return parseInt(ele.currentStyle[attr]);
}
} else {
if (attr === 'opacity') {
return parseFloat(getComputedStyle(ele, null)[attr]) * 100;
} else {
return parseInt(getComputedStyle(ele, null)[attr]);
}
}
}版本二:单物体多参数运动,带回调
function startMove(obj, json, fnEnd) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
var bStop = true;
for (var attr in json) {
var cur = 0;
if (attr === 'opacity') {
cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
} else {
cur = parseInt(getStyle(obj, attr));
}
var speed = (json[attr] - cur) / 6;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if (cur !== json[attr]) bStop = false;
if (attr === 'opacity') {
obj.style.filter = 'alpha(opacity:' + (cur + speed) + ')';
obj.style.opacity = (cur + speed) / 100;
} else {
obj.style[attr] = cur + speed + 'px';
}
}
if (bStop) {
clearInterval(obj.timer);
if (fnEnd) fnEnd();
}
}, 30)
}
function getStyle (obj, name) {
if (obj.currentStyle) {
return obj.currentStyle[name];
} else {
return getComputedStyle(obj, false)[name];
}
}版本三:单物体单参数运动
function startMove(obj, attr, iTarget) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
var cur = 0;
if (attr === 'opacity') {
cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
} else {
cur = parseInt(getStyle(obj, attr));
}
var speed = (iTarget - cur) / 6;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if (cur === iTarget) {
clearInterval(obj.timer);
} else {
if (attr === 'opacity') {
obj.style.filter = 'alpha(opacity:' + (cur + speed) + ')';
obj.style.opacity = (cur + speed) / 100;
} else {
obj.style[attr] = cur + speed + 'px';
}
}
}, 30)
}
function getStyle (obj, name) {
if (obj.currentStyle) {
return obj.currentStyle[name];
} else {
return getComputedStyle(obj, false)[name];
}
}
发表评论