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 相关文章推荐
比例尺、缩略图、平移缩放之百度地图添加控件方法
Aug 03 Javascript
详解Webwork中Action 调用的方法
Feb 02 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
vue-cli webpack配置文件分析
May 20 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
vue+elementUi图片上传组件使用详解
Aug 20 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
Oct 25 Javascript
vue设置动态请求地址的例子
Nov 01 Javascript
js实现中文实时时钟
Jan 15 Javascript
VueCli生产环境打包部署跨域失败的解决
Nov 13 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
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
一道关于php变量引用的面试题
2010/08/08 PHP
php常用数组函数实例小结
2016/12/29 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
JavaScript 基础问答三
2008/12/03 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
Python help()函数用法详解
2014/03/11 Python
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
Django的分页器实例(paginator)
2017/12/01 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
python如何修改文件时间属性
2021/02/05 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
群胜软件Java笔试题
2012/09/29 面试题
应用化学专业职业生涯规划书
2013/12/31 职场文书
旅游活动总结
2014/08/27 职场文书
安全月宣传标语
2014/10/07 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
党员剖析材料范文
2014/12/18 职场文书
安全教育培训制度
2015/08/06 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书