包含匀速动画效果、缓冲动画效果、透明度动画、多物体动画等 ### 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];
}
}
}
