包含匀速动画效果、缓冲动画效果、透明度动画、多物体动画等 ### 1,匀速动画效果```window.onload = function() { var odiv = document.getElementById('odiv'); odiv.onmouseover = function() { startMover(0); } odiv
### 1,匀速动画效果 ``` window.onload = function() { var odiv = document.getElementById('odiv'); odiv.onmouseover = function() { startMover(0); } odiv.onmouseout = function() { startMover(-200); } } var timer = null; function startMover(itarget) { //目标值 clearInterval(timer); //执行当前动画同时清除之前的动画 var odiv = document.getElementById('odiv'); timer = setInterval(function() { var speed = 0; if (odiv.offsetLeft > itarget) { speed = -1; } else { speed = 1; } if (odiv.offsetLeft == itarget) { clearInterval(timer); } else { odiv.style.left = odiv.offsetLeft + speed + 'px'; } }, 30); } ``` ### 2,缓冲动画效果 ``` window.onload = function() { var odiv = document.getElementById('odiv'); odiv.onmouseover = function() { startMover(0); } odiv.onmouseout = function() { startMover(-200); } } var timer = null; function startMover(itarget) { //速度和目标值 clearInterval(timer); //执行当前动画同时清除之前的动画 var odiv = document.getElementById('odiv'); timer = setInterval(function() { var speed = (itarget - odiv.offsetLeft) / 10; //缓冲动画的速度参数变化值 //如果速度是大于0,说明是向右走,那么就向上取整 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); //Math.floor();向下取整 if (odiv.offsetLeft == itarget) { clearInterval(timer); } else { //clientLeft 返回对象的offsetLeft属性值和到当前窗口左边的真实值之间的距离 odiv.style.left = odiv.offsetLeft + speed + 'px'; } }, 30); } ``` ### 3,透明度动画 ``` window.onload = function() { var odiv = document.getElementsByTagName('div'); for (var i = 0; i < odiv.length; i++) { odiv[i].onmouseover = function() { startOP(this, 100); } odiv[i].onmouseout = function() { startOP(this, 30); } odiv[i].timer = null; //事先定义 odiv[i].alpha = null; //事先定义 //这里发现一个问题,对象的动画属性可以不定义,但是透明度属性必须定义,否则报错 } } function startOP(obj, utarget) { clearInterval(obj.timer); //先关闭定时器 obj.timer = setInterval(function() { var speed = 0; if (obj.alpha > utarget) { speed = -10; } else { speed = 10; } obj.alpha = obj.alpha + speed; if (obj.alpha == utarget) { clearInterval(obj.timer); } obj.style.filter = 'alpha(opacity:' + obj.alpha + ')'; //基于IE的 obj.style.opacity = parseInt(obj.alpha) / 100; }, 30); } ``` ### 4,多物体动画 ``` window.onload = function() { var olist = document.getElementsByTagName('li'); for (var i = 0; i < olist.length; i++) { olist[i].onmouseover = function() { startmov(this, 400); }; olist[i].onmouseleave = function() { startmov(this, 200); }; olist[i].timer = null; } function startmov(obj, itarget) { clearInterval(obj.timer); //执行动画之前清除动画 obj.timer = setInterval(function() { var speed = 0; speed = (itarget - obj.offsetWidth) / 8; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (obj.offsetWidth == itarget) { clearInterval(obj.timer); } else { obj.style.width = obj.offsetWidth + speed + 'px'; } }, 30); } } ``` ### 5,获取样式动画 ``` window.onload = function() { var odiv = document.getElementById('odiv'); odiv.onmouseover = function() { startMov(this); }; function startMov(obj) { setInterval(function() { obj.style.width = parseInt(getStyle(obj, 'width')) + 1 + 'px'; obj.style.fontSize = parseInt(getStyle(obj, 'fontSize')) + 1 + 'px'; }, 30); } function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } } ``` ### 6,多物体复杂动画 ``` window.onload = function() { var li1 = document.getElementById('li1'); var li2 = document.getElementById('li2'); li1.onmouseover = function() { startMov(this, 400, 'width'); }; li1.onmouseout = function() { startMov(this, 200, 'width'); }; li2.onmouseover = function() { startMov(this, 200, 'height'); }; li2.onmouseout = function() { startMov(this, 100, 'height'); }; function startMov(obj, itarget, attr) { clearInterval(obj.timer); //执行动画之前清除动画 obj.timer = setInterval(function() { var icur = parseInt(getStyle(obj, attr)); var speed = 0; speed = (itarget - icur) / 8; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (icur == itarget) { clearInterval(obj.timer); } else { obj.style[attr] = icur + speed + 'px'; } }, 30); } function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } } ``` ### 7,多物体复杂动画(带透明度的) ``` window.onload = function() { var li1 = document.getElementById('li1'); var li2 = document.getElementById('li2'); li1.onmouseover = function() { startMov(this, 100, 'opacity'); }; li1.onmouseout = function() { startMov(this, 30, 'opacity'); }; li2.onmouseover = function() { startMov(this, 200, 'height'); }; li2.onmouseout = function() { startMov(this, 100, 'height'); } li1.timer = null; li2.timer = null; function startMov(obj, itarget, attr) { clearInterval(obj.timer); //执行动画之前清除动画 obj.timer = setInterval(function() { var icur = 0; if (attr == 'opacity') { icur = Math.round(parseFloat(getStyle(obj, attr)) * 100); //转换成整数,并且四舍五入下 //计算机在计算小数的时候往往是不准确的! } else { icur = parseInt(getStyle(obj, attr)); } var speed = 0; speed = (itarget - icur) / 8; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (icur == itarget) { clearInterval(obj.timer); } else { if (attr == 'opacity') { obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')'; obj.style.opacity = (icur + speed) / 100; } else { obj.style[attr] = icur + speed + 'px'; } } }, 30); } function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } } ``` ### 8,链式动画 ``` window.onload = function() { var li1 = document.getElementById('li1'); li1.onmouseover = function() { startMov(li1, 400, 'width', function() { startMov(li1, 200, 'height', function() { startMov(li1, 100, 'opacity'); }); }); }; li1.onmouseout = function() { startMov(li1, 30, 'opacity', function() { startMov(li1, 100, 'height', function() { startMov(li1, 100, 'width'); }); }); }; li1.timer = null; function startMov(obj, itarget, attr, fn) { //fn回调函数 clearInterval(obj.timer); //执行动画之前清除动画 obj.timer = setInterval(function() { var icur = 0; if (attr == 'opacity') { icur = Math.round(parseFloat(getStyle(obj, attr)) * 100); //转换成整数,并且四舍五入下 //计算机在计算小数的时候往往是不准确的! } else { icur = parseInt(getStyle(obj, attr)); } var speed = 0; speed = (itarget - icur) / 8; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (icur == itarget) { clearInterval(obj.timer); if (fn) { fn(); } } else { if (attr == 'opacity') { obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')'; obj.style.opacity = (icur + speed) / 100; } else { obj.style[attr] = icur + speed + 'px'; } } }, 30); } function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } } ``` ### 9,多物体同时运动动画 ``` window.onload = function() { var li1 = document.getElementById('li1'); li1.onmouseover = function() { startMov(li1, { width: 201, height: 200, opacity: 100 }); }; li1.onmouseout = function() { startMov(li1, { width: 200, height: 100, opacity: 30 }); }; li1.timer = null; function startMov(obj, json, fn) { //fn回调函数 clearInterval(obj.timer); //执行动画之前清除动画 var flag = true; //是否动画都完成了 obj.timer = setInterval(function() { for (var attr in json) { var icur = 0; if (attr == 'opacity') { icur = Math.round(parseFloat(getStyle(obj, attr)) * 100); //转换成整数,并且四舍五入下 //计算机在计算小数的时候往往是不准确的! } else { icur = parseInt(getStyle(obj, attr)); } var speed = 0; speed = (json[attr] - icur) / 8; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (icur != json[attr]) { flag = false; } if (attr == 'opacity') { obj.style.filter = 'alpha(opacity:' + (icur + speed) + ')'; obj.style.opacity = (icur + speed) / 100; } else { obj.style[attr] = icur + speed + 'px'; } if (flag) { clearInterval(obj.timer); if (fn) { fn(); } } } }, 30); } function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } }