vue3 通过 Vue3DraggableResizable实现拖拽弹窗,可修改大小

先看效果

20250926_084416

以下代码是vue3的写法

1.安装依赖

javascript 复制代码
 npm install vue3-draggable-resizable --save

2.页面代码

javascript 复制代码
<script setup>
import {ref} from "vue";
import Vue3DraggableResizable from "vue3-draggable-resizable";
const x = ref(120);  // 初始X坐标(距离页面左侧的像素值)
const y = ref(20);  // 初始Y坐标(距离页面顶部的像素值)

const initW = ref(1510)
const initH = ref(770)
const originalSize = ref({ width: 1510, height: 770 })
const isAmplified = ref(false)
const originalPosition = ref({ x: 50, y: 50 })
const currentWidth = ref(1510); // 当前宽度
const currentHeight = ref(770); // 当前高度+
const audit = ref(true)
const amplification = ()=>{
  if (!isAmplified.value) {
    // 第一次点击 - 放大到左上角(0,0)
    // 保存当前位置和尺寸,用于恢复
    originalPosition.value = {
      x: x.value,
      y: y.value
    };
    originalSize.value = {
      width: currentWidth.value,
      height: currentHeight.value
    };

    // 放大到左上角,宽度设为窗口的95%(可根据需要调整比例)
    x.value = 0;
    y.value = 0;
    currentWidth.value = Math.floor(window.innerWidth * 0.97);
    currentHeight.value = Math.floor(window.innerHeight * 0.9);
  } else {
    // 第二次点击 - 恢复到之前的大小和位置
    x.value = originalPosition.value.x;
    y.value = originalPosition.value.y;
    currentWidth.value = originalSize.value.width;
    currentHeight.value = originalSize.value.height;
  }

  // 切换状态标记
  isAmplified.value = !isAmplified.value;
}

const auditFun = () =>{
  audit.value = false
}

const print = (val) =>{
  console.log(val)
}
</script>

<template>
  <Vue3DraggableResizable
      :initW="initW"
      :initH="initH"
      v-model:x="x"
      v-model:y="y"
      v-if="audit"
      class="Vue3DraggableResizable"
      :draggable="true"
      v-model:w="currentWidth"
      v-model:h="currentHeight"
      :resizable="true"
      @activated="print('activated')"
      @deactivated="print('deactivated')"
      @drag-start="print('drag-start')"
      @resize-start="print('resize-start')"
      @dragging="print('dragging')"
      @resizing="print('resizing')"
      @drag-end="print('drag-end')"
      @resize-end="print('resize-end')"
  >
    <div style="display: flex;justify-content: flex-end;align-items: center">
      <svg @click.stop="amplification" t="1758784881397" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10496" width="25" height="25"><path d="M768 170.666667H256c-46.933333 0-85.333333 38.4-85.333333 85.333333v512c0 46.933333 38.4 85.333333 85.333333 85.333333h512c46.933333 0 85.333333-38.4 85.333333-85.333333V256c0-46.933333-38.4-85.333333-85.333333-85.333333zM256 768V256h512v512H256z" fill="#515151" p-id="10497"></path></svg>
      <svg @click.stop = 'auditFun' style="margin: 20px;cursor: pointer" t="1758772119424" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9473" width="20" height="20"><path d="M555.4 512l304.6-304.6c4.8-4.8 4.8-12.6 0-17.4l-26-26c-4.8-4.8-12.6-4.8-17.4 0L512 468.6 207.4 164c-4.8-4.8-12.6-4.8-17.4 0l-26 26c-4.8 4.8-4.8 12.6 0 17.4L468.6 512 164 816.6c-4.8 4.8-4.8 12.6 0 17.4l26 26c4.8 4.8 12.6 4.8 17.4 0L512 555.4l304.6 304.6c4.8 4.8 12.6 4.8 17.4 0l26-26c4.8-4.8 4.8-12.6 0-17.4L555.4 512z" fill="#272636" p-id="9474"></path></svg>
    </div>
    <div style="padding: 0 20px 20px;
        height: calc(100% - 60px);
        overflow: auto;
        box-sizing: border-box;">
      内容
    </div>
  </Vue3DraggableResizable>

</template>

<style  lang="scss">
.Vue3DraggableResizable{
  border-radius: 10px;
  position: absolute;
  z-index: 9999;
  top:0;
  background: #FFFFFF;
}
.Vue3DraggableResizableBox{
  width: 100%;
  height: 100%;
  position: absolute;

  z-index: 999;
  background: rgba(107, 107, 107, 0.33) !important;
}
.vdr-handle-ml,.vdr-handle-mr{
  height: 95%;
  opacity: 0;
  top: 3% !important;
}
.vdr-handle-tl,.vdr-handle-bl,.vdr-handle-tr,.vdr-handle-br{
  width: 20px;
  opacity: 0;
  height: 20px;
}
.vdr-container.active{
  border-color:transparent;
}
.vdr-handle-tm,.vdr-handle-bm{
  left: 1.1%;
  width: 98%;
  opacity: 0;
}

.Vue3DraggableResizable:hover .handle {
  background-color: rgba(0, 120, 255, 0.3);
}
</style>
相关推荐
智算菩萨1 小时前
基于spaCy的英文自然语言处理系统:低频词提取与高级文本分析
前端·javascript·easyui
老华带你飞1 小时前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
刘一说2 小时前
Vue单页应用(SPA)开发全解析:从原理到最佳实践
前端·javascript·vue.js
疯狂成瘾者2 小时前
前端vue核心知识点
前端·javascript·vue.js
Laravel技术社区3 小时前
用PHP8实现斗地主游戏,实现三带一,三带二,四带二,顺子,王炸功能(第二集)
前端·游戏·php
m0_738120724 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php
hh随便起个名10 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
我是小路路呀10 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
程序员爱钓鱼10 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder11 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化