鼠标监视 | 拖拽方块 | Vue

简介: 鼠标监视 | 拖拽方块 | Vue

title: 拖拽功能

tags: Vue

categories: JavaScript

abbrlink: 18a433ce

date: 2022-11-26 21:14:19


效果


代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>监听鼠标行为</title>
    <!-- Date: 2022-11-24 12:44:52 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.10/dist/vue.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        html,
        body,
        #app {
            width: 100%;
            height: 100%;
            user-select: none;
        }

        #app {
            background-color: bisque;
        }

        #x,
        #y {
            background-color: black;
            position: absolute;
        }

        #x {
            width: 100%;
            height: 1px;
        }

        #y {
            width: 1px;
            height: 100%;
        }

        #GoldHB {
            width: 100px;
            background-color: gold;
            position: absolute;
            opacity: 50%;
            text-align: center;
        }

        #GoldHB:hover {
            cursor: move;
            background-color: greenyellow;
            border-radius: 70%;
        }
    </style>
</head>

<body>
    <!-- 非input元素绑定键盘事件,需要加tabindex属性或者设置contenteditable属性为true, 需先点击元素后生效 -->
    <div id="app" @mousemove="showPos" @mousedown="showButton" @mousewheel="scrolling">
        <!-- 动态CSS -->
        <div id="x" :style="{top: topSty}"></div>
        <div id="y" :style="{left: x+'px'}"></div>

        <h1> 鼠标当前坐标: ({{position}}) </h1>
        <h1>你刚点击了 {{mouseBut}} </h1>
        <h1>你刚按下了 {{keyBut}} </h1>
        <h1>窗口中可视区域大小: {{window.innerWidth}}, {{window.innerHeight}} </h1>
        <h1>拖动"我"试试, 或者滑动滚轮</h1>
        <!-- 拖拽功能 -->
        <div @mousedown.left="draging" id="GoldHB" :style="sty_GoldHB"></div>
    </div>
    <script>

        const vm = new Vue({
            el: '#app',
            data: {
                x: 0,
                y: 0,
                butCode: "",
                keyBut: "",
                // 优势, 可以方便的在这里添加更多动态的css样式
                sty_GoldHB: {
                    height: '100px',
                    top: '142px',
                    left: '40px',
                },
                window,
            },
            created() {
                // 全局监听 键盘按下事件
                document.onkeydown = this.keyButton;
            },
            methods: {
                showPos(e) {
                    // 偏移一个像素, 使鼠标能点中其他元素
                    this.x = e.clientX - 1;
                    this.y = e.clientY - 1;
                },
                showButton(e) {
                    this.butCode = e.button;
                },
                keyButton(e) {
                    this.keyBut = e.key;
                },
                scrolling(e) {
                    let h = parseInt(this.sty_GoldHB.height);
                    let w = e.wheelDelta / 10;
                    if ((h += w) < 0) h = 0;
                    this.sty_GoldHB.height = h + 'px';
                },
                draging(e) {
                    // 获取目标元素
                    let divGold = e.target;
                    // 当鼠标按下,就获得鼠标在盒子内的坐标(x,y)
                    let x = e.pageX - divGold.offsetLeft;
                    let y = e.pageY - divGold.offsetTop;
                    // 重新设置盒子距离左上的距离=> 当前鼠标的位置 - 点击时, 鼠标在盒子中的坐标
                    let move = () => {
                        // 这里的this指向Vue
                        this.sty_GoldHB.left = (this.x - x) + 'px';
                        this.sty_GoldHB.top = (this.y - y) + 'px';
                    }
                    // 添加鼠标移动事件
                    document.addEventListener('mousemove', move);
                    // 添加鼠标释放事件, 一旦释放鼠标, 移除鼠标移动事件, 即停止移动
                    document.addEventListener('mouseup', () => {
                        document.removeEventListener('mousemove', move)
                    })
                },
            },
            computed: {
                position() {
                    return this.x + ", " + this.y;
                },
                mouseBut() {
                    let arr = ["鼠标左键", "鼠标中键", "鼠标右键"];
                    return arr[this.butCode];
                },
                topSty() {
                    return this.y + 'px';
                },
            }
        })
    </script>
</body>

</html>
相关文章
|
27天前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
108 4
|
6天前
|
人工智能 自然语言处理 JavaScript
用 CodeBuddy 搭建Vue框架 像呼吸一样简单
本文介绍如何借助 CodeBuddy 快速创建 Vue 项目。CodeBuddy 是一款支持自然语言编程的工具,能根据用户需求自动生成代码,降低开发门槛。文章详细说明了通过 CodeBuddy 创建 Vue 项目的步骤,包括解决项目创建失败的问题、自动补全代码功能以及启动开发服务器的方法。无论开发者经验如何,CodeBuddy 都能显著提升效率,让开发更专注创意实现。
|
17天前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
2月前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
139 56
|
2月前
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
185 13
|
2月前
|
数据采集 资源调度 JavaScript
极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
本文介绍了使用 Vue Flow 绘制流程图的方法与技巧。Vue Flow 是一个灵活强大的工具,适合自定义复杂的流程图。文章从环境要求(Node.js v20+ 和 Vue 3.3+)、基础入门案例、自定义功能(节点与连线的定制、事件处理)到实际案例全面解析其用法。重点强调了 Vue Flow 的高度灵活性,虽然预定义内容较少,但提供了丰富的 API 支持深度定制。同时,文中还分享了关于句柄(handles)的使用方法,以及如何解决官网复杂案例无法运行的问题。最后通过对比 mermaid,总结 Vue Flow 更适合需要高度自定义和复杂需求的场景,并附带多个相关技术博客链接供进一步学习。
|
2月前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
3月前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
3月前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。