当前位置:首页 > JavaScript

js实现拖拽缩放

2026-02-03 03:05:32JavaScript

实现拖拽缩放的基本思路

拖拽缩放功能通常需要监听鼠标事件,计算元素位置和尺寸变化。以下是实现的核心步骤:

js实现拖拽缩放

监听鼠标事件

为可拖拽缩放的元素添加mousedown事件监听器,记录初始位置和尺寸。在mousemove事件中计算位移并更新元素样式,mouseup事件结束拖拽。

js实现拖拽缩放

const element = document.getElementById('resizable');
let isDragging = false;
let startX, startY, startWidth, startHeight;

element.addEventListener('mousedown', (e) => {
  isDragging = true;
  startX = e.clientX;
  startY = e.clientY;
  startWidth = parseInt(document.defaultView.getComputedStyle(element).width, 10);
  startHeight = parseInt(document.defaultView.getComputedStyle(element).height, 10);
  e.preventDefault();
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  const width = startWidth + e.clientX - startX;
  const height = startHeight + e.clientY - startY;
  element.style.width = `${width}px`;
  element.style.height = `${height}px`;
});

document.addEventListener('mouseup', () => {
  isDragging = false;
});

添加拖拽手柄

通常在元素角落添加一个小方块作为拖拽手柄,限制只能从特定方向缩放:

const handle = document.createElement('div');
handle.style.width = '10px';
handle.style.height = '10px';
handle.style.backgroundColor = 'red';
handle.style.position = 'absolute';
handle.style.right = '0';
handle.style.bottom = '0';
handle.style.cursor = 'se-resize';
element.appendChild(handle);

handle.addEventListener('mousedown', (e) => {
  isDragging = true;
  startX = e.clientX;
  startY = e.clientY;
  startWidth = parseInt(document.defaultView.getComputedStyle(element).width, 10);
  startHeight = parseInt(document.defaultView.getComputedStyle(element).height, 10);
  e.stopPropagation();
});

限制最小尺寸

防止元素被缩放到不可见或太小:

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  let width = startWidth + e.clientX - startX;
  let height = startHeight + e.clientY - startY;
  width = Math.max(width, 50); // 最小宽度50px
  height = Math.max(height, 50); // 最小高度50px
  element.style.width = `${width}px`;
  element.style.height = `${height}px`;
});

完整示例代码

<!DOCTYPE html>
<html>
<head>
  <style>
    #resizable {
      width: 200px;
      height: 200px;
      background: lightblue;
      position: relative;
    }
    .handle {
      width: 10px;
      height: 10px;
      background: red;
      position: absolute;
      right: 0;
      bottom: 0;
      cursor: se-resize;
    }
  </style>
</head>
<body>
  <div id="resizable">
    <div class="handle"></div>
  </div>

  <script>
    const element = document.getElementById('resizable');
    const handle = element.querySelector('.handle');
    let isDragging = false;
    let startX, startY, startWidth, startHeight;

    handle.addEventListener('mousedown', (e) => {
      isDragging = true;
      startX = e.clientX;
      startY = e.clientY;
      startWidth = parseInt(document.defaultView.getComputedStyle(element).width, 10);
      startHeight = parseInt(document.defaultView.getComputedStyle(element).height, 10);
      e.stopPropagation();
      e.preventDefault();
    });

    document.addEventListener('mousemove', (e) => {
      if (!isDragging) return;
      let width = startWidth + e.clientX - startX;
      let height = startHeight + e.clientY - startY;
      width = Math.max(width, 50);
      height = Math.max(height, 50);
      element.style.width = `${width}px`;
      element.style.height = `${height}px`;
    });

    document.addEventListener('mouseup', () => {
      isDragging = false;
    });
  </script>
</body>
</html>

进阶优化方向

  1. 添加边界限制:防止元素超出父容器范围
  2. 保持宽高比:按住Shift键时保持原始比例缩放
  3. 触摸屏支持:添加touchstarttouchmovetouchend事件
  4. 性能优化:使用transform代替直接修改宽高减少重排
  5. 多方向手柄:添加顶部、左侧等不同方向的缩放手柄

以上代码实现了基本的右下角拖拽缩放功能,可根据需求进一步扩展和完善。

标签: 缩放拖拽
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

vue 中实现拖拽

vue 中实现拖拽

Vue 中实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

vue实现模块拖拽

vue实现模块拖拽

Vue 实现模块拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dro…

vue实现拖拽div

vue实现拖拽div

实现拖拽功能的基本思路 在Vue中实现拖拽功能可以通过HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明: 使用HTML5拖拽API HTML5提供了原…

vue实现拖拽放置

vue实现拖拽放置

Vue 实现拖拽放置功能 拖拽放置功能可以通过 Vue 的指令或第三方库实现。以下是两种常见的方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 dragga…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,…