亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

javascript實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊頁面 移動(dòng)DIV

 更新時(shí)間:2016年12月02日 09:01:22   作者:船長(zhǎng)op  
本篇文章主要介紹javascript實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊頁面,移動(dòng)DIV。話不多說,附上代碼實(shí)例。需要的朋友來看下吧
<script type="text/javascript">
 //那種方式移動(dòng)
 var choMove = false;
 //是否綁定過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ù)開關(guān),來讓document的Click事件綁定不同的動(dòng)畫函數(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)畫一
 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)畫中,擊點(diǎn)頁面會(huì)又一次觸發(fā)這個(gè)動(dòng)畫
  evnetUtil.removeEventHandle(document,'click',eventMove);
  var setCliMove = setInterval(function(){
    var oDivLeft = oDiv.offsetLeft; //DIV在頁面中的Left值;
    var oDivTop = oDiv.offsetTop; //DIV在頁面中的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里面的語句了,所以這將一直循環(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)畫
     clearInterval(setCliMove);
     //恢復(fù)document的click綁定的事件
     evnetUtil.addEventHandle(document,'click',eventMove);
    } 
  },30);
 } 
 //根據(jù)標(biāo)鼠標(biāo)軌跡移動(dòng)動(dòng)畫二
 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)畫開關(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)擊無需綁定,只需要啟用不同的動(dòng)畫模式
  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),肯定就離不開速度這個(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é):寫這個(gè)的時(shí)候想的太復(fù)雜,所以卡了好半天。思路一定要理清,再動(dòng)手。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家有所幫助,謝謝對(duì)腳本之家的支持!

相關(guān)文章

最新評(píng)論