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 相关文章推荐
JavaScript方法和技巧大全
Dec 27 Javascript
javascript数组使用调用方法汇总
Dec 08 Javascript
关于javascript中的parseInt使用技巧
Sep 03 Javascript
JavaScript在XHTML中的用法详解
Apr 11 Javascript
JavaScript中的eval()函数详解
Aug 22 Javascript
javascript实现的固定位置悬浮窗口实例
Apr 30 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
Aug 24 Javascript
jquery实现简易的移动端验证表单
Nov 08 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
Dec 29 Javascript
使用BootStrap实现标签切换原理解析
Mar 14 Javascript
Angular 4.x 动态创建表单实例
Apr 25 Javascript
js实现漂亮的星空背景
Nov 01 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
php模板中出现空行解决方法
2011/03/08 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
javascript求日期差的方法
2016/03/02 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
axios学习教程全攻略
2017/03/26 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
从零学Python之hello world
2014/05/21 Python
跟老齐学Python之做一个小游戏
2014/09/28 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
详解Python迭代和迭代器
2016/03/28 Python
Python常用算法学习基础教程
2017/04/13 Python
python批量修改文件编码格式的方法
2018/05/31 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python实现银行管理系统
2019/10/25 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
优秀员工自荐书范文
2013/12/08 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
副总经理岗位职责
2014/03/16 职场文书
食品安全宣传标语
2014/06/07 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
门面房租房协议书
2014/12/01 职场文书
MySQL数据库查询进阶之多表查询详解
2022/04/08 MySQL