• javascript运动系列第四篇——抖动


    前面的话

      在运动系列中,前面分别介绍了匀速运动变速运动曲线运动。下面介绍一种特殊的运动形式——抖动

    原理介绍

      抖动其实是往复运动的一种特殊形式,只不过往复运动是一种无摩擦力的无限运动,且以速度为参照依据;而抖动以位置作为参照依据,最终停在起始点

      在网页中最常见的一种抖动效果应该是窗口抖动提示了

      抖动元素从起始点开始,先向右移动最大距离len,然后移动到对称的左边位置;然后再向右移动稍微小一点的距离,再移动到对称的左边位置;以此循环,最终元素停止在起始点

    代码实现

      抖动在代码实现上,无非就是通过定时器,每隔一段时间让left或top值进行变化

      在运动实现中,有两种距离变化的思路

    思路一

    div.style.left = div.offsetLeft + value;

      每次都获取元素的当前样式,再与变化的value值进行运算

    思路二

    left = div.offsetLeft;
    ......
    div.style.left = left + value;

      在定时器开启之前,获取元素的初始样式,再与变化的value值进行运算

      从抖动实现上来说,使用第二种方法,把距离变化完全交给value值变化来实现较为简单

      所以,代码实现的关键就是了解value是如何变化的

      假设最远距离为目标target,同方向的距离间隔为步长step。如果用数字更直观的表示,value的值类似于4、-4、2、-2、0。所以还需要一个变量dir来控制起始抖动方向,定时器每运动一次都要对dir进行更改

    //定时器开启前的变量声明
    dir = 1;
    step = 0;
    left = div.offsetLeft
    //定时器里面的代码
    value = dir*(target - step);
    if(step >= target){
        step = target
    }
    div.style.left = left + value + 'px';
    if(dir === -1){
        step++;    
    }
    dir = -dir;

      将抖动效果封装为shakeMove.js

    function getCSS(obj,style){
        if(window.getComputedStyle){
            return getComputedStyle(obj)[style];
        }
        return obj.currentStyle[style];
    } 
    function shakeMove(json){
        //声明要进行抖动的元素
        var obj = json.obj;
        //声明元素抖动的最远距离
        var target = json.target;
        //默认值为20
        target = Number(target) || 20;
        //声明元素的变化样式
        var attr = json.attr;
        //默认为'left' 
        attr = attr || 'left'; 
        //声明元素的起始抖动方向
        var dir = json.dir;
        //默认为'1',表示开始先向右抖动
        dir = Number(dir) || '1';
        //声明元素每次抖动的变化幅度
        var stepValue = json.stepValue;
        stepValue = Number(stepValue) || 2;
        //声明回调函数 
        var fn = json.fn;
        //声明步长step
        var step = 0;
        //保存样式初始值
        var attrValue = parseFloat(getCSS(obj,attr));
        //声明参照值value
        var value;
        //清除定时器
        if(obj.timer){return;}
        //开启定时器
        obj.timer = setInterval(function(){
            //抖动核心代码
            value = dir*(target - step);
            //当步长值大于等于最大距离值target时
            if(step >= target){
                step = target
            }
            //更新样式值
            obj.style[attr] = attrValue + value + 'px';
            //当元素到达起始点时,停止定时器
            if(step == target){
                clearInterval(obj.timer);
                obj.timer = 0;
                //设置回调函数
                fn && fn.call(obj);    
            }  
            //如果此时为反向运动,则步长值变化
            if(dir === -1){
                step = step + stepValue;    
            }
            //改变方向
            dir = -dir; 
    
        },50);        
    } 

    实例应用

      下面利用封装的shakeMove来实现一些简单的抖动应用

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    .test{
        height: 50px;
        width: 50px;
        position: absolute;
        top: 50px;
    }    
    </style>
    </head>
    <body>
    <div id="box">
        <div class="test" style="left:10px;background:lightblue"></div>
        <div class="test" style="left:70px;background:lightgreen"></div>
        <div class="test" style="left:130px;background:pink"></div>
        <div class="test" style="left:190px;background:lightcoral"></div>
        <div class="test" style="left:250px;background:orange"></div>
    </div>
    <script src="http://files.cnblogs.com/files/xiaohuochai/shakeMove.js"></script>
    <script>
    var aDiv = box.getElementsByTagName('div');
    for(var i = 0; i < aDiv.length; i++){
        aDiv[i].onmouseover = function(){
            shakeMove({obj:this,attr:'top'});
        }
    }
    </script>
    </body>
    </html>

  • 相关阅读:
    Android项目实战(四):ViewPager切换动画(3.0版本以上有效果)
    安卓开发_浅谈ListView(SimpleAdapter数组适配器)
    ADB server didn't ACK 解决方法
    安卓开发_浅谈自定义组件
    Go语言基础之指针
    Go语言基础之接口
    Go语言标准库之fmt
    Go语言基础之函数
    LeetCode go
    Go语言基础之变量和常量
  • 原文地址:https://www.cnblogs.com/xiaohuochai/p/5977177.html
Copyright © 2020-2023  润新知