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/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

发表回复

登录后才能评论