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 相关文章推荐
jQuery 事件队列调整方法
Sep 18 Javascript
基于JQuery的日期联动实现代码
Feb 24 Javascript
JS重要知识点小结
Nov 06 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
Nov 26 Javascript
ajax请求乱码的解决方法(中文乱码)
Apr 10 Javascript
js实现简单的左右两边固定广告效果实例
Apr 10 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
easyui简介_动力节点Java学院整理
Jul 14 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
Angular父组件调用子组件的方法
Apr 02 Javascript
详解小程序云开发攻略(解决最棘手的问题)
Sep 30 Javascript
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php利用cookie实现访问次数统计代码
2011/05/19 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
IE中JS跳转丢失referrer问题的2个解决方法
2014/07/18 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
JS 清除字符串数组中,重复元素的实现方法
2016/05/24 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
vue debug 二种方法
2018/09/16 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
Python中super的用法实例
2015/05/28 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
python中实现词云图的示例
2020/12/19 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
eharmony澳大利亚:网上约会服务
2020/02/29 全球购物
应届生护士求职信
2013/11/01 职场文书
火锅店营销方案
2014/02/26 职场文书
护理目标管理责任书
2014/07/25 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
英语教师求职信范文
2015/03/20 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android