简易运动框架

简易的运动框架可以用来控制长宽高、位置、透明度,结合定时器可以实现简单的动画。

其中最主要也是最基础的就是获得元素的属性,我们先来看一下给元素添加样式的三种方法:行内样式、嵌入式样式、外链样式表

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6     <!-- 外部样式表 -->
 7     <link style="stylesheet" href="style.css" type="text/css" />
 8     <!-- 嵌入样式 -->
 9     <style>
10         div{
11             height: 200px;
12         }
13     </style>
14 </head>
15 <body>
16     <!-- 行内样式 -->
17     <div style="width:200px;"></div>
18 </body>
19 </html>

我们要获取元素的样式可以使用 obj.style.xx,但是这个方法只能获取行内样式。

1     <script>
2         var oBox = document.getElementById(‘box‘);
3         console.log(oBox.style.width);//200px
4
5         console.log(oBox.style.height);//‘‘
6     </script>

所以我们要想获得元素的样式,style是不够的所以引用了currentStyle(IE)方法和getComputedStyle方法

定义一个获取元素样式的通用函数:

1         function getStyle(obj,attr){
2             return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
3         };

开始写doMove函数

首先doMove接受的参数

1 doMove(obj,attr,dir,target,endFn)

obj是要进行操作的对象

attr是要操作的属性

dir是要改变元素属性的速度(在一段时间内改变多少)

target属性改变的目标值

endFn是回调函数

首先,我们先要判断dir的正负,如果元素现在的属性值要是小于目标值则attr为正,否则为负数

注意:用getStyle()函数返回的是字符串,所以要用parseInt转换为数字

1             dir = parseInt(getStyle(obj,attr)) < target ? dir : -dir;

然后定义主要的运动函数

 1             obj.timer = setInterval(function (){
 2                 //下一个位置的变化
 3                 var speed = parseInt(getStyle(obj,attr)) + dir;
 4                 //超过目标值时,speed改为目标值
 5                 if(speed > target && dir > 0 || speed < target && dir < 0){
 6                     speed = target;
 7                 };
 8                 obj.style[attr] = speed + ‘px‘;
 9                 if(speed == target){
10                     clearInterval(obj.timer);
11                     endFn && endFn();
12                 };
13             },20);

speed = 元素属性当前的值 + 要每段时间的变化,判断改变后的值speed是否大于或者小于目标值target,如果大于或者小于目标值,则speed等于目标值,否则继续执行。

如果speed等于目标值则停止对元素属性的更改,清楚定时器,如果有回调函数则执行。

最后定义对透明度改变的函数:

 1          function chOpacity(obj,speed,target,endFn){
 2              //取得最初值,要用parseInt不然得到的opacity属性是字符串
 3              var oropacity = parseInt(getStyle(obj,‘opacity‘));
 4
 5              //定时器
 6             obj.chopacity = null;
 7             //判断正负
 8             speed = oropacity > target ? -speed : speed;
 9
10             clearInterval(obj.chopacity);
11
12             obj.chopacity = setInterval(function(){
13
14                 obj.style.opacity = oropacity += speed;
15
16                 if(obj.style.opacity < 0){
17                     obj.style.opacity = 0;
18                     clearInterval(obj.chopacity);
19                     endFn && endFn();
20
21                 }
22                 if(obj.style.opacity > 1){
23                     obj.style.opacity  = 1;
24                     clearInterval(obj.chopacity);
25                     endFn && endFn();
26                 }
27             },40);
28
29         }

基本思想和doMove()函数差不多。这里就不在讲了。

应用:

实现这个动画效果的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="doMove.js"></script>
    <style>
    #box{
        width:800px;
        height: 60px;
        border: 1px solid black;
        position: absolute;
        top: 300px;
        left: 150px;
        opacity: 1;
        line-height: 60px;
    }
    #box2{
        width: 800px;
        height: 60px;
        position: absolute;
        background: green;
        top: 0px;
        left: 0px;
    }
    span{
        display: inline-block;
        width: 90px;
        position: absolute;
        top:10px;
    }
    </style>
</head>
<body>
    <div id="box">
    </div>
    <script>
    window.onload = function(){
            var timer = null;
            var oSpan = document.getElementsByTagName(‘span‘);
            var oBox = document.getElementById(‘box‘);
            var oBox2 = document.getElementsByTagName(‘div‘);
            var num = 0;
            var len = 8;
            var str = ‘‘;

            for(var i=0;i<len;i++){
                str += ‘<span style="width:90px;position:absolute;top:0px;left:‘+i*110+‘px">+1</span>‘;
            }
            str += ‘<div style="width: 0px;height: 60px;position: absolute;background: rgb(100,100,100);top: 0px;left: 0px; "></div>‘
            oBox.innerHTML = str;

            oBox.onclick = function(){
                clearInterval(timer);
                timer = setInterval(function(){
                    doMove(oSpan[num],‘top‘,2,-150);
                    doMove(oBox2[1],‘width‘,23,800);
                    chOpacity(oSpan[num],0.040,0);
                    num++;
                    if(num == oSpan.length){
                        clearInterval(timer);

                    }
                },40);
            }

    }
    </script>
</body>
</html>

