JavaScript实现窗口抖动效果


Posted in Javascript onOctober 19, 2016

原理介绍

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

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

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>

以上所述是小编给大家介绍的JavaScript实现窗口抖动效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
调试JavaScript中正则表达式中遇到的问题
Jan 27 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
Jquery uploadify上传插件使用详解
Jan 13 Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
分享jQuery网页元素拖拽插件
Dec 01 Javascript
BootStrap Fileinput上传插件使用实例代码
Jul 28 Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 jQuery
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 Javascript
原生js图片轮播效果实现代码
Oct 19 #Javascript
Angular2表单自定义验证器的实现
Oct 19 #Javascript
javascript滚轮控制模拟滚动条
Oct 19 #Javascript
Vue.js绑定HTML class数组语法错误的原因分析
Oct 19 #Javascript
微信小程序 教程之wxapp视图容器 swiper
Oct 19 #Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 #Javascript
微信小程序 教程之wxapp 视图容器 view
Oct 19 #Javascript
You might like
十天学会php之第八天
2006/10/09 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
javascript实现的一个随机点名功能
2014/08/26 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
js验证身份证号码记录的方法
2019/04/26 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
Python selenium抓取微博内容的示例代码
2018/05/17 Python
详解Python 正则表达式模块
2018/11/05 Python
Python hashlib模块加密过程解析
2019/11/05 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
python实现与redis交互操作详解
2020/04/21 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
python定义类的简单用法
2020/07/24 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
介绍一下write命令
2012/09/24 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
外语学院毕业生的自我鉴定
2013/11/28 职场文书
关于旅游的活动方案
2014/08/15 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis