vue自定义事件 div 拖拽方法缩小

news2024/12/22 16:54:11

 

  在main.js  引用

// 引入拖动js
import dragMove from "./utils/dragMove.js"

 创建 drawmove.js 

export default (app) => {
    app.directive('dragMove', (el, binding) => {

        const DragVindow = el.querySelector(binding.value.DragVindow)

        // 按下鼠标处理事件
        const DragButton = el.querySelector(binding.value.DragButton)

        // 放大缩小dom
        const dragIcon = el.querySelector(binding.value.dragIcon)



        DragButton.onmousedown = (e) => {
            // 鼠标按下,计算当前元素距离可视区的距离
            const disX = e.clientX - DragButton.offsetLeft
            const disY = e.clientY - DragButton.offsetTop
            document.onmousemove = (e) => {
                // 通过事件委托,计算移动的距离
                let left = e.clientX - disX
                let top = e.clientY - disY


                // 设置当前元素
                DragVindow.style.cssText += `;left:${left}px;top:${top}px;`
            }
            document.onmouseup = () => {
                document.onmousemove = null
                document.onmouseup = null
            }
        }

        //用let 会报错
        var disX = 0; //鼠标按下时光标的X值

        var disY = 0; //鼠标按下时光标的Y值

        var disW = 0; //拖拽前div的宽

        var disH = 0; // 拖拽前div的高
        dragIcon.onmousedown = function (ev) {
            ev.preventDefault();
            ev.stopPropagation();
            var ev = ev || window.event;

            disX = ev.clientX; // 获取鼠标按下时光标x的值

            disY = ev.clientY; // 获取鼠标按下时光标Y的值

            disW = DragButton.offsetWidth; // 获取拖拽前div的宽

            disH = DragButton.offsetHeight; // 获取拖拽前div的高
            // console.log(disW, disY, "111");
            document.onmousemove = function (ev) {
                var ev = ev || window.event;

                //拖拽时为了对宽和高 限制一下范围,定义两个变量

                var W = ev.clientX - disX + disW;

                var H = ev.clientY - disY + disH;

                if (W < 100) {
                    W = 100;
                }

                if (W > 1800) {
                    W = 1800;
                }

                if (H < 100) {
                    H = 100;
                }

                if (H > 1000) {
                    H = 1000;
                }

                DragButton.style.width = W + "px"; // 拖拽后物体的宽

                DragButton.style.height = H + "px"; // 拖拽后物体的高
            };

            document.onmouseup = function () {
                document.onmousemove = null;

                document.onmouseup = null;
            };
        };
    })
}

完整vue代码  (可能有一些其他带啊吗)

<template>
    <div
        v-dragMove="{
            DragButton: '.log',     
            DragVindow: '.log',
            dragIcon: '.dragIcon',
            custom: true,
        }"
    >
        <div class="log" v-show="isLog">
            <div class="logTitle">
                日志
                <span
                    class="close iconfont icon-yuyinguanbi"
                    @click="openLog"
                ></span>
            </div>
            <el-scrollbar class="centent">
                <div class="logli" v-for="(item, idx) in logData" :key="idx">
                    <span>{{ item.data }}</span>
                </div>
            </el-scrollbar>
            <div id="dragIcon" class="dragIcon"></div>
        </div>
    </div>
</template>


<script setup>
import { ref, watch, onMounted, computed, nextTick } from "vue";
import Socket from "../utils/socket.js";
import $http from "@/utils/http.js";
import { ElMessage } from "element-plus";
import { useStore } from "vuex";
const store = useStore();
let isLog = ref(false);
let $socket = null;
const openLog = () => {
    isLog.value = !isLog.value;
};
onMounted(() => {
    // 链接socket;
    $socket = new Socket(socketBack);
});
// 日志数据
let logData = ref([]);

// 获取日志
const getLog = () => {
    $http.get("/system/log/page").then((res) => {});
};

//socket 回调函数
const socketBack = (res) => {
    let { type, data, time } = res;
    if (type === "projIoMsg") {
        logData.value.push({ data, time });
    }
};

//监听是否有projid用于接收消息
let projectData = computed(() => store.state.project);
watch(
    projectData,
    (env) => {
        if (env.id) {
            console.log(env.id, "env.id");
            $socket.socketStart(env.id);
        }
    },
    { deep: true }
);

