当前位置 : 主页 > 网络编程 > JavaScript >

9种原生js动画效果

来源:互联网 收集:自由互联 发布时间:2021-06-30
包含匀速动画效果、缓冲动画效果、透明度动画、多物体动画等 ### 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];
        }
    }
}
网友评论