vue3 对元素拖拽、缩放

插件一:

1、安装:npm i vue3-draggable-resizable

2、在main.js中引入:

import Vue3DraggableResizable from 'vue3-draggable-resizable'
import 'vue3-draggable-resizable/dist/Vue3DraggableResizable.css'
...
app.use(Vue3DraggableResizable);

3、基本用法:(这里举的例子是上传一张图片后,拿到图片的宽高,再给插件的宽高赋值)

<template>
  <Vue3DraggableResizable
    :lock-aspect-ratio="true"
    :handles="['tl', 'tr', 'br', 'bl']"
    :min-width="100"
    :min-height="100"
    :x="insertImgLeft"
    :y="insertImgTop"
    :w="insertImgWidth"
    :h="insertImgHeight"
    @drag-end="insertDragStop"
    @resize-end="insertResizeStop"
    class="drag_box"
  >
    <img style="cursor: pointer" :src="insertImg" @load="onImageLoad" />
  </Vue3DraggableResizable>
</template>
<script setup>
import { ref, onMounted } from "vue";

let insertImg = ref(
  "https://s3.cn-northwest-1.amazonaws.com.cn/yinlulu-glint/upload/c14624c8-9020-4c37-803b-36ec7e4ace5e.jpg"
); //插图
let insertImgHeight = ref(0); //插图高度
let insertImgWidth = ref(0); //插图宽度
let insertImgLeft = ref(0); //插图坐标
let insertImgTop = ref(105); //插图坐标

// 插图停止拖动
function insertDragStop(e) {
  console.log(e);
}
// 插图停止缩放
function insertResizeStop(e) {
  console.log(e);
}
// 通过固定插图高度为130,计算插图宽度,防止图片过大,超出屏幕
function getImg(src) {
  var img = new Image();
  img.src = src;
  img.onload = () => {
    insertImgHeight.value = 130;
    insertImgWidth.value = Math.floor((img.width * 130) / img.height);
  };
}
// 图片加载完成事件处理逻辑
function onImageLoad() {
  getImg(insertImg.value);
}
</script>

具体用法参考:https://www.npmjs.com/package/vue3-draggable-resizable/v/1.4.0

插件二:

1、安装:npm i @gausszhou/vue3-drag-resize-rotate

2、在main.js中引入:

import VueDragResizeRotate from "@gausszhou/vue3-drag-resize-rotate";
import "@gausszhou/vue3-drag-resize-rotate/lib/bundle.esm.css";
...
app.use(VueDragResizeRotate);

3、基本用法:

  <div class="view-box">
    <div id="toolbar">基本组件</div>
    <div class="container">
      <VueDragResizeRotate :x="0" :y="0" :w="200" :h="200">
        <p>你可以拖着我,按照自己的意愿调整大小。1</p>
      </VueDragResizeRotate>
      <VueDragResizeRotate :x="200" :y="200" :w="200" :h="200">
        <p>你可以拖着我,按照自己的意愿调整大小。2</p>
      </VueDragResizeRotate>
    </div>
  </div>

具体用法参考:https://gausszhou.github.io/vue3-drag-resize-rotate/#/basic/basic-basic-component

4、示意图:
在这里插入图片描述
注意:如果想在vue2中使用,可以参考 https://github.com/gausszhou/vue-drag-resize-rotate

### 实现 Vue3 中手指拖动和缩放功能 为了在 Vue3 项目中实现元素的手指拖动和缩放功能,可以采用 `vuedraggable` 和 `vue3-draggable-resizable` 插件来简化开发过程。这些工具提供了丰富的 API 来处理复杂的交互逻辑。 #### 安装依赖包 首先,在项目根目录下执行命令安装所需的库: ```bash npm install --save vuedraggable vue3-draggable-resizable ``` #### 创建可拖拽并能响应触摸事件的组件 下面是一个简单的例子展示如何创建一个支持触控操作(如拖动、缩放)的图片容器[^2]。 ```html <template> <div class="container"> <!-- 使用 draggable 组件包裹需要移动的内容 --> <draggable :list="elements" @start="drag=true" @end="drag=false"> <transition-group> <vue-draggable-resizable v-for="(element, index) in elements" :key="index" :w="element.width" :h="element.height" :x="element.x" :y="element.y" :parent="true" @resizing="onResizing(element, ...arguments)" @dragging="onDragging(element, ...arguments)"> <img src="/path/to/image.jpg" alt="" /> </vue-draggable-resizable> </transition-group> </draggable> </div> </template> <script setup lang="ts"> import { ref } from &#39;vue&#39;; import draggable from &#39;vuedraggable&#39;; import VueDraggableResizable from &#39;vue3-draggable-resizable&#39;; // 初始化数据结构 const elements = ref([ { width: 200, height: 150, x: 0, y: 0, }, ]); function onResizing(item:any, newX:number, newY:number, newWidth:number, newHeight:number){ item.x = newX; item.y = newY; item.width = newWidth; item.height = newHeight; } function onDragging(item:any, newX:number, newY:number){ item.x = newX; item.y = newY; } </script> <style scoped> .container{ position:relative; /* 确保子元素能够相对于此定位 */ overflow:hidden; } </style> ``` 上述代码片段展示了如何利用这两个插件组合起来完成基本的功能需求。需要注意的是,对于移动端的支持可能还需要额外配置 CSS 或者 JavaScript 处理手势识别等问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值