JS拖動元素詳解

一、JS拖動元素放大

通過JS可以實現拖動元素時的放大效果,可以讓用戶更清楚地看到元素的細節。實現方法如下:

// HTML代碼
<div id="box" style="width: 100px; height: 100px; background-color: red;"></div>

// JS代碼
var box = document.getElementById('box');
box.addEventListener('mousedown', function(e){
  e.target.style.transform = 'scale(1.2)';
});
box.addEventListener('mouseup', function(e){
  e.target.style.transform = 'scale(1)';
});

二、JS拖動元素不流暢

有時在使用JS實現拖動元素時,用戶會感覺到元素拖動過程中不夠流暢,這是因為JS事件處理過程中沒有減少重繪和迴流,可以通過以下方法解決:

// HTML代碼
<div id="box" style="width: 100px; height: 100px; background-color: red;"></div>

// JS代碼
var box = document.getElementById('box');
var dragging = false;
var originX, originY, deltaX, deltaY;

box.addEventListener('mousedown', function(e) {
  dragging = true;
  originX = e.clientX;
  originY = e.clientY;
});

document.addEventListener('mousemove', function(e) {
  if (!dragging) return;

  deltaX = e.clientX - originX;
  deltaY = e.clientY - originY;

  box.style.transform = 'translate(' + deltaX + 'px, ' + deltaY + 'px)';
});

document.addEventListener('mouseup', function() {
  dragging = false;
  box.style.transform = 'unset';
});

三、JS拖動元素在盒子內

有時候我們需要限定元素只能在一個特定的區域內拖動,如下所示:

// HTML代碼
<div id="box" style="position: relative; width: 100px; height: 100px; border: 1px solid black;">
  <div id="inner-box" style="position: absolute; top: 0; left: 0; width: 50px; height: 50px; background-color: red;"></div>
</div>

// JS代碼
var innerBox = document.getElementById('inner-box');
var dragging = false;
var originX, originY, deltaX, deltaY;
var box = document.getElementById('box');
var boxOffset = box.getBoundingClientRect();

document.addEventListener('mousedown', function(e) {
  if (e.target !== innerBox) return;

  dragging = true;
  originX = e.clientX;
  originY = e.clientY;
});

document.addEventListener('mousemove', function(e) {
  if (!dragging) return;

  deltaX = e.clientX - originX;
  deltaY = e.clientY - originY;

  var newX = Math.min(Math.max(boxOffset.left, innerBox.offsetLeft + deltaX), boxOffset.right - innerBox.offsetWidth);
  var newY = Math.min(Math.max(boxOffset.top, innerBox.offsetTop + deltaY), boxOffset.bottom - innerBox.offsetHeight);

  innerBox.style.transform = 'translate(' + newX + 'px, ' + newY + 'px)';
});

document.addEventListener('mouseup', function() {
  dragging = false;
});

四、JS拖動原理

JS實現拖動的原理是通過監聽鼠標事件,獲取鼠標在頁面中的位置,然後將元素的位置根據鼠標的位置進行偏移,從而實現元素的拖動。

五、JS動態添加元素

有時候我們需要動態地添加元素並實現拖動效果。可以通過以下方法實現:

// HTML代碼
<div id="container" style="width: 100px; height: 100px; border: 1px solid black;"></div>

// JS代碼
var container = document.getElementById('container');

function createBox() {
  var box = document.createElement('div');
  box.style.width = '50px';
  box.style.height = '50px';
  box.style.background = 'red';
  box.style.position = 'absolute';
  box.addEventListener('mousedown', function(e) {
    dragging = true;
    originX = e.clientX;
    originY = e.clientY;
    e.stopPropagation();
  });
  document.addEventListener('mousemove', function(e) {
    if (!dragging) return;

    deltaX = e.clientX - originX;
    deltaY = e.clientY - originY;

    var newX = Math.min(Math.max(0, box.offsetLeft + deltaX), container.offsetWidth - box.offsetWidth);
    var newY = Math.min(Math.max(0, box.offsetTop + deltaY), container.offsetHeight - box.offsetHeight);

    box.style.transform = 'translate(' + newX + 'px, ' + newY + 'px)';
  });
  document.addEventListener('mouseup', function() {
    dragging = false;
  });
  return box;
}

container.appendChild(createBox());

六、JS鼠標點擊拖動事件

除了鼠標拖動事件外,還可以使用鼠標點擊事件來實現拖動效果,實現方法如下:

