javascript动画效果

之前工作项目中,运用了缓动动画的效果,在网上看到其他大牛写的相关公式,结合工作需要,进行了整理,拿出来跟大家分享下,js代码中,只运用了一个小功能进行了测试

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>测试</title>
</head>
<body>
    <div class="main">
        <div class="scroll">
            <div class="info">
                <ul id="scro">
                    <li>
                        <a href="">
                            <span>1</span>
                            <span></span>
                            <span></span>
                            <span></span>
                        </a>
                    </li>
                </ul>
            </div>
        </div>
    <input type="text" id="orderIndex"><button onclick="start()">测试</button>
    </div>
</body>
</html>
*{margin: auto;padding: 0;}
.main{width: 300px;height: 400px;overflow: hidden;float: left;}
.info ul{position: relative;}
.info ul li{height: 72px;background-color: #444444;list-style: none;border: 1px solid #303030;}
.info ul li a{height: 72px;line-height: 72px;padding-left: 15px;position: relative;display: block;text-decoration: none;}
.info ul li a span{color: #fff;font-size:18px;font-weight:normal;float: left;height: 72px;line-height: 72px;margin-right: 10px;}
.info ul li a .num{width: 25px;}
.info ul li a .photo{width: 70px;}
.info ul li a .photo img{margin-top: 11px;width: 50px;height: 50px;}
.info ul li a .name{width: 50px;}
.info ul li a .num2{float: right;margin-right: 20px;}
.info ul li a div{position: absolute;background-color: #06a7e1;float: left;left: 0px;height: 72px;width: 2px;}
.panel{float: left;background-color: red;width: 15px;height: 370px;}
.panel_scroll{width: 100%;height: 30px;background-color: #000;position: relative;}
var i=0;
var str = "";
for(;i<5;i++){
    str += ‘<li id="testLi‘+(i+1)+‘"><a href=""><span class="num">‘+(i+1)+‘</span><span class="photo"><img src="http://images.cnitblog.com/blog/663787/201410/291050344726094.jpg"></span><span class="name">文字</span><span class="num2">1000</span></a></li>‘;
}
document.getElementById("scro").innerHTML = str;

/*
 * 动画效果
 */
function Cartoon(time, count, alg, callback) {
    this.time = time || 1000;
    this.count = count || 100;
    var alg = typeof (alg) == "string" ? alg : "";
    if (/^(uniform|acc|dec|accdec|arc-acc|arc-dec|arc-accdec)$/i.test(alg)) this.alg = alg.toLowerCase();
    else this.alg = "arc-dec";
    this.callback = callback;
    this.timer = null;
};
/*
 * @param {number} time 执行时间,并不是完全等于设置的时间,不用浏览器效果可能不同,需要配合count调节,缺省1000
 * @param {number} count 变化的次数,缺省100
 * @param {string} alg 运动类型,缺省arc-dec
 * @param {string} uniform 匀速
 * @param {string} acc 匀加速
 * @param {string} dec 圆弧加速
 * @param {string} accdec 匀加速
 * @param {string} arc-acc 圆弧减速
 * @param {string} arc-dec 先匀加速后匀减速
 * @param {string} arc-accdec 圆弧先加速后减速
 */
Cartoon.prototype = {
    run: function (callback, onStop) {//控制执行时机
        var self = this;
        var count = 1;
        this.timer = setInterval(function () {
            if (count > self.count) {
                self.stop();
                if (typeof (onStop) == "function") onStop();
            } else {
                switch (self.alg) {
                case "uniform":
                    callback(count / self.count);
                    break;
                case "acc":
                    var s = 0.002 * 0.5 * (count / self.count * 1000) * (count / self.count * 1000);
                    callback(s / 1000);
                    break;
                case "dec":
                    var s = 2 * (count / self.count * 1000) - 0.002 * 0.5 * (count / self.count * 1000) * (count / self.count * 1000);
                    callback(s / 1000);
                    break;
                case "accdec":
                    var t = (count / self.count * 1000);
                    if (t < 500) {
                        var s = 0.5 * 0.004 * t * t;
                    } else {
                        t -= 500;
                        var s = 500 + 2 * t - 0.004 * 0.5 * t * t;
                    };
                    callback(s / 1000);
                    break;
                case "arc-acc":
                    var x = count / self.count * 1000;
                    var y = 1000 - Math.pow(1000000 - x * x, 0.5);
                    callback(y / 1000);
                    break;
                case "arc-dec":
                    var x = 1000 - count / self.count * 1000;
                    var y = Math.pow(1000000 - x * x, 0.5);
                    callback(y / 1000);
                    break;
                case "arc-accdec":
                    var x = (count / self.count * 1000);
                    if (x < 500) {
                        var y = 500 - (Math.pow(250000 - x * x, 0.5));
                    } else {
                        x = 1000 - x;
                        var y = 500 + Math.pow(250000 - x * x, 0.5);
                    };
                    callback(y / 1000);
                    break;
                default:
                    break;
                };
                count += 1;
            }
        }, parseInt(this.time / this.count) == 0 ? 1 : parseInt(this.time / this.count));
        return this;
    },
    stop: function () {//停止动画
        clearInterval(this.timer);
        if (typeof (this.callback) == "function") this.callback();
        return this;
    },
    init:function(fn){//位置初始化
        var self = this;
        this.stop();
        console.log("123123");
        fn();
    }
};

/*
 * 在相应位置执行遮罩层的自左至右的运动
 */
function start(){  var order = document.getElementById("orderIndex").value;
    var C = new Cartoon(500,100,"arc-dec");//初始化盲选动画效果,定义执行时间
    C.eleList = document.getElementById("scro");
    C.eleList.style.position = "relative";
    C.el = document.getElementById("testLi"+order);
    C.elA = C.el.getElementsByTagName("a")[0];
    C.newDom = document.createElement("div");
    C.dom = C.elA.appendChild(C.newDom);

    C.run(function(x){C.dom.style.width = (( 330 - 120 )*x+120)+"px";},
        function(){
            C.run(function(x){
                    C.dom.style.width = (330-330*x+120)+"px";
                    C.dom.style.left = (( 330 - 120 )*x)+"px";
                },
                function(){
                    setTimeout(function(){
                        C.init(function(){C.dom.style.left = 210 + "px";C.dom.style.width = 120 + "px";});
                        C.run(function(x){C.dom.style.left = (120*x+210)+"px";},
                            function(){
                                C.elA.removeChild(C.dom);
                            }
                        );
                    },300);
                }
            );
        }
    );
}
时间: 2024-08-26 18:43:35

javascript动画效果的相关文章

javascript动画效果之缓冲动画(修改版)

在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one,two), 30);时,发现show里面的参数one和two无法被导入,所以需要做以下代码改进和优化 原版的html和css代码在这里javascript动画效果之缓冲动画 js代码如下 1 <script> 2 function $(id) { 3 return typeof id === &

Javascript动画效果(四)

Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下滚入的效果,那么那种效果是如何实现的呢? 首先我们我们完成该效果的html和css代码,代码如下: html部分代码: <div id="move"> <a href="#"><i><img src="images/1

Javascript动画效果(一)

Javascript动画效果(一) 前面我们介绍了Javascript的回到顶部效果,今天呢,我们对Javascript动画做进一步的研究.在这篇博文中我们只介绍简单的匀速运动.简单的缓冲运动和简单的多物体运动后面我们还会介绍任意值变化的运动.链式运动.同时运动,同时我们还会简单的封装一个运动框架并且还会将Javascript方法和jquery方法进行比较. 1.简单的匀速运动 下面我们介绍一个demo,鼠标移入,动画向右移动(即隐藏部分显示):鼠标离开,动画向左运动(继续隐藏)整个过程都是匀速

【BOOM】一款有趣的Javascript动画效果

实践出真知,有的时候看到一些有趣的现象就想着用自己所学的知识复现一下.    缘起 前几天在 github 上看到同事的一个这样的小项目,在 IOS 上实现了这样一个小动画效果,看上去蛮炫的,效果图: 我就寻思着,在浏览器环境下,用 Javascript 怎么实现呢? 在浓烈的好奇心驱使下,最终利用 Javascript 和 CSS3 完成了模仿上面的效果,通过调用方法,可以将页面上的图片一键爆炸,我给它起了个 boomJS 的名字,贴两张效果图:           实现 我感觉效果还是可以的

javascript动画效果之匀速运动

html和css写在一起方便看,div通过定位设置为-200隐藏,span也是通过定位定在div靠左的中间 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 <style type="text/css"> 8 * { 9 margin: 0; 10 pa

jQuery 动画效果

在以前很长一段时间里,网页上的各种特效还需要采用 flash 在进行.但最近几年里,我们已经很少看到这种情况了,绝大部分已经使用 JavaScript 动画效果来取代 flash.这里说的取代是网页特效部分,而不是动画.网页特效比如:渐变菜单.渐进显示.图片轮播等:而动画比如:故事情节广告.MV 等等. 一.显示.隐藏 jQuery 中显示方法为:.show(),隐藏方法为:.hide().在无参数的时候,只是硬性的显 示内容和隐藏内容. $('.show').click(function(){

动画效果(一)

在以前很长一段时间里,网页上的各种特效还需要采用flash在进行.但最近几年里,我们已经很少看到这种情况了,绝大部分已经使用JavaScript动画效果来取代flash.这里说的取代是网页特效部分,而不是动画.网页特效比如:渐变菜单.渐进显示.图片轮播等:而动画比如:故事情节广告.MV等等. 显示.隐藏 jQuery中显示方法为:.show(),隐藏方法为:.hide().在无参数的时候,只是硬性的显示内容和隐藏内容. html代码如下: <!DOCTYPE html> <html>

Jquery11 动画效果

学习要点: 1.显示.隐藏 2.滑动.卷动 3.淡入.淡出 4.自定义动画 5.列队动画方法 6.动画相关方法 7.动画全局属性 在以前很长一段时间里,网页上的各种特效还需要采用 flash 在进行.但最近几年里已经很少看到这种情况了,绝大部分已经使用 JavaScript 动画效果来取代 flash.这里说的取代是网页特效部分,而不是动画.网页特效比如:渐变菜单.渐进显示.图片轮播等:而动画比如:故事情节广告.MV 等等. 一.显示.隐藏 jQuery 中显示方法为:.show(),隐藏方法为

JavaScript之JS实现动画效果

在前面的随笔中介绍了如何用DOM技术修改文档的央样式信息,用JavaScript添加样式信息可以节约我们的时间和精力,但总的来说,CSS仍是完成这类任务的最佳工具.但是有一个应用领域是目前的CSS无能为力的.如果我们想随着时间的变化而不断改变某个元素的样式,则只能用JavaScript.JavaScript能够按照预定的时间间隔重复的调用一个函数,而意味着我们可以随着时间的推移而不断改变某个元素的样式. 动画是样式随着时间变化的完美例子之一.简单的说,动画就是让元素的位置随着时间而不断的发生变化