javascript實現(xiàn)鼠標點擊頁面 移動DIV
<script type="text/javascript">
//那種方式移動
var choMove = false;
//是否綁定過click
var isClick = true;
//引用DIV
var oDiv = null;
//引用Input
var oInput = null;
//封裝事件綁定的通用對象
var evnetUtil = {
addEventHandle:function(oElement,evtype,fun){
oElement.attachEvent?oElement.attachEvent("on"+evtype,fun):oElement.addEventListener(evtype,fun,false);
},
removeEventHandle:function(oElement,evtype,fun){
oElement.detachEvent?oElement.detachEvent("on"+evtype,fun):oElement.removeEventListener(evtype,fun,false);
}
}
//根據(jù)開關(guān),來讓document的Click事件綁定不同的動畫函數(shù)
var eventMove = function(event){
var ev = event || window.event;
choMove==true?clickMove(ev):slideMove(ev);
}
//根據(jù)鼠標點擊位置移動動畫一
var clickMove = function(cev){
var mouseX = cev.clientX; //鼠標點擊的橫坐標
var mouseY = cev.clientY; //鼠標點擊的縱坐標
//取消document的click事件綁定的函數(shù),以避免在動畫中,擊點頁面會又一次觸發(fā)這個動畫
evnetUtil.removeEventHandle(document,'click',eventMove);
var setCliMove = setInterval(function(){
var oDivLeft = oDiv.offsetLeft; //DIV在頁面中的Left值;
var oDivTop = oDiv.offsetTop; //DIV在頁面中的Top值;
/*橫坐標移動的速,即每30毫秒,移動speedX距離
*mouseX-oDivLeft當前DIV與目標點之間的距離,
*除以5,就是將這個距離分成5份
*分母5不變,距離越小,所以移動速度就越慢
*/
var speedX = (mouseX-oDivLeft)/5;
//縱坐標移動的速度,即每30毫秒,移動speedX距離,這個speedY是變化的,距離鼠標點擊的位置越近,這個值越小
var speedY = (mouseY-oDivTop)/5;
/*這里必需使用向上或向下取舍的函數(shù)(Math.ceil和Math.floor)
*因為speedX和speedY是一個變化的值,即將DIV和鼠標點擊的點X坐標之間的距離,平均分成5分,
*mouseX == oDiv.offsetLeft就永遠不可能相等,就不會執(zhí)行if里面的語句了,所以這將一直循環(huán)下去
*/
oDivLeft = mouseX-oDivLeft>0?Math.ceil(oDivLeft+speedX):Math.floor(oDivLeft+speedX);
oDivTop = mouseY-oDivTop>0?Math.ceil(oDivTop+speedY):Math.floor(oDivTop+speedY);
console.log(oDivLeft);
//用當位置的TOP或left值,去加上每一次,即每30毫秒移動的距離,就得到新的坐標
oDiv.style.left = oDivLeft + "px";
oDiv.style.top = oDivTop + "px";
//如果到達鼠標點擊的位置
if(mouseX == oDiv.offsetLeft && mouseY == oDiv.offsetTop){
//清除這個運動動畫
clearInterval(setCliMove);
//恢復document的click綁定的事件
evnetUtil.addEventHandle(document,'click',eventMove);
}
},30);
}
//根據(jù)標鼠標軌跡移動動畫二
var slideMove = function(cev){
alert("正在制做當中……");
}
//綁定事件,改變input狀態(tài)(事件對象,input對象,標識點擊的那個Input)
var binds = function(cev,oElem,index){
//防止多次點擊同一個Input
if(oElem.className == ""){
oElem.value=oElem.value+"(已激活)"
oElem.className = "cur";
}
//點擊不同的input顯示不同文字和啟用不同動畫開關(guān)
if(index==0){
oInput[1].value = "根據(jù)標鼠標軌跡移動";
oInput[1].className = "";
choMove = true;
}else{
oInput[0].value = "根據(jù)鼠標點擊位置移動";
oInput[0].className = "";
choMove = false;
}
//只綁document定一次,再次點擊無需綁定,只需要啟用不同的動畫模式
if(isClick){
evnetUtil.addEventHandle(document,'click',eventMove);
isClick = false;
}
//防止冒泡
cev.stopPropagation ?cev.stopPropagation() : (cev.cancelBubble=true);
}
window.onload = function(){
oInput = document.getElementsByTagName("input");
oDiv = document.getElementsByTagName("div")[0];
oInput[0].onclick = function(event){
var This = this;
var ev = event || window.event;
binds(ev,This,0);
}
oInput[1].onclick = function(event){
var This = this;
var ev = event || window.event;
binds(ev,This,1);
}
}
</script>
一、原理分析:
1.怎么移動?
要移動DIV到指到的坐標點(X,Y),其實質(zhì),就是同時改變DIV的DIV.style.top 和 DIV.style.left 這兩個值;
2.如何看到移動?
因為要有移動效果,而不是突然間就將某個DIV的TOP和LEFT值變化為另一個值,所以就要用到:
setInterval這個阻塞函數(shù),讓函數(shù)的執(zhí)行,延遲,這樣就能看到移動效果。(只要是有的運動和移動都要用到這個函數(shù));
二、現(xiàn)實思路
1.速度
有運動,肯定就離不開速度這個概念,在這個例子中,速度是變化的,即DIV和鼠標點擊的坐標,之間的距離越大,這個速度應該越快。反之速度越慢。以保證在同一個時間內(nèi),完成不同距離的運動。
所以 速度=距離/固定值;
這樣,當距離越大,速度越快。反之越小
2.如何判斷DIV移動到了鼠標點擊的點?
即:DIV的LEFT值和TOP值,與鼠標點擊時的X和Y值都相等。
在這個例子中。要使用函數(shù)(Math.ceil和Math.floor) 具體可以看代碼中的注釋
總結(jié):寫這個的時候想的太復雜,所以卡了好半天。思路一定要理清,再動手。
以上就是本文的全部內(nèi)容,希望對大家有所幫助,謝謝對腳本之家的支持!
相關(guān)文章
url傳遞的參數(shù)值中包含&時,url自動截斷問題的解決方法
下面小編就為大家?guī)硪黄猽rl傳遞的參數(shù)值中包含&時,url自動截斷問題的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
JavaScript檢測是否開啟了控制臺(F12調(diào)試工具)
通過js來檢測開發(fā)者工具是否打開,防止別人惡意調(diào)試我們的代碼,最近我發(fā)現(xiàn)還是有蠻多人去瀏覽那篇文章,所以這里再放出一段代碼,算是個升級版吧2020-10-10
JavaScript實現(xiàn)的CRC32函數(shù)示例
這篇文章主要介紹了JavaScript實現(xiàn)的CRC32函數(shù),簡單介紹了CRC32函數(shù)的概念和功能,并給出實例形式分析了CRC32函數(shù)的javascript實現(xiàn)與使用方法,需要的朋友可以參考下2016-11-11
JavaScript cookie與session的使用及區(qū)別深入探究
這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-10-10
JavaScript知識點總結(jié)(五)之Javascript中兩個等于號(==)和三個等于號(===)的區(qū)別
這篇文章主要介紹了JavaScript知識點總結(jié)(五)之Javascript中兩個等于號(==)和三個等于號(===)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-05-05

