vue实现可拖拽dialog封装
一、实现modal弹窗组件
<template><divv-if="visible"class="customer-dialog"id="customer-dialog":style="dialogStyles"v-dialogDrag:[dialogDrag]><div class="dialog-container"><divclass="dialog-header"id="dialog-header":style="{'--dialog-center': `${center ? 'center' : 'left'}`}"><slot name="header" v-if="footerHide"><span class="dialog__title">{{ title }}</span></slot><button class="dialog__header-close" @click="closeDialog"><i class="el-dialog__close el-icon el-icon-close"></i></button></div><div class="dialog-body"><slot> </slot></div><divclass="dialog-footer":style="{'--dialog-center': `${center ? 'center' : 'right'}`}"v-if="footerHide"><slot name="footer"><el-button size="small" @click="closeDialog">取消</el-button></slot></div></div></div>
</template><script>
export default {name: 'CustomDialog',props: {title: {type: String,default: 'Default Title'},/*** @description 是否开启拖拽功能* @default false*/dialogDrag: {type: Boolean,default: false},width: {type: [Number, String],default: 500},maxHeight: {type: [Number, String],default: 800},/*** 未传值时候,默认* top: 30%* 传入值时候,以传入值为准*/top: {type: Number,default: 0},/*** 未传值时候,默认* left: 50%* 传入值时候,以传入值为准*/left: {type: Number,default: 0},zIndex: {type: Number,default: 9999},/*** 是否显示* @default false*/value: {type: Boolean,default: false},/*** 是否居中* @default true*/center: {type: Boolean,default: false},/*** 是否隐藏footer* @default false*/footerHide: {type: Boolean,default: false},/*** 是否隐藏header* @default false*/headerHide: {type: Boolean,default: false}},computed: {dialogStyles () {return {'--dialog-width':typeof this.width === 'number' ? `${this.width}px` : this.width,'--dialog-max-height':typeof this.maxHeight === 'number'? `${this.maxHeight}px`: this.maxHeight,'--dialog-top': this.top? typeof this.top === 'number'? `${this.top}px`: this.top: '30%','--dialog-left': this.left? typeof this.left === 'number'? `${this.left}px`: this.left: '50%','--dialog-z-index': this.zIndex};},visible: {get () {return this.value;},set (val) {this.$emit('input', val);}}},methods: {closeDialog () {this.visible = false;}}
};
</script><style scoped lang="scss">
.customer-dialog {width: var(--dialog-width);max-width: calc(100vw - 32px);max-height: var(--dialog-max-height);color: rgba(0, 0, 0, 0.88);line-height: 1.5714285714285714;list-style: none;margin: 0 auto;position: fixed;top: var(--dialog-top);left: var(--dialog-left);transform: translate(-50%, -50%);overflow: auto;margin: 0;box-sizing: border-box;background-color: #ffffff;background-clip: padding-box;border: 0;border-radius: 8px;box-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08),0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05);pointer-events: auto;z-index: var(--dialog-z-index);// overflow-y: auto;
}.dialog-container {width: 100%;background: white;border-radius: 5px;display: flex;flex-direction: column;justify-content: space-between;.dialog-header {width: 100%;background: rgba(0, 0, 0, 0.5);background-color: rgba(230, 233, 240, 0.15);border-bottom: 1px #e6e9f0 solid;padding: 10px 0;.dialog__title {font-weight: bold;display: block;font-size: 1rem;font-weight: bold;height: 32px;line-height: 32px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;margin-left: 15px;}.dialog__header-close {position: absolute;top: 10px;right: 10px;padding: 5px;background: transparent;border: none;outline: none;cursor: pointer;font-size: 16px;&:hover {font-size: 16px;font-weight: bold;color: rgba(0, 0, 0, 0.88);background-color: rgba(0, 0, 0, 0.06);transition: all 0.3s;}}}.dialog-body {box-sizing: border-box;font-size: 14px;line-height: 1.5714285714285714;word-wrap: break-word;flex: 1;overflow: auto;padding: 0 20px;position: relative;}
}.dialog-header,
.dialog-body,
.dialog-footer {text-align: var(--dialog-center);margin-bottom: 10px;
}
.dialog-footer {display: flex;justify-content: var(--dialog-center);align-items: center;padding: 0 10px;
}
.footer-title {margin-right: 10px;
}
</style>
二、实现拖动自定义指令
/** @Description:拖拽指令* @Author: rjl* @Date: 2024-07-10 18:03:37* @LastEditTime: 2024-07-16 20:34:54* @LastEditors: Ran junlin*/
/*** 可拖动弹窗* @description 使用 v-dialogDrag 调用指令;*/import { nextTick } from 'vue';
export default {bind (el, binding) {nextTick(() => {const { arg } = binding;console.log(arg,'arg');if (!arg) return;const dialogHeaderEl = document.querySelector('.dialog-header');const dragDom = document.querySelector('.customer-dialog');if (!dialogHeaderEl || !dragDom) {return console.log('dom不存在');}dialogHeaderEl.style.cursor = 'move';// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);const sty =dragDom.currentStyle || window.getComputedStyle(dragDom, null);dialogHeaderEl.onmousedown = e => {// 鼠标按下,计算当前元素距离可视区的距离const disX = e.clientX - dialogHeaderEl.offsetLeft;const disY = e.clientY - dialogHeaderEl.offsetTop;// 获取到的值带px 正则匹配替换let styL, styT;// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为pxif (sty.left.includes('%')) {styL =+document.body.clientWidth *(+sty.left.replace(/\%/g, '') / 100);styT =+document.body.clientHeight *(+sty.top.replace(/\%/g, '') / 100);} else {styL = +sty.left.replace(/\px/g, '');styT = +sty.top.replace(/\px/g, '');}document.onmousemove = function (e) {// 通过事件委托,计算移动的距离const l = e.clientX - disX;const t = e.clientY - disY;// 移动当前元素dragDom.style.left = `${l + styL}px`;dragDom.style.top = `${t + styT}px`;//将此时的位置传出去//binding.value({x:e.pageX,y:e.pageY})};document.onmouseup = function (e) {document.onmousemove = null;document.onmouseup = null;};};});}
};
三、使用
<ModaldialogDragv-model="dialogVisible"width="550px":left="790":top="240"title="区域查车"
><div class="body"><RTableref="table"v-loading="pending"border:tableData="tableData"row-key="id"size="small"stripewidth="100%"height="100%":column="columns"/></div>
</Modal>
相关文章:
vue实现可拖拽dialog封装
一、实现modal弹窗组件 <template><divv-if"visible"class"customer-dialog"id"customer-dialog":style"dialogStyles"v-dialogDrag:[dialogDrag]><div class"dialog-container"><divclass"dial…...
本地多模态看图说话-llava
其中图片为bast64转码,方便json序列化。 其中模型llava为本地ollama运行的模型,如:ollama run llava 还有其它的模型如:llava-phi3,通过phi3微调过的版本。 实际测试下来,发现本地多模型的性能不佳&…...
人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域,模型的训练目标是找到一组参数,使得模型能够从训练数据中学习到有用的模式&am…...
Java异常抛出与处理方法
在Java编程中,异常处理是一个非常重要的部分。通过正确的异常处理,我们可以提高程序的健壮性和可靠性,避免程序在运行过程中出现意外的崩溃。本文将详细讲述Java异常的抛出与处理方法,并通过示例代码进行说明。 一、Java异常的分类 Java中的异常体系结构可以分为三类: 检…...
兼容性测试主要有什么类型?
兼容性测试的类型 有两种类型的兼容性测试。这是一个快速细分。 1、前向兼容性测试 向前兼容性测试或向上兼容性测试可确保当前软件版本在相关组件(例如操作系统、浏览器和第三方库)的未来版本中保持功能。此类测试对于在系统升级期间保持稳定性和用户体验至关重要。 例如&…...
设计模式--组合模式
组合模式(Composite Pattern)详解 组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 适用场景 需要表示对象的部分-整体层次结构时&am…...
ArduPilot开源代码之AP_DAL_RangeFinder
ArduPilot开源代码之AP_DAL_RangeFinder 1. 源由2. 框架设计2.1 枚举 Status2.2 公有方法2.3 私有成员变量 3. 重要例程3.1 应用函数3.1.1 ground_clearance_cm_orient3.1.2 max_distance_cm_orient3.1.3 has_orientation3.1.4 get_backend 3.2 其他函数3.2.1 AP_DAL_RangeFind…...
SpringCloud教程 | 第九篇: 使用API Gateway
1、参考资料 SpringCloud基础篇-10-服务网关-Gateway_springcloud gateway-CSDN博客 2、先学习路由,参考了5.1 2.1、建了一个cloudGatewayDemo,这是用来配置网关的工程,配置如下: http://localhost:18080/aaa/name 该接口代码如…...
数据结构——hash(hashmap源码探究)
hash是什么? hash也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。 举例来说明一下什么是hash: 假设我们要把1~12存入到一个大小是5的hash表中,我们…...
国产麒麟、UOS在线打开pdf加盖印章
PageOffice支持两种电子印章方案,可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章(全方位保护、防篡改、防伪造)。Word和Excel的盖章功能请参考:Word和Excel加盖印章和签字功能 (目前只支持win…...
破解反爬虫策略 /_guard/auto.js(二)实战
这次我们用上篇文章讲到的方法来真正破解一下反爬虫策略,这两个案例是两个不同的网站,一个用的是 /_guard/auto.js,另一个用的是/_guard/delay_jump.js。经过解析发现这两个网站用的反爬虫策略基本是一模一样,只不过在js混淆和生成…...
同样是人工智能 客户在哪儿AI和GPT等大模型有什么不同
书接上回。为了统一回答朋友们的疑惑,此前的两篇文章,着重讲述了客户在哪儿AI的企业全历史行为数据和企业信息查询平台上的数据的区别,以及客户在哪儿AI的ToB获客服务和AI外呼机器人的获客服务的不同。本期接着讲——客户在哪儿AI VS 大模型&…...
AES Android IOS H5 加密方案
前景: 1、本项目原有功能RSA客户端对敏感信息进行加密 2、本次漏洞说是服务端返回值有敏感信息,需要密文返回 3、最初只跟H5联调成功,后续APP联调失败(H5和APP的需求排期不一致),没关注到通用性 方案: 本次方案不…...
一文了解变阻器和电位器的定义、原理、应用及其对比
变阻器的定义 两端可变电阻器(称为变阻器)利用电阻来调节电流。电阻丝环绕在陶瓷或瓷器等绝缘芯上。当刮水器沿着电阻丝移动时,电路的有效电阻会发生变化。因此,它提供了精确的电流控制。调光器、电机速度控制器和加热元件使用变…...
WPF实现一个带旋转动画的菜单栏
WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目,如下所示 2、创建文件夹及文件 创建资源文件夹&…...
使用Dockerfile构建镜像
目录 1.使用Dockerfile构建tomcat镜像 1.1 通过ARG传参构建不同版本的tomcat 2.缩小镜像的体积大小 2.1 使用较小体积的基础镜像 2.2 多级构建减少体积 1.使用Dockerfile构建tomcat镜像 cd /opt mkdir tomcat cd tomcat/ 上传tomcat所需的依赖包 使用tar xf 解压三个压缩…...
概率论原理精解【3】
文章目录 向量值向量值函数导数对称矩阵定义性质例子应用 向量值理论基础定义性质应用示例 向量值函数的导数定义性质应用 向量值 向量值函数导数 D n ⊂ R n , 向量值函数 f : D n → R m D^n \subset R^n,向量值函数f:D^n\rightarrow R^m Dn⊂Rn,向量值函数f:Dn→Rm 1. 向量…...
[C/C++入门][循环]14、计算2的幂(2的n次方)
计算2的幂(即2的n次方)非常经典。你懂几种方法呢?很多人只会一种,我们来分析一下。 可以通过多种方式实现: 1、最简单的方法之一是使用位运算符<<,它本质上是在二进制表示下对2进行左移操作&#x…...
RPC与服务的注册发现
文章目录 1. 什么是远程过程调用(RPC)?2. RPC的流程3. RPC实践4. RPC与REST的区别4.1 RPC与REST的相似之处4.2 RPC与REST的架构原则4.3 RPC与REST的主要区别 5. RPC与服务发现5.1 以zookeeper为服务注册中心5.2 以etcd为服务注册中心 6. 小结参考 1. 什么是远程过程调用(RPC)?…...
3112. 访问消失节点的最少时间 Medium
给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点࿰…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