// HTML代碼
<div id="box" style="width: 100px; height: 100px; background-color: red;"></div>

// JS代碼
var box = document.getElementById('box');
var dragging = false;
var originX, originY, deltaX, deltaY;

box.addEventListener('mousedown', function(e){
  dragging = true;
  originX = e.clientX;
  originY = e.clientY;
});

box.addEventListener('mouseup', function(){
  dragging = false;
});

box.addEventListener('mousemove', function(e){
  if (!dragging) return;

  deltaX = e.clientX - originX;
  deltaY = e.clientY - originY;

  box.style.transform = 'translate(' + deltaX + 'px, ' + deltaY + 'px)';
});

box.addEventListener('click', function(e){
  e.stopPropagation();
});

七、JS拖拽元素到另一個元素選取

有時候我們需要實現將一個元素從一個區域拖拽到另一個區域,並且在另一個區域中選中該元素的效果,可以通過以下代碼實現:

// HTML代碼
<div id="source" style="width: 100px; height: 100px; background-color: red;"></div>
<div id="target" style="width: 100px; height: 100px; background-color: green;"></div>

// JS代碼
var source = document.getElementById('source');
var target = document.getElementById('target');
var selectedBox = null;
var dragging = false;
var originX, originY, deltaX, deltaY;

source.addEventListener('mousedown', function(e){
  selectedBox = e.target.cloneNode(true);
  selectedBox.style.position = 'absolute';
  selectedBox.style.opacity = '0.5';
  selectedBox.style.transform = 'scale(0.8)';
  selectedBox.style.pointerEvents = 'none';
  document.body.appendChild(selectedBox);
  dragging = true;
  originX = e.clientX;
  originY = e.clientY;
});

target.addEventListener('mousemove', function(e){
  if (!dragging) return;

  deltaX = e.clientX - originX;
  deltaY = e.clientY - originY;

  selectedBox.style.transform = 'translate(' + deltaX + 'px, ' + deltaY + 'px)';
});

target.addEventListener('mouseup', function(e){
  if (!selectedBox) return;
  selectedBox.style.transform = '';
  selectedBox.style.opacity = '1';
  selectedBox.style.pointerEvents = '';
  target.appendChild(selectedBox);
  selectedBox = null;
  dragging = false;
});

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/219564.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 10:59
下一篇 2024-12-09 10:59

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python遍歷集合中的元素

    本文將從多個方面詳細闡述Python遍歷集合中的元素方法。 一、for循環遍歷集合 Python中,使用for循環可以遍歷集合中的每個元素,代碼如下: my_set = {1, 2…

    編程 2025-04-29
  • Python列表中大於某數的元素處理方法

    本文將會介紹如何在Python列表中找到大於某數的元素,並對其進行進一步的處理。 一、查找大於某數的元素 要查找Python列表中大於某數的元素,可以使用列表推導式進行處理。 nu…

    編程 2025-04-29
  • Python Set元素用法介紹

    Set是Python編程語言中擁有一系列獨特屬性及特點的數據類型之一。它可以存儲無序且唯一的數據元素,這使得Set在數據處理中非常有用。Set能夠進行交、並、差集等操作,也可以用於…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Python編程實現列表元素逆序存放

    本文將從以下幾個方面對Python編程實現列表元素逆序存放做詳細闡述: 一、實現思路 一般來說,使用Python將列表元素逆序存放可以通過以下幾個步驟實現: 1. 定義一個列表 2…

    編程 2025-04-29
  • Python集合加入元素

    Python中的集合是一種無序且元素唯一的集合類型。集合中的元素可以是數字、字符串、甚至是其他集合類型。在本文中,我們將從多個方面來探討如何向Python集合中加入元素。 一、使用…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字符無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • Java創建一個有10萬個元素的數組

    本文將從以下方面對Java創建一個有10萬個元素的數組進行詳細闡述: 一、基本介紹 Java是一種面向對象的編程語言,其強大的數組功能可以支持創建大規模的多維數組以及各種複雜的數據…

    編程 2025-04-28
  • 如何在谷歌中定位系統彈框元素

    本文將從以下幾個方面為大家介紹如何在谷歌中準確地定位系統彈框元素。 一、利用開發者工具 在使用谷歌瀏覽器時,我們可以通過它自帶的開發者工具來定位系統彈框元素。 首先,我們可以按下F…

    編程 2025-04-28

發表回復

登錄後才能評論