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="https://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>
复制代码

posted @   小火柴的蓝色理想  阅读(2538)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
显示目录
目录
[1]原理介绍[2]代码实现[3]实例应用