//接近完美运动框架,支持同一对象属性同时进行运动。运动完成后执行方法 function goChange(obj, josn, fn) {//obj:传入对象实参;josn:传入{属性/属性值,...}的josn串;fn传入需要在执行完运动后被执行的函数 clearInterval(obj.timer); obj.timer = setInterval(function() { var flag = true; for (var attr in josn) { var iCour=0; if (attr=='opacity') { iCour=Math.round(parseFloat(getAttr(obj, attr))*100); } else{ iCour = parseInt(getAttr(obj, attr)); } var speed = (josn[attr] - iCour) / 10; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (iCour != josn[attr]) { flag = false; // clearInterval(obj.timer); } if (attr=='opacity') { obj.style[attr] = (iCour + speed)/100; } else{ obj.style[attr] = iCour + speed + 'px'; } } if (flag) { clearInterval(obj.timer); if (fn) { fn(); } } }, 30); } //获取属性 function getAttr(obj, attr) { return obj.currentStyle ? obj.currentStyle[attr] : document.defaultView.getComputedStyle(obj, false)[attr]; }