小米网登录窗口抖动函数实现

      之前经常在小米网上买东西,发现小米网站的登录验证做得挺有特色的。当用户名或密码输入错误的时候会像“摇头”似得抖一抖,略微想了一下,发现实现的方式挺简单的,所以今天下午花了一点时间想了一下,以下是我的思路和代码。

       要实现抖动,需要实现一下几步:

1,获取当前元素的位置作为初始位置。
2,设置定时器循环改变元素的位置,每次左右移动一次比上一次移动少一点点距离,直到停止到初始位置。
3,触发调用

 小米网使用一个 div 元素放置表单元素, div 元素水平居中,并设置定位方式为 relative ,以便文本框能够依据父元素 div 作参照左右移动。这里我使用一张图片来代替文本框,HTML代码如下:

<div class="main">
    <img src="cai.jpg" id="cai" />
</div>

CSS代码如下:

.main{width:300px; margin:20px auto; position:relative;}
#cai{width:300px; position:absolute; top:0; left:0; cursor:pointer;}

 JavaScript代码如下:

 1 window.onload = function(){
 2         var cai = document.getElementById("cai");
 3         
 4         function shake(obj,attr){
 5             var _this = obj;
 6             shake.pos = shake.pos ? shake.pos : parseInt(getStyle(_this,attr));
 7             var arr = [];
 8             for(var i=20;i>0;i-=2){
 9                 arr.push(i,-i);
10             }
11             arr.push(0);
12             shake.timer = null;
13             clearInterval(shake.timer);
14             shake.num = 0;
15             shake.timer = setInterval(function(){
16                 _this.style[attr] = shake.pos + arr[num] + "px";
17                 shake.num++;
18                 if(shake.num>arr.length) clearInterval(shake.timer);
19             },20);
20         }
21 
22         function getStyle(obj,attr){
23             return getComputedStyle(obj,null)[attr] ? getComputedStyle(obj,null)[attr] : obj.currentStyle[attr];
24         }
25         
26         cai.onclick = function(){
27             shake(this,"left");
28         };
29     }

        有几个需要注意的地方,首先是为了兼容IE浏览器,我们需要在取元素初始位置的时候进行兼容性处理。我们知道W3C的方法是 window.getComputedStyle(obj,null)[attr] ,而IE独有的方法是 obj.currentStyle[attr] 。

       为了保证在连续点击的时候初始位置的获取不出错,只需要在第一次点击的时候将初始位置保存下来即可,之后便可直接使用该属性值,我们需要判断是不是第一次点击: shake.pos = shake.pos ? shake.pos : parseInt(getStyle(_this,attr)); 

       为了能实现我们最开始说的第二点,我们可以循环生成一个包含移动位置的数组。打印出来我们生成的数组如下所示:

技术分享

最后就是调用了,在小米网中用户名或密码输入错误之后实际上是执行了一次ajax通信过程,所以会有回调函数。我们可以将回调函数作为参数传进去,在抖动结束之后执行。

除了可以左右抖动之外,我们可以试着把参数 left 改成 top 传进去,这样就能实现上下抖动了。

       

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。