defineExpose({ openLog });
</script>
<style  lang="less" scoped>
.log {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 800px;
    height: 400px;
    background-image: url(../assets/imgs/dialog.png);
    background-size: 100% 100%;
    background-repeat: no-repeat;
    color: #ffffff;
    padding: 8px 20px;
    z-index: 999999;
    box-sizing: border-box;
    .logTitle {
        text-align: center;
        line-height: 36px;
        font-size: 18px;
        cursor: pointer;
        border-bottom: 1px solid #999999;
        position: relative;
        .close {
            position: absolute;
            top: -5px;
            right: 0px;
            color: #ffffff;
            font-size: 18px;
            cursor: pointer;
        }
    }
    .centent {
        color: #ffffff;
        width: 100%;
        height: calc(400px - 40px);
        padding-top: 8px;
        .logli {
            margin-bottom: 6px;
        }
    }
}
#dragIcon {
    position: absolute;
    bottom: 0;
    right: 0;
    width: 0;
    height: 0;
    /* 朝上的三角形,不设置上边框 */
    border: 10px solid;
    border-top-color: transparent;
    border-bottom-color: rgb(203, 46, 46);
    border-left-color: transparent;
    border-right-color: rgb(203, 46, 46);
    cursor: pointer;
    z-index: 10000;
}
</style>

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

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

相关文章

修改yum下载文件的位置,指定安装位置

yum update 的软件包&#xff0c;可以放在别的地方。即可。 修改/etc/yum.conf 指定安装位置 yum -c /etc/yum.conf --installroot/usr/local --releasever/ install 你需要安装的软件

六、抽象工厂模式

一、什么是抽象工厂模式 抽象工厂&#xff08;AbstractFactory&#xff09;模式的定义&#xff1a;是一种为访问类提供一个创建一组相关或相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 抽象工厂模式的主要角色如下…

共享办公室的7S管理

共享办公室的7S管理是一个全面且详细的过程&#xff0c;它涵盖了整理&#xff08;Sort&#xff09;、整顿&#xff08;Straighten&#xff09;、清扫&#xff08;Sweep&#xff09;、清洁&#xff08;Sanitize&#xff09;、素养&#xff08;Sustain&#xff09;、安全&#xf…

报错:Cannot read properties of undefined (reading ‘$message‘)

报错 一、问题二、分析三、解决 一、问题 Cannot read properties of undefined (reading ‘$message’) 二、分析 是因为在 main.js 文件中&#xff0c;此时还未有 this&#xff0c;我们可以打印一下&#xff0c;是 null 三、解决 如果想要使用 this.$message(这是一条消息…

数仓数据建模中的概念总结(数据域、主题域、总线矩阵、指标...)

概念归纳 业务分类&#xff1a;业务板块是某一大类业务的指标和维度的集合&#xff0c;如电商&#xff0c;文 娱。 数据域&#xff1a;面向业务分析&#xff0c;将业务过程或者维度进行抽象的集合&#xff0c;如交易域&#xff0c; 日志域。 将零散的需求分类&#xff0c;后续…

VSCode配置C语言环境(简单易懂,小白专用)

1.在VSCode中安装C/C插件和C/C Extension Pack插件 2.下载mingw64 mingw64官网网页链接 1、找到downloads ​​​​​​​​ 2、找到SourceForge 3、找到一个合适的版本&#xff08;我这里是下拉找到免安装版&#xff09;下载&#xff0c;其他的都试过了&#xff0c;都不行&a…

window11,C盘瘦身减肥技巧

创作灵感 本文主要说明如何给windows11的C盘进行空间优化&#xff0c;或者叫减肥瘦身&#xff0c;让其达到20G以内。绝大部分内容&#xff0c;也适用于window10和windows7&#xff0c;只是操作系统不同&#xff0c;操作方式略有不同。不关注C盘空间的读者&#xff0c;可以忽略…

rsync命令介绍与使用案例

一、rsync命令简介 Rsync命令是一个常用的用于文件传输和同步的工具&#xff0c;rsync 可以理解为 remote sync&#xff08;远程同步&#xff09;&#xff0c;为了减少网络数据发送量&#xff0c;只发送源文件和目标文件之间的差异信息&#xff0c;从而实现数据的增量的复制。它…

DP3232 国产RS-232接口收发器芯片

