javascript實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊頁(yè)面 移動(dòng)DIV
<script type="text/javascript">
//那種方式移動(dòng)
var choMove = false;
//是否綁定過(guò)click
var isClick = true;
//引用DIV
var oDiv = null;
//引用Input
var oInput = null;
//封裝事件綁定的通用對(duì)象
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ù)開(kāi)關(guān),來(lái)讓document的Click事件綁定不同的動(dòng)畫(huà)函數(shù)
var eventMove = function(event){
var ev = event || window.event;
choMove==true?clickMove(ev):slideMove(ev);
}
//根據(jù)鼠標(biāo)點(diǎn)擊位置移動(dòng)動(dòng)畫(huà)一
var clickMove = function(cev){
var mouseX = cev.clientX; //鼠標(biāo)點(diǎn)擊的橫坐標(biāo)
var mouseY = cev.clientY; //鼠標(biāo)點(diǎn)擊的縱坐標(biāo)
//取消document的click事件綁定的函數(shù),以避免在動(dòng)畫(huà)中,擊點(diǎn)頁(yè)面會(huì)又一次觸發(fā)這個(gè)動(dòng)畫(huà)
evnetUtil.removeEventHandle(document,'click',eventMove);
var setCliMove = setInterval(function(){
var oDivLeft = oDiv.offsetLeft; //DIV在頁(yè)面中的Left值;
var oDivTop = oDiv.offsetTop; //DIV在頁(yè)面中的Top值;
/*橫坐標(biāo)移動(dòng)的速,即每30毫秒,移動(dòng)speedX距離
*mouseX-oDivLeft當(dāng)前DIV與目標(biāo)點(diǎn)之間的距離,
*除以5,就是將這個(gè)距離分成5份
*分母5不變,距離越小,所以移動(dòng)速度就越慢
*/
var speedX = (mouseX-oDivLeft)/5;
//縱坐標(biāo)移動(dòng)的速度,即每30毫秒,移動(dòng)speedX距離,這個(gè)speedY是變化的,距離鼠標(biāo)點(diǎn)擊的位置越近,這個(gè)值越小
var speedY = (mouseY-oDivTop)/5;
/*這里必需使用向上或向下取舍的函數(shù)(Math.ceil和Math.floor)
*因?yàn)閟peedX和speedY是一個(gè)變化的值,即將DIV和鼠標(biāo)點(diǎn)擊的點(diǎn)X坐標(biāo)之間的距離,平均分成5分,
*mouseX == oDiv.offsetLeft就永遠(yuǎn)不可能相等,就不會(huì)執(zhí)行if里面的語(yǔ)句了,所以這將一直循環(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);
//用當(dāng)位置的TOP或left值,去加上每一次,即每30毫秒移動(dòng)的距離,就得到新的坐標(biāo)
oDiv.style.left = oDivLeft + "px";
oDiv.style.top = oDivTop + "px";
//如果到達(dá)鼠標(biāo)點(diǎn)擊的位置
if(mouseX == oDiv.offsetLeft && mouseY == oDiv.offsetTop){
//清除這個(gè)運(yùn)動(dòng)動(dòng)畫(huà)
clearInterval(setCliMove);
//恢復(fù)document的click綁定的事件
evnetUtil.addEventHandle(document,'click',eventMove);
}
},30);
}
//根據(jù)標(biāo)鼠標(biāo)軌跡移動(dòng)動(dòng)畫(huà)二
var slideMove = function(cev){
alert("正在制做當(dāng)中……");
}
//綁定事件,改變input狀態(tài)(事件對(duì)象,input對(duì)象,標(biāo)識(shí)點(diǎn)擊的那個(gè)Input)
var binds = function(cev,oElem,index){
//防止多次點(diǎn)擊同一個(gè)Input
if(oElem.className == ""){
oElem.value=oElem.value+"(已激活)"
oElem.className = "cur";
}
//點(diǎn)擊不同的input顯示不同文字和啟用不同動(dòng)畫(huà)開(kāi)關(guān)
if(index==0){
oInput[1].value = "根據(jù)標(biāo)鼠標(biāo)軌跡移動(dòng)";
oInput[1].className = "";
choMove = true;
}else{
oInput[0].value = "根據(jù)鼠標(biāo)點(diǎn)擊位置移動(dòng)";
oInput[0].className = "";
choMove = false;
}
//只綁document定一次,再次點(diǎn)擊無(wú)需綁定,只需要啟用不同的動(dòng)畫(huà)模式
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.怎么移動(dòng)?
要移動(dòng)DIV到指到的坐標(biāo)點(diǎn)(X,Y),其實(shí)質(zhì),就是同時(shí)改變DIV的DIV.style.top 和 DIV.style.left 這兩個(gè)值;
2.如何看到移動(dòng)?
因?yàn)橐幸苿?dòng)效果,而不是突然間就將某個(gè)DIV的TOP和LEFT值變化為另一個(gè)值,所以就要用到:
setInterval這個(gè)阻塞函數(shù),讓函數(shù)的執(zhí)行,延遲,這樣就能看到移動(dòng)效果。(只要是有的運(yùn)動(dòng)和移動(dòng)都要用到這個(gè)函數(shù));
二、現(xiàn)實(shí)思路
1.速度
有運(yùn)動(dòng),肯定就離不開(kāi)速度這個(gè)概念,在這個(gè)例子中,速度是變化的,即DIV和鼠標(biāo)點(diǎn)擊的坐標(biāo),之間的距離越大,這個(gè)速度應(yīng)該越快。反之速度越慢。以保證在同一個(gè)時(shí)間內(nèi),完成不同距離的運(yùn)動(dòng)。
所以 速度=距離/固定值;
這樣,當(dāng)距離越大,速度越快。反之越小
2.如何判斷DIV移動(dòng)到了鼠標(biāo)點(diǎn)擊的點(diǎn)?
即:DIV的LEFT值和TOP值,與鼠標(biāo)點(diǎn)擊時(shí)的X和Y值都相等。
在這個(gè)例子中。要使用函數(shù)(Math.ceil和Math.floor) 具體可以看代碼中的注釋
總結(jié):寫(xiě)這個(gè)的時(shí)候想的太復(fù)雜,所以卡了好半天。思路一定要理清,再動(dòng)手。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家有所幫助,謝謝對(duì)腳本之家的支持!
- js實(shí)現(xiàn)鍵盤(pán)控制DIV移動(dòng)的方法
- js+html+css實(shí)現(xiàn)鼠標(biāo)移動(dòng)div實(shí)例
- 利用javascript移動(dòng)div層-javascript 拖動(dòng)層
- javascript DIV實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)
- JavaScript與Div對(duì)層定位和移動(dòng)獲得坐標(biāo)的實(shí)現(xiàn)代碼
- JS onmousemove鼠標(biāo)移動(dòng)坐標(biāo)接龍DIV效果實(shí)例
- js拖動(dòng)div 當(dāng)鼠標(biāo)移動(dòng)時(shí)整個(gè)div也相應(yīng)的移動(dòng)
- js實(shí)現(xiàn)鍵盤(pán)操作實(shí)現(xiàn)div的移動(dòng)或改變的原理及代碼
- javascript實(shí)現(xiàn)點(diǎn)擊按鈕讓DIV層彈性移動(dòng)的方法
- JavaScript利用鍵盤(pán)碼控制div移動(dòng)
相關(guān)文章
url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦?wèn)題的解決方法
下面小編就為大家?guī)?lái)一篇url傳遞的參數(shù)值中包含&時(shí),url自動(dòng)截?cái)鄦?wèn)題的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
JavaScript檢測(cè)是否開(kāi)啟了控制臺(tái)(F12調(diào)試工具)
通過(guò)js來(lái)檢測(cè)開(kāi)發(fā)者工具是否打開(kāi),防止別人惡意調(diào)試我們的代碼,最近我發(fā)現(xiàn)還是有蠻多人去瀏覽那篇文章,所以這里再放出一段代碼,算是個(gè)升級(jí)版吧2020-10-10
JS實(shí)現(xiàn)的網(wǎng)頁(yè)背景閃電閃爍效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)的網(wǎng)頁(yè)背景閃電閃爍效果代碼,涉及JavaScript定時(shí)函數(shù)結(jié)合頁(yè)面元素樣式操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
基于JavaScript實(shí)現(xiàn)TAB標(biāo)簽效果
js實(shí)現(xiàn)tab標(biāo)簽效果,在項(xiàng)目中經(jīng)常用到,今天抽點(diǎn)時(shí)間把我寫(xiě)的js實(shí)現(xiàn)tab標(biāo)簽效果源碼分享給大家,對(duì)js tab標(biāo)簽代碼需要的朋友參考下2016-01-01
JavaScript實(shí)現(xiàn)的CRC32函數(shù)示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的CRC32函數(shù),簡(jiǎn)單介紹了CRC32函數(shù)的概念和功能,并給出實(shí)例形式分析了CRC32函數(shù)的javascript實(shí)現(xiàn)與使用方法,需要的朋友可以參考下2016-11-11
使用原生js編寫(xiě)一個(gè)簡(jiǎn)單的框選功能方法
這篇文章主要介紹了使用原生js編寫(xiě)一個(gè)簡(jiǎn)單的框選功能方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
JS正則截取兩個(gè)字符串之間及字符串前后內(nèi)容的方法
這篇文章主要介紹了JS正則截取兩個(gè)字符串之間及字符串前后內(nèi)容的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了JS正則截取字符串操作的常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
JavaScript cookie與session的使用及區(qū)別深入探究
這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-10-10
JavaScript知識(shí)點(diǎn)總結(jié)(五)之Javascript中兩個(gè)等于號(hào)(==)和三個(gè)等于號(hào)(===)的區(qū)別
這篇文章主要介紹了JavaScript知識(shí)點(diǎn)總結(jié)(五)之Javascript中兩個(gè)等于號(hào)(==)和三個(gè)等于號(hào)(===)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-05-05

