原生js拖拽功能製作滑動條實例教程

拖拽屬於前端常見的功能,很多效果都會用到js的拖拽功能。滑動條的核心功能也就是使用js拖拽滑塊來修改位置。一個完整的滑動條包括 滑動條、滑動痕跡、滑塊、文本 等元素,先把html代碼寫出來,如下所示:

<div class="bar_wrap" id="wrap"><!--外包裹元素-->
  <div class="bar_container"><!--滑動條-->
    <div class="bar_into"></div><!--滑動痕跡-->
  </div>
  <div class="bar_drag"><!--滑塊-->
    <div class="bar_text"></div><!--文本-->
  </div>
</div>

然後給各元素添加css樣式,完成下圖效果:

 

 

接下來通過分析功能,一步一步完成js代碼。

1. 獲取滑動條各個元素,代碼如下:

  //獲取外包裹元素
  var eBarWrap = document.getElementById('wrap');
  //獲取滑動條
  var eBarCon = eBarWrap.getElementsByClassName('bar_container')[0];
  //獲取滑動痕跡元素
  var eBarInto = eBarWrap.getElementsByClassName('bar_into')[0];
  //獲取滑塊
  var eBarDrag = eBarWrap.getElementsByClassName('bar_drag')[0];
  //獲取文本元素
  var eBarText = eBarWrap.getElementsByClassName('bar_text')[0];

 

2. 獲取滑動最大值
因爲滑塊只能在滑動條內滑動,所以需要限制最大滑動位置。而DOM元素計算位置是從元素的左側開始,所以最大值應該是 滑動條的寬度-滑塊 的寬度,如下所示:

  //獲取最大位置
  var nMax = eBarCon.offsetWidth - eBarDrag.offsetWidth;

 

3. 在滑塊上綁定鼠標按下事件函數,實現拖拽滑塊功能,代碼如下:

  //滑塊添加拖拽事件
  eBarDrag.addEventListener('mousedown',function(event){
    
  });

3.1 獲取滑塊位置
需要拖動滑塊,肯定要先知道滑塊原來的位置,才能根據鼠標的移動來拖拽滑塊。在滑塊上綁定的事件函數上有傳入一個event對象,這個event對象代表當前事件的實例對象,包含當前事件相關信息。如下所示:

  //滑塊添加拖拽事件
  eBarDrag.addEventListener('mousedown',function(event){
    //初始化鼠標開始拖拽的點擊位置
    var nInitX = event.clientX;
    //初始化滑塊位置
    var nInitLeft = this.offsetLeft;
  });

 

3.2 滑塊跟隨鼠標移動,修改滑動痕跡和文本數值
操作時,在滑塊上按下鼠標,再移動鼠標就可以使滑塊跟隨鼠標移動。但一般移動鼠標不可能只在滑動條上面移動,所以需要在頁面上綁定鼠標移動事件,如下所示:

  //滑塊添加拖拽事件
  eBarDrag.addEventListener('mousedown',function(event){
    /*...*/

    //頁面綁定鼠標移動事件
    document.onmousemove = event=>{
      //鼠標移動時取消默認行爲,避免選中其他元素或文字
      event.preventDefault();
      //獲取鼠標移動後滑塊應該移動到的位置
      let nX = event.clientX - nInitX + nInitLeft;
      //限制滑塊最大移動位置
      if(nX>=nMax){
        nX = nMax;
      }
      //限制滑塊最小移動位置
      if(nX<=0){
        nX = 0;
      }
      //修改滑塊位置(因爲用的是箭頭函數,所以this還是指向滑塊)
      this.style.left = nX + 'px';
      //修改滑動痕跡寬度
      eBarInto.style.width = nX + this.offsetWidth/2 + 'px';
      //修改文本數值
      eBarText.innerHTML = Math.ceil(nX/nMax*100)/10;
    };
  });

 

3.3 釋放鼠標時,固定滑塊位置
當釋放鼠標的時候,滑塊固定在當前移動到的位置,滑動痕跡和文本數值已經一起修改。

  //滑塊添加拖拽事件
  eBarDrag.addEventListener('mousedown',function(event){
    /*...*/

    //鼠標鬆開綁定事件,取消頁面上所有事件
    document.onmouseup = function(event){
      document.onmousemove = null;
      document.onmouseup = null;
    }
  });

 

鼠標按下事件函數就完成了。滑動條的樣式都可以通過css實現,但默認文本數值是空的,這不太合理,所以需要加多一句代碼,給文本元素默認賦值爲0,如下所示:

  //修改默認數值
  eBarText.innerHTML = 0;

 

4. 在滑動條上添加點擊事件
當點擊滑動條上除滑塊之外的位置時,滑塊應該直接滑動到鼠標點擊的位置。需要在滑動條上添加點擊事件實現此功能,代碼如下:

  //滑動條添加點擊事件
  eBarCon.addEventListener('click',function(event){
    //設置滑動條位置
    var nLeft = this.offsetLeft;
    //獲取有定位的父元素
    var eParent = this.offsetParent;
    //循環所有有定位的父元素
    while(eParent){
      //添加定位父元素offsetLeft值,用於準確定位滑動條與頁面左側的距離 
      nLeft += eParent.offsetLeft;
      //再次獲取父元素外的定位父元素
      eParent = eParent.offsetParent;
    }
    //計算滑塊位置
    var nX = event.clientX - nLeft;
    //修改滑塊位置
    eBarDrag.style.left = nX +'px';
    //修改滑動痕跡寬度
    eBarInto.style.width = nX + eBarDrag.offsetWidth/2 + 'px';
    //修改文本數值
    eBarText.innerHTML = Math.ceil(nX/nMax*100)/10
  });

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章