博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript运动系列第四篇——抖动
阅读量:6080 次
发布时间:2019-06-20

本文共 2274 字,大约阅读时间需要 7 分钟。

前面的话

  在运动系列中,前面分别介绍了、和。下面介绍一种特殊的运动形式——抖动

 

原理介绍

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

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

  抖动元素从起始点开始,先向右移动最大距离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;

  将抖动效果封装为.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来实现一些简单的抖动应用

Document

转载地址:http://wuhgx.baihongyu.com/

你可能感兴趣的文章
android.view.WindowManager$BadTokenException: Unable to add window
查看>>
HDU5012:Dice(bfs模板)
查看>>
iphone openssh
查看>>
Linux下MEncoder的编译
查看>>
Javascript中闭包(Closure)的探索(一)-基本概念
查看>>
spark高级排序彻底解秘
查看>>
ylbtech-LanguageSamples-PartialTypes(部分类型)
查看>>
福建省促进大数据发展:变分散式管理为统筹集中式管理
查看>>
开发环境、生产环境、测试环境的基本理解和区别
查看>>
tomcat多应用之间如何共享jar
查看>>
Flex前后台交互,service层调用后台服务的简单封装
查看>>
MySQL入门12-数据类型
查看>>
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>