原生js拖拽效果

最近新學(xué)了拖拽效果,沒有好記性,只好用爛筆頭記錄一下了。首先講講拖拽的思路(只分析水平方向,垂直方向類似):


思維圖
  1. 首先就是布局,移動物體無非兩種方式:滾動以及定位。當(dāng)拖動內(nèi)容小于父元素時,使用定位;反之則使用滾動。(demo為小于父元素,所以使用定位)
  2. 當(dāng)mousedown 時,記錄下鼠標(biāo)clientX以及元素offerLeft在document中的位置,然后得到元素距離差 leftInDrag = clientX - offerLeft
    ps:若是body內(nèi)容過大,產(chǎn)生了滾動條,還需要加上scrollLeft,即 leftInDrag = clientX - offerLeft + scrollLeft
  3. 當(dāng)鼠標(biāo)移動時,用鼠標(biāo)所在位置減去距離差即得到元素位置oDragLeft = clientX - leftInDrag
  4. 臨界值判斷,這就要和窗口大小做比較了
  5. 既然是拖拽,那就是要確保元素移動的時候是一直按著鼠標(biāo)的
  6. 加一點tween.js做做動效:即當(dāng)把物體拖到中間放手時,物體會退回兩旁

首先要布局

<div class="drag"></div>
樣式布局如下:

  *{
    margin: 0;padding: 0;
}
body{
    width: 2000px;
    height: 2000px;
} //假設(shè)內(nèi)容超出窗口
.drag{
    position: absolute;
    left: 100px;
    top:100px;
    width: 100px;height: 100px;
    background: #cde;
    cursor: move;
}

接下來就是js樣式了,說了要加一點tween.js玩玩,自然是要先引入進(jìn)來的

<script src="js/tween.js"></script>

主體js代碼

第一步就是初始化

     var oDrag = document.getElementsByClassName('drag')[0];
     var scrollLeft,scrollTop,leftInDrag,TopInDrag,x,y;
     var moveTimer = null; //運行tween的計時器

然后就是設(shè)置鼠標(biāo)按下并移動的事件

          oDrag.onmousedown = function(e){
                var e = e||window.event;
                //瀏覽器默認(rèn)當(dāng)鼠標(biāo)移動時,滾動條也會跟著動,所以要阻止默認(rèn)事件
                e.preventDefault();
                //記錄鼠標(biāo)在拖拽方塊內(nèi)的位置
                scrollLeft = document.body.scrollLeft||document.documentElement.scrollLeft;
                scrollTop = document.body.scrollTop||document.documentElement.scrollTop;
                leftInDrag = e.clientX - oDrag.offsetLeft + scrollLeft;
                TopInDrag = e.clientY - oDrag.offsetTop + scrollTop;
                
                oDrag.onmousemove = function(e){
                    var e = e||window.event;
                    //阻止默認(rèn)事件
                    e.preventDefault();
                    x = e.clientX - leftInDrag;
                    y = e.clientY - TopInDrag;
                    //臨界值判斷,當(dāng)元素超出窗口大小時,把元素位置定在窗口的最小/最大值
                    x = x <= 0 ? 0 : x;
                    if(x >= document.documentElement.clientWidth-oDrag.offsetWidth){
                        x = document.documentElement.clientWidth-oDrag.offsetWidth;
                    }
                    y = Math.max(y,0);//這個語句得到的結(jié)果和if判斷一樣,只是本人手懶,想少敲幾個代碼
                    y = Math.min(y,(document.documentElement.clientHeight-oDrag.offsetHeight));
                    oDrag.style.left = x + scrollLeft + 'px';
                    oDrag.style.top = y + scrollTop + 'px';
                }
            }

以上代碼已經(jīng)能夠使元素跟著鼠標(biāo)移動了,但是鼠標(biāo)沒有按下時元素也會隨著移動,所以要做一點限制:

     document.onmouseup = function(){
            oDrag.onmousemove = null;
      }

好啦,接下來是比較好玩的環(huán)節(jié)啦,當(dāng)鼠標(biāo)彈起時,元素會自動彈到窗口兩旁

          oDrag.onmouseup = function(){
               oDrag.onmousemove = null;
               var start,end,change,step = 1;
               if(x>=(document.documentElement.clientWidth-oDrag.offsetWidth)/2){
                   end = document.documentElement.clientWidth-oDrag.offsetWidth;
                   stepMax = Math.floor(end);
               }else{
                   end = 0;
                   stepMax = Math.floor(x);
               }
                   change = end - x;
               moveTimer = setInterval(function(){
                   step++;
                   if(step == stepMax){
                       clearInterval(moveTimer);
                       moveTimer = null;
                   }
                   oDrag.style.left = Tween.Bounce.easeIn(step,x,change,stepMax) + scrollLeft + 'px';
               },5);
           }

今天的筆記就做到這里了,另:tween.js也沒什么好講的,會使用就成了.Tween的使用方法可以戳這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Window和document對象的區(qū)別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,365評論 0 5
  • 本文是針對剛學(xué)編程的小白,都是一些基礎(chǔ)知識,如果想了解更多深層一點的東西,歡迎移步本人博客!! 博客地址 點擊跳轉(zhuǎn)...
    西巴擼閱讀 734評論 0 2
  • 一、自定義動畫 延遲執(zhí)行start.style.animationDelay = delay + 's'; 二、U...
    LIT樂言閱讀 652評論 0 2
  • offset家族三大家族和一個事件對象三大家族(offset/scroll/client)事件對象/event ...
    Yuann閱讀 1,085評論 0 5
  • 今晚去李翔那里睡了,希望早點睡覺,明天激光去毛,和借書,平凡的世界,還有裝凈水器。 晚上學(xué)跳爵士,fire,有些動...
    崔煥英閱讀 246評論 0 0

友情鏈接更多精彩內(nèi)容