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得到网页中所有的div的id
Oct 19 Javascript
js 异步处理进度条
Apr 01 Javascript
jquery获取input表单值的代码
Apr 19 Javascript
通过DOM脚本去设置样式信息
Sep 19 Javascript
javascript禁制后退键(Backspace)实例代码
Nov 15 Javascript
javascript匿名函数应用示例介绍
Mar 07 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
微信小程序  action-sheet详解及实例代码
Nov 09 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
微信小程序商品详情页底部弹出框
Nov 22 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
2017/01/22 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
Javascript的构造函数和constructor属性
2010/01/09 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
Python调用C语言程序方法解析
2020/07/07 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
球队口号
2014/06/18 职场文书
部队2014年终工作总结
2014/11/27 职场文书
党员承诺书范文2015
2015/04/27 职场文书
总经理年会致辞
2015/07/29 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python