【html弹框拖拽和div拖拽功能】原生html页面引入vue语法后通过自定义指令简单实现div和弹框拖拽功能

news2024/12/23 9:48:21

前言

这是html版本的。只是引用了vue的语法。
这是很多公司会出现的一种情况,就是原生的页面,引入vue的语法开发
这就导致有些vue上很简单的功能。放到这里需要转换一下
以前写过一个vue版本的帖子,现在再加一个html版本的。

另一个vue版本

需要看vue版本的,直接点击这里我另一个帖子看
跳转链接

效果图

这是弹框的可以拖动,并且不会超出页面,到了边缘就会停止拖不出去了。
在这里插入图片描述
这里一样的,div按住拖拽,这种是可以超出页面范围的
在这里插入图片描述

div拖拽代码

核心就是下面的自定义指令生成。
然后再div上面添加v-drag就可以使用了,很简单


<!DOCTYPE html>
<html>

<head>
    <meta charset='UTF-8'>
    <!-- 公共css文件 -->
    <link rel="stylesheet" href="/statics/css/common/common.css">
    <!-- 公共js -->
    <script src="/statics/vue_element/common.js"></script>
    <!-- vue部分依赖 -->
    <link rel="stylesheet" href="/statics/vue_element/element.css">
    <script src="/statics/vue_element/vue.js"></script>
    <script src="/statics/vue_element/element.js"></script>
    <script src="/statics/vue_element/axios.js"></script>
    <!-- 引入vue类型组件 -->
    <title>div拖拽模板</title>
</head>

<body>
    <div id="app">
        <div class="wrap">
            <div v-drag class="box">按住拖拽</div>
        </div>
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        directives: {
            // 自定义指令 实现可拖动
            drag(el, bindings) {
                el.onmousedown = function (e) {
                    var disx = e.pageX - el.offsetLeft;
                    var disy = e.pageY - el.offsetTop;
                    document.onmousemove = function (e) {
                        el.style.left = e.pageX - disx + "px";
                        el.style.top = e.pageY - disy + "px";
                    };
                    document.onmouseup = function () {
                        document.onmousemove = document.onmouseup = null;
                    };
                };
            },
        },
        data() {
            return {};
        },
        methods: {}
    })
</script>
<style scoped>
    .box {
        height: 100px;
        width: 100px;
        background-color: #ccc;
        position: absolute;
        top: 200px;
        left: 100px;
        cursor: pointer;
        font-size: 20px;
    }

    .wrap {
        position: relative;
    }
</style>

</html>

弹框拖拽代码

这里也是一样的,我这里使用elementul的弹框组件
直接就是鼠标放到弹框的头部就会变成可移动的箭头。按住拖动。
功能实现也是自定义指令,然后再弹框上放一个v-drag就可以了。
注意是加载el-dialog标签上的。别加错了

<!DOCTYPE html>
<html>

<head>
    <meta charset='UTF-8'>
    <!-- 公共css文件 -->
    <link rel="stylesheet" href="/statics/css/common/common.css">
    <!-- 公共js -->
    <script src="/statics/vue_element/common.js"></script>
    <!-- vue部分依赖 -->
    <link rel="stylesheet" href="/statics/vue_element/element.css">
    <script src="/statics/vue_element/vue.js"></script>
    <script src="/statics/vue_element/element.js"></script>
    <script src="/statics/vue_element/axios.js"></script>
    <!-- 引入vue类型组件 -->
    <title>div拖拽模板</title>
</head>

