1. 程式人生 > 程式設計 >JavaScript實現拖拽效果

JavaScript實現拖拽效果

要實現JavaScript的拖拽效果,首先我們需要知道事件物件幾個有關於實現拖拽效果的座標

獲取事件物件 var e = e || window.event;

根據需求需要用到的拖拽效果的座標

clientX:滑鼠點選位置相對於瀏覽器可視區域的水平偏移量(不會計算水平滾動的距離)

clientY:滑鼠點選位置相對於瀏覽器可視區域的垂直偏移量(不會計算垂直滾動條的距離)

offsetX:滑鼠點選位置相對於觸發事件物件的水平距離

offsetY:滑鼠點選位置相對於觸發事件物件的垂直距離

pageX:滑鼠點選位置相對於網頁左上角的水平偏移量,也就是clientX加 上水平滾動條的距離

pageY:滑鼠點選位置相對於網頁左上角的垂直平偏移量,也就是clientY加上垂直滾動條的距離

offsetLeft:如果父元素中有定位的元素,那麼就返回距離當前元素最近的定位元素邊緣的距離

offsetTop:如果父元素中沒有定位元素,那麼就返回相對於body左邊緣距離

獲取元素自身大小:offsetWidth和offsetHeight / clientWidth和clientHeight

offsetWidth和clientWidth的區別:就是offsetWidth包含邊框,clientWidth不包含邊框

實現拖拽需要用到:clientWidth、clientHeight、clientX、clientY、offsetLeft、offsetTop

首先搭建好html結構和css樣式

<div class="wrap">
 <div class="cover">

 </div>
</div>
* {
  margin: 0;
  padding: 0;
 }
 
 .wrap {
  width: 500px;
  height: 500px;
  border: 1px solid deeppink;
  position: relative;
  margin: 50px auto;
 }
 
 .cover {
  width: 150px;
  height: 150px;
  background: rgba(200,7,99,0.5);
  display: none;
  position: absolute;
  left: 0;
  top: 0;
  cursor: move;
 }

注意:需要給大盒子和小盒子進行定位:子絕父相

接下來就JavaScript程式碼

<script>
 var wrap = document.querySelector(".wrap");
 var cover = document.querySelector(".cover");
 wrap.onmouseover = function() {
 cover.style.display = "block";
 wrap.onmousemove = function(e) {
  var e = e || window.event;
  var x1 = e.clientX;
  var y1 = e.clientY;
//這裡獲取到的e.clientX和e.clientY,可以看情況和需求改為e.pageX和e.pageY  
  var halfWidth = cover.clientWidth / 2;
  var halfHeight = cover.clientHeight / 2;
  var wrapLeft = wrap.offsetLeft;
  var wrapTop = wrap.offsetTop;
  var l = x1 - wrapLeft - halfWidth;
  var t = y1 - wrapTop - halfHeight;

  if (l <= 0) {
  l = 0
  }
  if (l >= wrap.clientWidth - cover.clientWidth) {
  l = wrap.clientWidth - cover.clientWidth
  }
  if (t <= 0) {
  t = 0
  }
  if (t >= wrap.clientHeight - cover.clientHeight) {
  t = wrap.clientHeight - cover.clientHeight
  }
  cover.style.left = l + "px";
  cover.style.top = t + "px"
 }
 }
 wrap.onmouseout = function() {
 cover.style.display = "none";
 }
</script>
var halfWidth = cover.clientWidth / 2;
var halfHeight = cover.clientHeight / 2;
var wrapLeft = wrap.offsetLeft;
var wrapTop = wrap.offsetTop;
var l = x1 - wrapLeft - halfWidth;
var t = y1 - wrapTop - halfHeight;
//限制範圍
  if (l <= 0) {
    l = 0
   }
   if (l >= wrap.clientWidth - cover.clientWidth) {
    l = wrap.clientWidth - cover.clientWidth
   }
   if (t <= 0) {
    t = 0
   }
   if (t >= wrap.clientHeight - cover.clientHeight) {
    t = wrap.clientHeight - cover.clientHeight
   }

注意:這裡要限制小盒子在大盒子之間移動的範圍,左上角的限制,當小盒子超出範圍時,將0賦值給l和t。右下角小盒子移動的範圍在大盒子寬度減去小盒子的寬度。
其中為了使滑鼠一直處於小盒子(cover)的最中間,需要減去小盒子寬度的一半。
再減去大盒子距離頁面左邊的邊距和上邊的邊距就可以得到座標

只要滑鼠移入大盒子中,就能直接拖拽小盒子,並且滑鼠一直處於小盒子的最中間。這樣便完成了簡單的拖拽效果。

JavaScript實現拖拽效果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。