JavaScript實(shí)現(xiàn)窗口抖動(dòng)效果
原理介紹
抖動(dòng)其實(shí)是往復(fù)運(yùn)動(dòng)的一種特殊形式,只不過(guò)往復(fù)運(yùn)動(dòng)是一種無(wú)摩擦力的無(wú)限運(yùn)動(dòng),且以速度為參照依據(jù);而抖動(dòng)以位置作為參照依據(jù),最終停在起始點(diǎn)
在網(wǎng)頁(yè)中最常見(jiàn)的一種抖動(dòng)效果應(yīng)該是窗口抖動(dòng)提示了

抖動(dòng)元素從起始點(diǎn)開(kāi)始,先向右移動(dòng)最大距離len,然后移動(dòng)到對(duì)稱的左邊位置;然后再向右移動(dòng)稍微小一點(diǎn)的距離,再移動(dòng)到對(duì)稱的左邊位置;以此循環(huán),最終元素停止在起始點(diǎn)
代碼實(shí)現(xiàn)
抖動(dòng)在代碼實(shí)現(xiàn)上,無(wú)非就是通過(guò)定時(shí)器,每隔一段時(shí)間讓left或top值進(jìn)行變化
在運(yùn)動(dòng)實(shí)現(xiàn)中,有兩種距離變化的思路
思路一
div.style.left = div.offsetLeft + value;
每次都獲取元素的當(dāng)前樣式,再與變化的value值進(jìn)行運(yùn)算
思路二
left = div.offsetLeft; ...... div.style.left = left + value;
在定時(shí)器開(kāi)啟之前,獲取元素的初始樣式,再與變化的value值進(jìn)行運(yùn)算
從抖動(dòng)實(shí)現(xiàn)上來(lái)說(shuō),使用第二種方法,把距離變化完全交給value值變化來(lái)實(shí)現(xiàn)較為簡(jiǎn)單
所以,代碼實(shí)現(xiàn)的關(guān)鍵就是了解value是如何變化的
假設(shè)最遠(yuǎn)距離為目標(biāo)target,同方向的距離間隔為步長(zhǎng)step。如果用數(shù)字更直觀的表示,value的值類似于4、-4、2、-2、0。所以還需要一個(gè)變量dir來(lái)控制起始抖動(dòng)方向,定時(shí)器每運(yùn)動(dòng)一次都要對(duì)dir進(jìn)行更改
//定時(shí)器開(kāi)啟前的變量聲明
dir = 1;
step = 0;
left = div.offsetLeft
//定時(shí)器里面的代碼
value = dir*(target - step);
if(step >= target){
step = target
}
div.style.left = left + value + 'px';
if(dir === -1){
step++;
}
dir = -dir;
將抖動(dòng)效果封裝為shakeMove.js
function getCSS(obj,style){
if(window.getComputedStyle){
return getComputedStyle(obj)[style];
}
return obj.currentStyle[style];
}
function shakeMove(json){
//聲明要進(jìn)行抖動(dòng)的元素
var obj = json.obj;
//聲明元素抖動(dòng)的最遠(yuǎn)距離
var target = json.target;
//默認(rèn)值為20
target = Number(target) || 20;
//聲明元素的變化樣式
var attr = json.attr;
//默認(rèn)為'left'
attr = attr || 'left';
//聲明元素的起始抖動(dòng)方向
var dir = json.dir;
//默認(rèn)為'1',表示開(kāi)始先向右抖動(dòng)
dir = Number(dir) || '1';
//聲明元素每次抖動(dòng)的變化幅度
var stepValue = json.stepValue;
stepValue = Number(stepValue) || 2;
//聲明回調(diào)函數(shù)
var fn = json.fn;
//聲明步長(zhǎng)step
var step = 0;
//保存樣式初始值
var attrValue = parseFloat(getCSS(obj,attr));
//聲明參照值value
var value;
//清除定時(shí)器
if(obj.timer){return;}
//開(kāi)啟定時(shí)器
obj.timer = setInterval(function(){
//抖動(dòng)核心代碼
value = dir*(target - step);
//當(dāng)步長(zhǎng)值大于等于最大距離值target時(shí)
if(step >= target){
step = target
}
//更新樣式值
obj.style[attr] = attrValue + value + 'px';
//當(dāng)元素到達(dá)起始點(diǎn)時(shí),停止定時(shí)器
if(step == target){
clearInterval(obj.timer);
obj.timer = 0;
//設(shè)置回調(diào)函數(shù)
fn && fn.call(obj);
}
//如果此時(shí)為反向運(yùn)動(dòng),則步長(zhǎng)值變化
if(dir === -1){
step = step + stepValue;
}
//改變方向
dir = -dir;
},50);
}
實(shí)例應(yīng)用
下面利用封裝的shakeMove來(lái)實(shí)現(xiàn)一些簡(jiǎn)單的抖動(dòng)應(yīng)用
<!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實(shí)現(xiàn)窗口抖動(dòng)效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
微信公眾號(hào)平臺(tái)接口開(kāi)發(fā) 獲取access_token過(guò)程解析
這篇文章主要介紹了微信公眾號(hào)平臺(tái)接口開(kāi)發(fā) 獲取access_token過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
javascript中關(guān)于break,continue的特殊用法與介紹
javascript大家所熟知中的for是一個(gè)循環(huán)體,循環(huán)體其中的break和continue也是大家都比較熟悉的功能,相信大家對(duì)它們的用法不會(huì)陌生,本文不是介紹其功能,本文假設(shè)你已經(jīng)熟悉break和continue的語(yǔ)意和用法2012-05-05
JavaScript檢測(cè)字符串中是否含有html標(biāo)簽實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript檢測(cè)字符串中是否含有html標(biāo)簽實(shí)現(xiàn)方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-07-07
javascript 客戶端驗(yàn)證上傳圖片的大?。嫒軮E和火狐)
做web開(kāi)發(fā)的哥們都會(huì)遇到批量上傳圖片的需求,相信大家都會(huì)遇到這樣的問(wèn)題,當(dāng)選擇好要上傳的圖片,提交服務(wù)器后,發(fā)現(xiàn)有圖片的大小超過(guò)了系統(tǒng)允許的范圍。2009-08-08

