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

 

  在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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【java中的Set集合】HashSet、LinkedHashSet、TreeSet(最通俗易懂版!!)

目录 一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 二、LinkedHashSet集合 LinkedHashSet集合的特点 三、TreeSet集合 1.TreeSet集合的特点 2.TreeSet的基本使用 四、HashSet、LinkedHashSet、TreeSet的使用场景 五、list和set集合的区别 一、HashSet集合 …

分布式任务调度框架

分布式任务调度框架 学习为主 文章目录 分布式任务调度框架一、概念二、架构图三、任务调度的流程定时触发任务是如何实现的&#xff1f;&#xff1a;使用时间轮实现定时执行任务逻辑:3.1 对到达now时间后的任务&#xff08;超出now 5秒外)3.2 对到达now时间后的任务&#xff0…

苹果为 Vision Pro 头显申请游戏手柄专利

苹果Vision Pro 推出后&#xff0c;美国专利局公布了两项苹果公司申请的游戏手柄专利&#xff0c;其中一项的专利图如下图所示。据 PatentlyApple 报道&#xff0c;虽然申请专利并不能保证苹果公司会推出游戏手柄&#xff0c;但是苹果公司同时也为游戏手柄申请了商标&#xff0…

Navicat使用HTTP通道服务器进行连接mysql数据库(超简单三分钟完成),centos安装nginx和php,docker安装nginx+php合并版

序言 因为数据库服务器在外网是不能直接连接访问的&#xff0c;但是可以访问网站&#xff0c;网站后台就能访问数据库&#xff0c;所以在此之前&#xff0c;访问数据库的数据是一件非常麻烦的事情&#xff0c;在平时和运维的交流中发现&#xff0c;他们会使用ssh通道进行连接访…

解决Apache Tomcat “Request header is too large“ 异常 ‍

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

RC电路(二):耦合

耦合仿真电路及波形 数值与输入方波宽度 之间满足&#xff1a;&#xff0c;将变成一个 耦合电路&#xff0c;输出波形可以跟随输入波形&#xff0c;电路如下图所示。 上图红框部分放大后如下图所示&#xff1a; 在 时&#xff0c; 由 &#xff0c;因电容电压不能突变(来不及…

祝贺!Databend Cloud 和阿里云 PolarDB 达成认证

近日&#xff0c;北京数变科技有限公司旗下产品与阿里云 PolarDB 开源数据库社区展开产品集成认证。 测试结果表明&#xff0c;北京数变科技有限公司旗下产品《Databend Cloud&#xff08;V1.25&#xff09;》正式通过了《阿里云 PolarDB 数据库管理软件》的技术认证&#xff…

「C++程序设计 (面向对象进阶)」学习笔记・一

0、引言 本专栏的系列文章是在学习 北京邮电大学 崔毅东 老师的《C程序设计 (面向对象进阶)》课程过程中整理的。欢迎前往专栏了解更多相关内容~ &#x1f600; 有关于现代 C 的基本介绍&#xff0c;请前往《现代C基本介绍》&#xff01; &#x1f514; 先决条件 本专栏的系列…

BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(上)

文章目录 文章引入IO模型及概念梳理BIO简单介绍代码样例压测结果 NIO(单线程模型)简单介绍与BIO的比较代码样例压测结果 多路复用器问题引入 文章引入 如果你对BIO、NIO、多路复用器有些许疑惑, 那么这篇文章就是肯定需要看的, 本文将主要从概念, 代码实现、发展历程的角度去突…

cocosCreator 之 微信小游戏打包

版本&#xff1a; v3.8.0 环境&#xff1a; Mac 介绍 cocosCreator 支持将游戏发布到多个小游戏平台&#xff0c;并提供了打包等流程处理。 本篇文章主要讲述下微信小游戏的发布流程相关。更多内容参考官方文档&#xff1a; 发布到小游戏平台 微信小游戏的发布相关&#xff…

vue3 DOM元素渲染完成之后执行

在Vue 3中&#xff0c;可以使用nextTick函数来在DOM元素渲染完成之后执行代码。nextTick函数会在下次DOM更新循环结束之后执行提供的回调函数。 例如&#xff0c;在Vue 3的组件中&#xff0c;可以这样使用nextTick函数&#xff1a; import { nextTick } from vue;export defa…

多线程与高并发——并发编程(3)

文章目录 三、锁1 锁的分类1.1 可重入锁、不可重入锁1.2 乐观锁、悲观锁1.3 公平锁、非公平锁1.4 互斥锁、共享锁2 深入synchronized2.1 类锁、对象锁2.2 synchronized的优化2.3 synchronized实现原理2.4 synchronized的锁升级2.5 重量级锁底层 ObjectMonitor3 深入ReentrantLo…

并发编程的故事——并发之共享模型

并发之共享模型 文章目录 并发之共享模型一、多线程带来的共享问题二、解决方案三、方法中的synchronize四、变量的线程安全分析五、习题六、Monitor七、synchronize优化八、wait和notify九、sleep和wait十、park和unpark十一、重新理解线程状态十二、多把锁十三、ReentrantLoc…

CocosCreator3.8研究笔记(二)windows环境 VS Code 编辑器的配置

一、设置文件显示和搜索过滤步骤 为了提高搜索效率以及文件列表中隐藏不需要显示的文件&#xff0c; VS Code 需要设置排除目录用于过滤。 比如 cocoscreator 中&#xff0c;编辑器运行时会自动生成一些目录&#xff1a;build、temp、library&#xff0c; 所以应该在搜索中排除…

云计算的三个主要服务模型:IaaS、PaaS 和 SaaS

文章目录 介绍基础设施即服务&#xff08;Infrastructure as a Service&#xff0c;IaaS&#xff09;平台即服务&#xff08;Platform as a Service&#xff0c;PaaS&#xff09;软件即服务&#xff08;Software as a Service&#xff0c;SaaS&#xff09; 区别基础设施即服务&…

C++面试题(吴)-计算机网络部分(2)和常见设计模式

目录 1.网络部分 3.32 说说浏览器从输入 URL 到展现页面的全过程 3.33 简述 HTTP 和 HTTPS 的区别&#xff1f; 3.34 说说 HTTP 中的 referer 头的作用 3.35 说说 HTTP 的方法有哪些 3.36 简述 HTTP 1.0&#xff0c;1.1&#xff0c;2.0 的主要区别 3.37 说说 HTTP 常见的…

vue组装模板(侧边栏+顶部+主体)--项目阶段4

目录 一、前言介绍 二、结构解析 三、页面拆分 &#xff08;一&#xff09;页面拆分 1.侧边栏页面&#xff08;固定&#xff09;--Aside.vue 2.顶部页面&#xff08;固定&#xff09;--Header.vue 3.主体页面&#xff08;不固定的&#xff09;--示例用UserView…

PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像...

原文链接&#xff1a;http://tecdat.cn/?p24346 在今天产品高度同质化的品牌营销阶段&#xff0c;企业与企业之间的竞争集中地体现在对客户的争夺上&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 “用户就是上帝”促使众多的企业不惜代价去争夺尽可能多的客…

C#,《小白学程序》第七课:列表(List)应用之一“编制高铁车次信息表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary>…

bug复刻,解决方案---在改变div层级关系时,导致传参失败

问题描述&#xff1a; 在优化页面时&#xff0c;为了实现网页顶部遮挡效果&#xff08;内容滚动&#xff0c;顶部导航栏不随着一起滚动&#xff0c;并且覆盖&#xff09;&#xff0c;做法是将内容都放在一个div里面&#xff0c;为这个新的div设置样式&#xff0c;margin-top w…