日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開發(fā)javascript|JQuery → javascript 層的鼠標(biāo)拖動(dòng)效果事件處理

      javascript 層的鼠標(biāo)拖動(dòng)效果事件處理

      前往專題相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/5/11 10:59:28字體大。A-A+

      作者:佚名點(diǎn)擊:214次評(píng)論:0次標(biāo)簽: javascript

      • 類型:電子教程大小:3.3M語(yǔ)言:中文 評(píng)分:3.6
      • 標(biāo)簽:
      立即下載

      在經(jīng)歷了漫長(zhǎng)的時(shí)期,終于下定了決心自己寫一個(gè)層的拖動(dòng)。
      當(dāng)然了,其它的拖動(dòng)也是這樣的思路和做法,或者說(shuō),這樣的拖動(dòng)適合所有的可見元素。

      先看看要拖動(dòng)的層(模擬窗口)的效果圖吧。

      要實(shí)現(xiàn)的拖動(dòng)效果:鼠標(biāo)左鍵在窗口上方的標(biāo)題欄上按下,同時(shí)移動(dòng)鼠標(biāo),窗口跟著移動(dòng)。

      窗口:

      <div id="win">
      <div id="win_header"></div>
      </div>

      一點(diǎn)準(zhǔn)備工作:
      要讓窗口能自由移動(dòng),那么窗口的定位(position)應(yīng)該采用絕對(duì)定位(absolute);
      給窗口添加標(biāo)題欄,這里使用一個(gè)放在窗口頂部的層實(shí)現(xiàn),同時(shí)將標(biāo)題欄的鼠標(biāo)光標(biāo)設(shè)置為拖動(dòng)(move)形狀(在chrome中拖動(dòng)的時(shí)候,光標(biāo)會(huì)變成文字光標(biāo),松開鼠標(biāo)鍵后恢復(fù))。

      #win {
      position:absolute;
      width:480px;
      height:320px;
      background-color:#d4d4d4;
      border: 1px solid #4d4d4d;
      }
      #win_header {
      width:480px;
      height:48px;
      background-color:#4d4d4d;
      cursor:move;
      }

      定義一個(gè)工具函數(shù),用來(lái)獲取指定ID屬性的元素:

      function $id(id) {
      return document.getElementById(id);
      }

      定義一個(gè)瀏覽器核心標(biāo)識(shí)isIE:

      var isIE = (window.navigator.userAgent.indexOf("IE") == -1) ? false : true;

      獲取到窗口元素及其標(biāo)題欄:

      var win = $id("win");
      var header = $id("win_header");

      為了方便記錄鼠標(biāo)和窗口的位置信息,創(chuàng)建一個(gè)位置:

      var pos =function(x, y) {
      this.x = x;
      this.y = y;
      };

      給窗口設(shè)置一個(gè)初始位置(css的left值和top值)。
      這里不知道是為什么,如果不使用js設(shè)置這兩個(gè)屬性,就取不到值,在CSS中指定了也不行。

      var originalpos = new pos(20, 20);

      在拖動(dòng)窗口的過(guò)程中,需要記錄的值有:
      鼠標(biāo)按下時(shí)鼠標(biāo)光標(biāo)的位置

      var oldmouse =new pos(0, 0);

      鼠標(biāo)按下時(shí)窗口的位置

      var oldpos = new pos(0, 0);

      鼠標(biāo)移動(dòng)時(shí)窗口的新的位置

      var newpos = new pos(0, 0);

      設(shè)置窗口的初始位置

      win.style.left = originalpos.x + "px";
      win.style.top = originalpos.y + "px";

      又是因?yàn)闉g覽器的差異(IE和非IE),元素綁定事件處理函數(shù)的方法不同(IE使用attachEvent,非IE使用addEventListener),為了簡(jiǎn)化事件綁定的操作,定義一個(gè)事件綁定函數(shù):

      function bind(ev, func) {
      if(isIE) {
        header.attachEvent("on" + ev, func);
      } else {
        header.addEventListener(ev, func, false);
      }
      }

      在做好這些工作后,就可以開始處理鼠標(biāo)事件了。

      在這個(gè)程序中,只希望鼠標(biāo)左鍵拖動(dòng)窗口,其它鍵都不能,所以需要判斷是否是鼠標(biāo)左鍵按下。而這個(gè)判斷會(huì)在幾個(gè)函數(shù)中都使用到,所以提取出來(lái)到一個(gè)函數(shù)中,通過(guò)傳入的參數(shù)(鼠標(biāo)鍵值,即按下了哪個(gè)鍵)判斷。在這里,需要注意瀏覽器間的差異:IE中鼠標(biāo)左鍵的值是1,而非IE中值是0.

      function isLeftButton(btn) {
          if(isIE) {
              if(btn == 1)
                  return true;
              else
                  return false;
          } else {
              if(btn == 0)
                  return true;
              else
                  return false;
          }
      }

      拖動(dòng)動(dòng)作是在按下鼠標(biāo)左鍵后移動(dòng)來(lái)完成的。把這個(gè)動(dòng)作分享開來(lái),即是鼠標(biāo)先觸發(fā)了按下動(dòng)作(mousedown),然后觸發(fā)了移動(dòng)動(dòng)作(mousemove)。為了判斷是否是真的在拖動(dòng)還是只是鼠標(biāo)從窗口上經(jīng)過(guò),設(shè)置一個(gè)變量來(lái)記錄鼠標(biāo)按下的狀態(tài):

      var mousedown = false;

      由于CSS中存在的兼容性問(wèn)題,這里使用js來(lái)控制鼠標(biāo)懸停在窗口標(biāo)題欄上面的時(shí)候的顏色變化。
      懸浮

      function over(e){
        header.style.backgroundColor = "#5d5d5d";
      }


      離開

      function out(e) {
      header.style.backgroundColor = "#4d4d4d";
      // 有時(shí)候鼠標(biāo)會(huì)在未松開的情況下離開窗口,
      // 此時(shí)通過(guò)觸發(fā)鼠標(biāo)的松開事件來(lái)使窗口脫離鼠標(biāo)的控制
      up(e);
      }

      按下
      在按下事件中,需要先判斷是否按下的是鼠標(biāo)的左鍵;
      若是才記錄鼠標(biāo)和窗口此時(shí)的位置,否則不記錄。

      function down(e) {
          e = e || event;
         
          if(!isLeftButton(e.button))
              return;
         
          mousedown = true;
          oldmouse.x = e.clientX;
          oldmouse.y = e.clientY;
         
          oldpos.x = parseInt(win.style.left.replace("px", ""));
          oldpos.y = parseInt(win.style.top.replace("px", ""));
      }


      松開

      function up(e) {
          if(!isLeftButton(e.button))
              return;
          mousedown = false;
      }


      移動(dòng)
      這里就涉及到鼠標(biāo)的兩個(gè)事件:
      按下和移動(dòng)。當(dāng)且僅當(dāng)鼠標(biāo)左鍵按下時(shí),移動(dòng)動(dòng)作才有效。
      窗口的新位置,是由鼠標(biāo)在拖動(dòng)狀態(tài)下的移動(dòng)距離(X和Y的距離)決定的。即:
      新的鼠標(biāo)位置送去按下左鍵時(shí)記錄下的位置,得到一個(gè)距離,然后將窗口的位置加上鼠標(biāo)移動(dòng)的距離得到窗口的新位置。

      function move(e) {
          if(!isLeftButton(e.button))
              return;
             
          if(mousedown) {
              e =e || event;
             
              newpos.x = e.clientX - oldmouse.x;
              newpos.y = e.clientY - oldmouse.y
         
              win.style.left = (oldpos.x + newpos.x) + "px";
              win.style.top = (oldpos.y + newpos.y) + "px";
          }
      }

      事件處理都寫好了,最后來(lái)給元素綁定上吧,阿門!

      bind("mouseover", over);
      bind("mouseenter", over);
      bind("mouseout", out);
      bind("mouseleave", out);
      bind("blur", out);
      bind("mousedown", down);
      bind("mouseup", up);
      bind("mousemove", move);

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)