<body>
    <div id="app">
        <el-button type="text" @click="dialogTableVisible = true">打开嵌套表格的 Dialog</el-button>

        <el-dialog title="收货地址" :visible.sync="dialogTableVisible" v-drag>
            <el-table :data="gridData">
                <el-table-column property="date" label="日期" width="150"></el-table-column>
                <el-table-column property="name" label="姓名" width="200"></el-table-column>
                <el-table-column property="address" label="地址"></el-table-column>
            </el-table>
        </el-dialog>
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data() {
            return {
                gridData: [{
                    date: '2016-05-02',
                    name: '王小虎',
                    address: '上海市普陀区金沙江路 1518 弄'
                }, {
                    date: '2016-05-04',
                    name: '王小虎',
                    address: '上海市普陀区金沙江路 1518 弄'
                }, {
                    date: '2016-05-01',
                    name: '王小虎',
                    address: '上海市普陀区金沙江路 1518 弄'
                }, {
                    date: '2016-05-03',
                    name: '王小虎',
                    address: '上海市普陀区金沙江路 1518 弄'
                }],
                dialogTableVisible: false,
                formLabelWidth: '120px',
            };
        },
        directives: {
            // 自定义指令 实现可拖动
            drag(el, bindings) {
                const dialogHeaderEl = el.querySelector('.el-dialog__header')
                const dragDom = el.querySelector('.el-dialog')
                // dialogHeaderEl.style.cursor = 'move';
                dialogHeaderEl.style.cssText += ';cursor:move;'
                dragDom.style.cssText += ';top:0px;'

                // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
                const sty = (function () {
                    if (window.document.currentStyle) {
                        return (dom, attr) => dom.currentStyle[attr]
                    } else {
                        return (dom, attr) => getComputedStyle(dom, false)[attr]
                    }
                })()

                dialogHeaderEl.onmousedown = (e) => {
                    // 鼠标按下,计算当前元素距离可视区的距离
                    const disX = e.clientX - dialogHeaderEl.offsetLeft
                    const disY = e.clientY - dialogHeaderEl.offsetTop

                    const screenWidth = document.body.clientWidth // body当前宽度
                    const screenHeight = document.documentElement
                        .clientHeight // 可见区域高度(应为body高度,可某些环境下无法获取)

                    const dragDomWidth = dragDom.offsetWidth // 对话框宽度
                    const dragDomheight = dragDom.offsetHeight // 对话框高度

                    const minDragDomLeft = dragDom.offsetLeft
                    const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth

                    const minDragDomTop = dragDom.offsetTop
                    const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight

                    // 获取到的值带px 正则匹配替换
                    let styL = sty(dragDom, 'left')
                    let styT = sty(dragDom, 'top')

                    // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
                    if (styL.includes('%')) {
                        styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
                        styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
                    } else {
                        styL = +styL.replace(/\px/g, '')
                        styT = +styT.replace(/\px/g, '')
                    }

                    document.onmousemove = function (e) {
                        // 通过事件委托,计算移动的距离
                        let left = e.clientX - disX
                        let top = e.clientY - disY

                        // 边界处理
                        if (-(left) > minDragDomLeft) {
                            left = -(minDragDomLeft)
                        } else if (left > maxDragDomLeft) {
                            left = maxDragDomLeft
                        }

                        if (-(top) > minDragDomTop) {
                            top = -(minDragDomTop)
                        } else if (top > maxDragDomTop) {
                            top = maxDragDomTop
                        }

                        // 移动当前元素
                        dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
                    }

                    document.onmouseup = function (e) {
                        document.onmousemove = null
                        document.onmouseup = null
                    }
                }
            },
        },
    })
</script>
<style scoped>

</style>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS8基础篇5:用户账号与用户组的创建

一、用户与用户组概念 Linux是一个多用户、多任务的服务器操作系统&#xff0c;多用户多任务指可以在系统上建立多个用户&#xff0c;而多个用户可以在同一时间内登录同一个系统执行各自不同的任务&#xff0c;而互不影响。 Linux用户是根据角色定义的&#xff0c;具体分为三…

JVM - 内存分配

目录 JVM的简化架构和运行时数据区 JVM的简化架构 运行时数据区 PC寄存器 Java栈 Java堆 方法区 运行时常量池 本地方法栈 栈、堆、方法区交互关系 Java堆内存模型和分配 Java堆内存概述 Java堆的结构 对象的内存布局 对象的访问定位 Trace跟踪和Java堆的参数配…

【漏洞真实影响分析】Apache Kafka Connect 模块JNDI注入(CVE-2023-25194)

系列简介&#xff1a; 漏洞真实影响分析是墨菲安全实验室针对热点漏洞的分析系列文章&#xff0c;帮助企业开发者和安全从业者理清漏洞影响面、梳理真实影响场景&#xff0c;提升安全应急响应和漏洞治理工作效率。 漏洞概述 Apache Kafka Connect服务在2.3.0 至 3.3.2 版本中&…

sql server安装并SSMS连接

博主简介&#xff1a;原互联网大厂tencent员工&#xff0c;网安巨头Venustech员工&#xff0c;阿里云开发社区专家博主&#xff0c;微信公众号java基础笔记优质创作者&#xff0c;csdn优质创作博主&#xff0c;创业者&#xff0c;知识共享者,欢迎关注&#xff0c;点赞&#xff…

vue3使用vis绘制甘特图制作timeline可拖动时间轴,时间轴中文化

本文写作顺序&#xff1a;效果展示——子组件封装——父组件传值 仅js的原始图&#xff08;回归初始化&#xff09;、撤销&#xff08;上一步&#xff09;功能实现&#xff0c;样式需要自己调整 目录前言&#xff1a;参考文档文章一、实现效果&#xff1a;二、安装插件及依赖&a…

0代码实现接口自动化测试 —— RF框架实践

robotframework是一款关键字自动化测试框架&#xff0c;可能做各种类型的自动化测试。本文介绍通过 robotframework 来实现接口测试。 01、安装接口请求的第三方库 pip install robotframework-requests 在python安装目录的Lib\site-packages可以看到 02、接口关键字基础 ro…

【操作系统】操作系统IO技术底层机制和ZeroCopy