DP3232是一个3.3 V.供电的 EIA/TIA-232和 V.28/V.24通信接口&#xff0c;具有低功耗要求、高数据速率能力。DP3232拥有一个专有的低压差发射机输出平台&#xff0c;提供真正的 RS-232性能&#xff0c;从3.3 vV 到5.5 V 电源。该设备只需要四个小的0.1 μF 标准外部电容器从3.3 …

原生小程序 wxs 语法(详细)

WXS WXS&#xff08;WeiXin Script&#xff09;是内联在 WXML 中的脚本段。通过 WXS 可以在模版中内联少量处理脚本&#xff0c;丰富模板的数据预处理能力。另外&#xff0c; WXS 还可以用来编写简单的 WXS 事件响应函数。 从语法上看&#xff0c; WXS 类似于有少量限制的 Java…

LOIC(low orbit ion cannon)

前言 重要的话说三遍&#xff1a; 该程序仅用于学习用途&#xff0c;请勿用于非法行为上&#xff01;&#xff01;&#xff01; 该程序仅用于学习用途&#xff0c;请勿用于非法行为上&#xff01;&#xff01;&#xff01; 该程序仅用于学习用途&#xff0c;请勿用于非法行为上…

麒麟系统查看飞腾CPU的工作模式、实时频率的方法

CPU动态节能技术用于降低功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低CPU功耗,更低的功耗策略意味着CPU唤醒更慢对性能影响更大。本文这里讲解了如何使用命令查看系统下CPU的工作模式,和实时频率。 测试用系统信息: # cat /etc/os-releaseNAME=&qu…

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库&#xff0c;其中包括新的集合类型&#xff08;例如 multimap 和…

《自然》杂志最新研究成果,新冠卷土重来,仍然凶险,别不当回事儿

我同事又带口罩了&#xff0c;他说已阳。我很奇怪怎么不认为是感冒呢&#xff1f; 他低声地说&#xff0c;家里还有去年囤的试剂盒&#xff0c;我测了一个。 我还好&#xff0c;只在年初时候阳过一次。 应该说&#xff0c;我们比较庆幸&#xff0c;新冠毒株已经温和&#xff0c…

linux服务磁盘满了操作

1、使用xshell连接上服务器 2、# df -h 查看系统磁盘使用情况 3、查看使用比较多的文件&#xff0c;cd 跳转到该文件夹下&#xff0c;ls 查看文件 # du -h查看该文件夹下各个文件大小 4、查找logs文件 &#xff0c;删除logs 文件内容 使用 删除名为directory下的所有文件…

杭州华宫养老服务有限公司官网上线 | LTD养老服务行业案例分享

数字化时代&#xff0c;养老服务行业也逐渐的意识到借助互联网进行营销的重要性&#xff0c;但是&#xff0c;随着互联网渠道成本的不断攀升&#xff0c;如何获取稳定流量成为养老服务机构目前所面临的重要挑战。 于是&#xff0c;杭州华宫养老服务有限公司作为养老服务行业崛…

深圳产品展示视频拍摄一站式服务

产品展示视频拍摄一站式服务是指一家专业的拍摄制作公司或团队提供从策划、拍摄到后期制作的全方位服务&#xff0c;以满足客户的产品展示需求。这种服务通常包括以下方面&#xff0c;由产品展示视频制作公司老友记小编从以下几个方面为您整理&#xff1a; 1.策划和预制阶段&a…

黑客组织“Anonymous”进行网络攻击抗议日本排放核污水

概述 近期全球都在关注日本核污水排放&#xff0c;起因是日本政府宣布&#xff0c;福岛第一核电站核污染水8月24日开始排入海洋&#xff0c;计划排放30年。那么这件事为什么会引起全球关注呢&#xff0c;大家通过美国对日本投放原子弹后果&#xff0c;导致广岛长崎任然处于核辐…

Java SPI 机制

文章首发于个人博客&#xff0c;欢迎访问关注&#xff1a;https://www.lin2j.tech 什么是 SPI 机制 SPI &#xff08;Service Provider Interface&#xff09;是 Java 内置的一种服务提供发现机制&#xff0c;将功能的实现交给第三方&#xff0c;用来拓展和替换组件。 SPI 的…

ESB(Enterprise Service Bus,即企业服务总线)

以前用过部分功能&#xff0c;但是没有很好地去理解过。 ESB&#xff08;Enterprise Service Bus&#xff0c;即企业服务总线&#xff09;是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢&#xff0c;是构筑企业神经系统的必要元素。 企业服…