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 函数使用说明
Apr 07 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
Dec 15 Javascript
js replace正则表达式应用案例讲解
Jan 17 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
JavaScript实现节点的删除与序号重建实例
Aug 05 Javascript
javascript常用经典算法实例详解
Nov 25 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
Mar 17 Javascript
js实现多张图片延迟加载效果
Jul 17 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
微信小程序中使用 async/await的方法实例分析
May 06 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 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取得一个类的属性和方法的实现代码
2011/05/22 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
用js编写留言板
2020/03/17 Javascript
Python制作简易注册登录系统
2016/12/15 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
辅导员评语
2014/05/04 职场文书
骨干教师考核方案
2014/05/09 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
财务会计实训报告
2014/11/05 职场文书
护士实习自荐信
2015/03/06 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书