doMove函数

 1         function doMove(obj,attr,dir,target,endFn){
 2             //判断数值的正负,如果目标值大于当前值则为正
 3             dir = parseInt(getStyle(obj,attr)) < target ? dir : -dir;
 4
 5             clearInterval(obj.timer);
 6
 7             obj.timer = setInterval(function (){
 8                 //下一个位置的变化
 9                 var speed = parseInt(getStyle(obj,attr)) + dir;
10                 //超过目标值时,speed改为目标值
11                 if(speed > target && dir > 0 || speed < target && dir < 0){
12                     speed = target;
13                 };
14                 obj.style[attr] = speed + ‘px‘;
15                 if(speed == target){
16                     clearInterval(obj.timer);
17                     endFn && endFn();
18                 };
19             },20);
20         };
21
22          function chOpacity(obj,speed,target,endFn){
23              //取得最初值,要用parseInt不然得到的opacity属性是字符串
24              var oropacity = parseInt(getStyle(obj,‘opacity‘));
25
26              //定时器
27             obj.chopacity = null;
28             //判断正负
29             speed = oropacity > target ? -speed : speed;
30
31             clearInterval(obj.chopacity);
32
33             obj.chopacity = setInterval(function(){
34
35                 obj.style.opacity = oropacity += speed;
36
37                 if(obj.style.opacity < 0){
38                     obj.style.opacity = 0;
39                     clearInterval(obj.chopacity);
40                     endFn && endFn();
41
42                 }
43                 if(obj.style.opacity > 1){
44                     obj.style.opacity  = 1;
45                     clearInterval(obj.chopacity);
46                     endFn && endFn();
47                 }
48             },40);
49
50         }
51
52         function getStyle(obj,attr){
53             return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
54         };
时间: 2024-10-26 05:45:35

简易运动框架的相关文章

原生JS封装运动框架

昨天我们说了一下原生JS中常用的兼容性写法,今天我们来说一下运动框架. 正常情况下我们要写一个运动的效果会用到tween.js这么一个插件,这个东西不是一般人写出来的,因为里面涉及的运动效果都是经过一堆数学的函数运算出来的,我们平常人是写不出来的,所有我们就自己封装一个运动框架,有什么问题改起来也方便,下面我们就开始封装. 首先,我们先写一个div,设置一些简单的样式,我们就拿这个div举例子,如下代码: #div{ width: 100px; height: 100px; background

封装运动框架单个属性

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>封装运动框架的单个属性</title> <style> div{ width: 100px; height: 100px; font-weight:bold;">pink; position: absolute; left: 10px

带无缝滚动的轮播图(含JS运动框架)

今天学习了一下轮播图的写作,想到前一阵学过的无缝滚动得思想,所以就把轮播与滚动结合了一下.不过我的代码的神逻辑我自己都不敢恭维,在没网没参照的情况下,只能硬着头皮往下写,希望跟大家共勉吧. js运动框架的代码如下: 1 //获取样式 2 function getStyle(obj,attr){ 3 if(obj.currentStyle){ 4 return obj.currentStyle[attr]; 5 }else{ 6 return getComputedStyle(obj,false)

JS 之完美运动框架

完美运动框架是对原来的任意值运动框架的改善和效率的提升,即利用了json对属性进行封装,从而提高效率: window.onload=function(){ var oDiv=document.getElementsByTagName('div')[0]; oDiv.onmouseover=function(){ move(this,{width:200,height:200}); } } function getStyle(obj,attr){ if (obj.currentStyle) { r

JavaScript的运动框架学习总结

一.目录 1. 入门案例——实现匀速运动 2. 入门案例——实现缓冲运动 3. 实现任意值的运动框架v.1 4. 改进任意值的运动框架v.2 5. 改进任意值的运动框架v.3 6. 实现链式运动框架 7. 实现完美运动框架 二.内容 1. 入门案例——实现匀速运动 ①. 要求:只要简单的实现传入的对象和运动的最终目标,便能操作该对象的left属性的大小匀速的变化到目标大小. ②. 具体代码: 1 <!DOCTYPE html> 2 <html lang="en">

JS的完美运动框架

function getStyle(obj, name) { if(obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, false)[name]; } } //注意:在多物体运动框架中,所有东西都不能公用 !否则出问题,BUG:将必要的变量加到物体的属性中就行.即:属性与运动对象绑定:速度.其他属性值(如透明度等等) function startMove(obj, jso

多用途运动框架

该运动框架可以用于改变宽度.高度.字体大小.透明度.Left.top等值 先上一个获取真正样式的函数 //定义getStyle函数,获取真正样式 function getStyle(obj,attr){ if(obj.currentStyle){//兼容IE return obj.currentStyle[attr]; }else if(window.getComputedStyle(obj,false)){//兼容FF return getComputedStyle(obj,false)[at

【repost】JavaScript运动框架之速度时间版本

一.JavaScript运动框架之速度版 1.1 运动框架的实现思路 运动,其实就是在一段时间内改变 left . right . width . height . opactiy 的值,到达目的地之后停止 位移 top,left 折叠 width,height 淡入淡出 opacity 时间有关系 setInterval setTimeout 用javascript直接获取行间样式很容易,但如果要获取非行间样式那我们只能借助函数了.我这里编写了一个名为getStyle的函数,专门处理取非行间的

js运动框架之掉落的扑克牌(重心、弹起效果)

玩过电脑自带纸牌游戏的同志们应该都知道,游戏过关后扑克牌会依次从上空掉落,落下后又弹起,直至"滚出"屏幕. 效果如图:    这个案例的具体效果就是:点击开始运动,纸牌会从右上角掉落下来,之后弹起,运动的速度会逐渐减慢,直到越出屏幕后,全部纸牌消失,在右上角会重新出现一张纸牌,继续动作,一再往复. 具体代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta ch