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和其它资源并发下载的方法
Oct 16 Javascript
JavaScript闭包实例详解
Jun 03 Javascript
简单理解vue中track-by属性
Oct 26 Javascript
3种不同的ContextMenu右键菜单实现代码
Nov 03 Javascript
使用Vue-Router 2实现路由功能实例详解
Nov 14 Javascript
javascript变量提升和闭包理解
Mar 12 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
用vue快速开发app的脚手架工具
Jun 11 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
Aug 10 Javascript
layui--js控制switch的切换方法
Sep 03 Javascript
让mocha支持ES6模块的方法实现
Jan 14 Javascript
JavaScript中的this基本问题实例小结
Mar 09 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图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
PHP中比较时间大小实例
2014/08/21 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python socket 超时设置 errno 10054
2014/07/01 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python爬取指定微信公众号文章
2018/12/20 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式
2014/10/11 HTML / CSS
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
物理系毕业生自荐书范文
2014/02/22 职场文书
初三开学计划书
2014/04/27 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS