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

在main.js 引用

javascript 复制代码
// 引入拖动js
import dragMove from "./utils/dragMove.js"

创建 drawmove.js

javascript 复制代码
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代码 (可能有一些其他带啊吗)

javascript 复制代码
<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>
相关推荐
全栈前端老曹35 分钟前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
低代码布道师1 小时前
Next.js 16 全栈实战(一):从零打造“教培管家”系统——环境与脚手架搭建
开发语言·javascript·ecmascript
一位搞嵌入式的 genius2 小时前
深入 JavaScript 函数式编程:从基础到实战(含面试题解析)
前端·javascript·函数式
choke2332 小时前
[特殊字符] Python 文件与路径操作
java·前端·javascript
wqq63108552 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Deng9452013142 小时前
Vue + Flask 前后端分离项目实战:从零搭建一个完整博客系统
前端·vue.js·flask
Hello.Reader3 小时前
Flink 文件系统通用配置默认文件系统与连接数限制实战
vue.js·flink·npm
wuhen_n3 小时前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
鹿心肺语3 小时前
前端HTML转PDF的两种主流方案深度解析
前端·javascript
一个懒人懒人4 小时前
Promise async/await与fetch的概念
前端·javascript·html