1.DMA技术详解 &#xff08;1&#xff09;应用程序 从 磁盘读写数据 的时序图&#xff08;未用DMA技术前&#xff09; &#xff08;2&#xff09;什么是DMA 技术 (Direct Memory Access&#xff09; 直接内存访问&#xff0c;直接内存访问是计算机科学中的一种内存访问技术。…

设计模式之美总结(开源实战篇)

title: 设计模式之美总结&#xff08;开源实战篇&#xff09; date: 2023-01-10 17:13:05 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. Java JDK 应用到的设计模式1.1 工厂模式在 Calendar 类中的应用1.2 建造者模式在 Calendar …

Pyton接口自动化相关【易报错问题及解决方法】

Pyton接口自动化相关【易报错问题及解决方法】 目录&#xff1a;导读 Python怎么链接数据库 python 链接数据库时报错 TypeError: %d format: a number is required, not str 是因为端口号写成字符串格式的了 python exists判断文件是否存在 pycharm下查看日志文件中文乱码…

【数据挖掘实战】——电力窃漏电用户自动识别

【数据挖掘实战】——电力窃漏电用户自动识别一、背景和挖掘目标二、分析方法与过程1、初步分析2、数据抽取3、探索分析4、数据预处理5、构建专家样本三、构建模型1、构建窃漏电用户识别模型2、模型评价3、进行窃漏电诊断拓展思考项目代码地址&#xff1a;https://gitee.com/li…

LaoCat带你认识容器与镜像(实践篇二下)

实践篇主要以各容器的挂载和附加命令为主。 本章内容 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 Docker > 20.10.22 接上章内容&#xff0c;接下来该章围绕Docker安装并运行之RabbitMQ、ElasticSearch&#xff0c;大部分命令来源于DockerHub官网&#xf…

Apache日志分析器

您的Apache HTTP服务器生成的日志数据是信息的宝库。使用这些信息&#xff0c;您可以判断您服务器的使用情况、找出漏洞所在&#xff0c;并设法改进服务器结构和整体性能。审核您的Apache日志可在以下情况派上用场&#xff0c;其中包括&#xff1a;识别和纠正频繁出现的错误以增…

github相关

1.本地项目上传到远程github 1.1github上创建项目 1)github上创建项目 2)复制地址 1.2上传自己的项目 1)本地项目目录下执行 git init “git init”命令用于创建git仓库&#xff0c;其可以在一个已有的非git项目的根目录下执行&#xff0c;把已有项目初始化成为git仓库&…

微服务实战--高级篇:多级缓存:Nginx本地缓存、Redis、Tomcat、JVM缓存、数据库

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时…

模型部署综述

https://github.com/leeguandong/KuaiZaihttps://github.com/leeguandong/KuaiZaiAI 框架部署方案之模型部署概述 - 知乎文小P 家的 1011010 概述模型训练重点关注的是如何通过训练策略来得到一个性能更好的模型&#xff0c;其过程似乎包含着各种“玄学”&#xff0c;被戏称为“…

全局异常处理--Java实战项目篇

系列文章目录 Java后端开发功能模块思路 Spring Boot自动配置–如何切换内置Web服务器 Spring Boot读取配置文件内容的三种方式 该系列文章持续更新&#xff0c;更多的文章请点击我的主页查看哦&#xff01; 文章目录系列文章目录前言一、出现的问题二、解决问题的方法1. 添加…

iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?

在升级最新的 iOS 16.3 系统后&#xff0c;有些用户可能遇到了个别应用无法正常打开&#xff0c;卡死的异常情况。大家可以尝试通过如下方式解决问题。 1.重新启动应用&#xff1a; 如果应用出现卡死或闪退&#xff0c;可从 iPhone 屏幕由底往上滑&#xff08;或连续按两次 H…

Java变量和数据类型,超详细整理,适合新手入门

目录 一、什么是变量&#xff1f; 二、变量 变量值互换 三、基本数据类型 1、八种基本数据类型 2、布尔值 3、字符串 四、从控制台输入 一、什么是变量&#xff1f; 变量是一种存储值的容器&#xff0c;它可以在程序的不同部分之间共享&#xff1b;变量可以存储数字、字…

C语言进阶——通讯录模拟实现

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日名言&#xff1a;只有走在路上&#xff0c;才能摆脱局限&#xff0c;摆脱执着&#xff0c;让所有的选择&#xff0c;探寻&#xff0c;猜测&#xff0c;想象都生机勃勃。——余秋雨《文化苦旅》 目录 一、前言 二、正…

让我百思不得其解的infer究竟是怎么推导类型的?

情景再现 有这么一个条件类型的基本语法: T extends U ? X : Y; 如果占位符类型U是一个可以被分解成几个部分的类型&#xff0c;譬如数组类型&#xff0c;元组类型&#xff0c;函数类型&#xff0c;字符串字面量类型等。这时候就可以通过infer来获取U类型中某个部分的类型。 …