JS动画效果

JavaScript 动画框架 框架封装


相信大家在很多门户网站上都可以看到动画的交互效果,通过这些动画生动地体现了我们在网页上的交互效果,现在我们就来学习一下这些动画效果的分解动作吧。作为学习了网页设计初步的一个进阶选修课。

动画的实现思路都是通过连续改变物体的属性值来实现效果的。一般来说都是改变一个物体的left,right,width,height,opacity.

一.简单动画

1.透明度动画
首先一点预备知识,下面是两种浏览器的透明度的属性表示,且都是表示0.3的透明度,1表示不透明。

IE浏览器透明度:filter: alpha(opacity:30);
Chrome浏览器透明度:opacity: 0.3;
一个简单的Div透明度改变动画实例:

<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body,div{
            margin: 0;
            padding: 0;
        }
        #div1{
            width: 200px;
            height:200px;
            background:red;
            filter: alpha(opacity:30);
            opacity: 0.3;
        }
    </style>
    <script>
        var timer = null;
        var alpha = 30;
        function startMove(iTarget) {
            var oDiv = document.getElementById('div1');
            clearInterval(timer);
            timer=setInterval(function () {
                var speed = iTarget > alpha ? 10 : -10;
                if (iTarget == alpha){
                    clearInterval(timer);
                }else {
                    alpha+=speed;
                    oDiv.style.filter ='alpha(opacity:'+alpha+')';
                    oDiv.style.opacity = alpha/100;
                }
            },30);
        }
        window.onload=function () {
            var oDiv = document.getElementById('div1');
            oDiv.onmouseover=function () {
                startMove(100);
            }
            oDiv.onmouseout = function () {
                startMove(30);
            }
        }
    </script>
</head>
<body>
<div id="div1"></div>
</body>

2.速度动画
速度动画通过改变物体的坐标或者说距离他的父容器的左侧和上面的距离来实现。比如先获取一个div,在改变style中的left属性。下面的例子就是一个鼠标移入整个div右滑动,鼠标移开恢复原状。HTML样式是上个例子的样式,这里就不贴出了,一些细节的解释在代码中。

<script>
        window.onload=function () {
            //提取全局变量
            var timer = null;
            var div = document.getElementById('div1');

            function startMove(speed, target) {
                //定时器初始化
                clearInterval(timer);
                timer = setInterval(function () {
                    if (div.offsetLeft == target){
                        clearInterval(timer);
                    }else {
                        div.style.left = div.offsetLeft + speed;
                    }
                },30);
            }

            div.onmouseover = startMove(10,0);
            div.onmouseout = startMove(-10,-200);

        }
    </script>

二.缓存动画

同样是速度动画的例子里的,现在我们改变一下让他可以实现一个缓存的速度动画,并且速度越来越快。

<script>
        var timer = null;
        function startMove(iTarget) {
            clearInterval(timer);
            var div = document.getElementById('div1');
            timer = setInterval(function () {
                var speed = (iTarget - div.offsetLeft)/10;
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                if(div.offsetLeft == iTarget){
                    clearInterval(timer);
                }else{
                    div.style.left = div.offsetLeft + speed + 'px';
                }
            },30);
        }
        window.onload = function () {
            var div = document.getElementById('div1');
            div.onmouseover=function () {
                startMove(0);
            }
            div.onmouseout=function () {
                startMove(-200);
            }
        }
    </script>

三.多物体动画

多物体运动可以理解成多个单个物体的简单运动(有点拗口啊),从程序执行的角度来说,就是遍历设置每个物体的动画。下面的例子都是上面的简单动画例子的集成而已。

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body,ul{
            margin: 0;
            padding: 0;
        }
        ul,li{
            list-style: none;
        }
        ul li{
            width: 200px;
            height: 100px;
            background: yellow;
            margin-bottom: 20px;
        }
    </style>
    <script>
        function startMove(obj, target) {
            clearInterval(obj.timer);
            obj.timer=setInterval(function () {
                var speed = (target-obj.offsetWidth)/8;
                speed = speed > 0 ? Math.ceil(speed):Math.floor(speed);
                if (obj.offsetWidth == target){
                    clearInterval(obj.timer);
                }else {
                    obj.style.width = obj.offsetWidth + speed + 'px';
                }
            },30);
        }
        window.onload=function () {
            var aLi = document.getElementsByTagName('li');
            for (var i=0;i<aLi.length;i++){
                aLi[i].timer = null;
                aLi[i].onmouseover = function () {
                    startMove(this,400);
                }
                aLi[i].onmouseout = function () {
                    startMove(this,200);
                }
            }
        }
    </script>
</head>
<body>
<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>
</body>
</html>

四.链式动画

首先把上面的简单运动框架抽取出来然后加上透明度的变化,放进一个人通用的JS文件里movement.js:

function getStyle(obj,attr) {
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }else {
        return getComputedStyle(obj,false)[attr];
    }
}
function startMove(obj,attr,target,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 = (target - icur)/8;
        speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
        if (icur == target){
            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);

然后我们简单的做一个长200px宽100px的透明度0.3黄色长方形先变长成400px然后宽长成200px,然后也是完全不透明(透明度1.0)的,鼠标移除再依次还原。

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>链式运动框架</title>
    <style>
        body,ul,li{
            margin: 0;
            padding: 0;
        }
        ul,li{
            list-style: none;
        }
        ul li{
            width: 200px;
            height: 100px;
            background: yellow;
            margin-bottom: 20px;
            border: 4px solid #000;
            filter: alpha(opacity:30);
            opacity: 0.3;
        }
    </style>
    <script src="move.js"></script>
    <script>
        window.onload = function () {
            var li = document.getElementById('li1');
            li.onmouseover=function () {
                startMove(li,'width',400,function () {
                    startMove(li,'height',200,function () {
                        startMove(li,'opacity',100);
                    })
                });
            }
            li.onmouseout=function () {
                startMove(li,'opacity',30,function () {
                    startMove(li,'height',100,function () {
                        startMove(li,'width',200);
                    })
                })
            }
        }
    </script>
</head>
<body>
    <ul>
        <li id="li1"></li>
    </ul>
</body>
</html>

五.同时运动

上面的框架都是单个运动动作,如果要实现同时运动,我们就需要借助json了。

JSON的格式:
{键:值,键:值}
完善后的运动框架js:movement.js

function getStyle(obj,attr) {
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }else {
        return getComputedStyle(obj,false)[attr];
    }
}
function startMove(obj,json,fn) {
    flag=true;
    clearInterval(obj.timer);
    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 = (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);
}

然后把链式运动的代码改成

startMove(li,{'width':400,'height':200,'opacity':100});

效果果然是可以同时运动的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • JS速度动画 JS透明度动画 JS缓冲动画 JS多物体动画 JS透明度多物体动画 获取样式屬性值 任意属性值 任意...
    深沉的简单阅读 357评论 0 1
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,485评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,110评论 5 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,065评论 25 707
  • 风陵渡口初相遇,一见杨过误终身。
    美美的小胡阅读 127评论 0 0