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 相关文章推荐
[JS源码]超长文章自动分页(客户端版)
Jan 09 Javascript
Javascript中Eval函数的使用说明
Oct 11 Javascript
JQuery 弹出框定位实现方法
Dec 02 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
Apr 12 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
Feb 06 Javascript
javascript中alert()与console.log()的区别
Aug 26 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
Dec 30 Javascript
Underscore源码分析
Dec 30 Javascript
vue组件如何被其他项目引用
Apr 13 Javascript
关于redux-saga中take使用方法详解
Feb 27 Javascript
vue和webpack项目构建过程常用的npm命令详解
Jun 15 Javascript
基于vue和react的spa进行按需加载的实现方法
Sep 29 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
phpmyadmin操作流程
2006/10/09 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
json对象与数组以及转换成js对象的简单实现方法
2016/06/24 Javascript
JavaScript实现简单的四则运算计算器完整实例
2017/04/28 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
Ajax的优点和缺点
2014/11/21 面试题
观看《永远的雷锋》心得体会
2014/03/12 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
运动会入场口号
2014/06/07 职场文书
教师党员承诺书2015
2015/01/21 职场文书
体育个人工作总结
2015/02/09 职场文书
初中重阳节活动总结
2015/05/05 职场文书
负责培养人意见
2015/06/05 职场文书
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
关于的python五子棋的算法
2022/05/02 Python