vue小测试之拖拽、自定义事件

news2024/12/29 17:21:46

在开始之前我去复习了一下,clientX、clientY、pageX、pageY的区别,对于不熟悉offsetLeft和offsetTop的也可以在这里去复习一下。

vue拖拽指令之offsetX、clientX、pageX、screenX_wade3po的博客-CSDN博客_vue offset

客户区坐标位置(clientX,clientY)

鼠标事件都是在浏览器视口中的特定位置发生的。这个位置信息保存在事件对象的clientX和clientY属性中,所有浏览器都支持这两个属性。

页面坐标位置(pageX,pageY)

pageX和pageY两个属性代表鼠标光标在页面中的位置,因此坐标是从页面本身而非视口的左边和顶边计算的。在没有滚动的情况下,clientX和cilentY与pageX和pageY是相等的

屏幕坐标位置(screenX,screenY)

鼠标事件发生的时候,不仅仅会有相对于浏览器的窗口,还有一个相对于整个电脑屏幕的位置。

代码:

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.10/dist/vue.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            position: absolute;
            top: 0;
            left: 0;
            text-align: center;
            line-height: 100px;
            width: 100px;
            height: 100px;
            border-radius: 10%;
            background-color: greenyellow;
            margin-top: 10px;
        }
    </style>
</head>

<body>
    <div id="root">

        <com-son :msg="haha"></com-son>
    </div>
    <template id="box">
        <div>
            <h3 class="box" v-for="(item,idx) in dmsg" :key="idx" @mousedown="drag">{{item}}</h3>
        </div>
    </template>
    <script>
        // 创建组件
        let ComSon = {
            template: "#box",
            props: ['msg'],
            data() {
                return {
                    dmsg: this.msg
                }
            },
            methods: {
                drag(e) {
                    //鼠标摁下事件
                    var x = e.clientX - e.target.offsetLeft;
                    var y = e.clientY - e.target.offsetTop;
                    // console.log(x, y);
                    //鼠标移动事件
                    document.onmousemove = function (el) {
                        e.target.style.left = el.pageX - x + 'px'
                        e.target.style.top = el.pageY - y + 'px'
                    },
                        //鼠标抬起事件
                        document.onmouseup = function () {
                            // 设置随机颜色
                            var bgc = 'rgb(' + Math.floor(Math.random() * 256) + ',' + Math.floor(Math.random() * 256) + ',' + Math.floor(Math.random() * 256)
                            e.target.style.backgroundColor = bgc;
                            document.onmousemove = null;
                        }
                }
            }

        }
        Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示
        const vm = new Vue({
            el: '#root',
            data() {
                return {
                    haha: ['宝子们', '周末愉快', '愉快吖', '哈哈', '~!!!', '这是', '作业哟']
                }
            },
            methods: {
            },
            components: {
                ComSon,
            }
        });
    </script>
</body>

</html>

效果图:

案列二:自定义事件的子传父

1、css板块代码

 #root {
            width: 900px;
            height: 600px;
            padding: 10px;
            display: flex;
            justify-content: space-between;
        }

        .sh {
            width: 400px;
            height: 100%;
            background-color: rgb(233, 157, 157);
            padding: 10px;
        }

        .shop {
            width: 100%;
            height: 150px;
            background-color: white;
            display: flex;
            align-items: center;
            box-sizing: border-box;
            overflow: hidden;
            margin-bottom: 10px;
        }

        .bgcont {
            width: 400px;
            height: 100%;
            background-color: rgb(157, 231, 233);
            padding: 10px;
        }

        .shop img {
            width: 120px;
            margin-left: 10px;
        }

        .shop_context {
            margin: 0px 10px;
        }

        .shop_context>p {
            overflow: hidden;
            word-break: break-all;
            text-overflow: ellipsis;
            display: -webkit-box;
            -webkit-line-clamp: 2;
            -webkit-box-orient: vertical;
            font-size: 14px;
            color: rgb(112, 111, 111);
        }

        .shop_context div {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }

        .shop_context div>p {
            color: rgb(71, 70, 70);
            font-size: 14px;
        }

        .active {
            color: darkorange !important;
        }

        .son {
            width: 100%;
            height: 100%;
            background-color: #fff;
            display: flex;
            flex-direction: column;
            align-items: center;
        }

        .son img {
            margin-top: 20px;
            width: 270px;
            height: 290px;
            border: darkgrey 1px solid;
        }

        .son p {
            margin: 0px 20px;
            font-size: 15px;
        }

        .son h2:last-of-type {
            color: red;
        }

        .son button {
            border: none;
            width: 250px;
            height: 45px;
            border-radius: 10px;
            background-image: linear-gradient(to right top, #d16ba5, #c777b9, #ba83ca, #aa8fd8, #9a9ae1, #8aa7ec, #79b3f4, #69bff8, #52cffe, #41dfff, #46eefa, #5ffbf1);
        }

2、body部分

<body>
    <div id="root">
        <div class="sh">
            <div class="shop" v-for="(item, index) in list" :key="index" @click="shopChuan(list[index])">
                <img :src="item.imgsrc" alt="">
                <div class="shop_context">
                    <h3>{{item.name}}</h3>
                    <p>{{item.context}}</p>
                    <div>
                        <h3>¥{{item.price}}缘</h3>
                        <p v-text="item.flag == true?'已购买':'未购买'" :class="item.flag == true?'active':''"></p>
                    </div>
                </div>
            </div>
        </div>

        <div class="bgcont" v-if="isShow">
            <com-son :propsitem="propsitem" @haha="hahaha"></com-son>
        </div>

    </div>

3、vue代码

template代码是放在body中的,也可以将它写在组件里,依据个人喜好设置

 <template id="son">
        <div class="son">
            <!-- <h1>子组件</h1> -->
            <img :src="propsitem.imgsrc" alt="">
            <h3>{{propsitem.name}}</h3>
            <p>{{propsitem.context}}</p>
            <h3>¥{{propsitem.price}}缘</h3>
            <button @click="change">点击购买</button>
        </div>
    </template>

    <script>
        let ComSon = {
            template: "#son",
            props: {
                // 对象验证
                propsitem: {
                    type: Object
                }
            },
            methods: {
                change() {
                    if (this.propsitem.flag === true) {
                        alert("已经购买过了~~~")
                        return
                    }
                    this.$emit("haha", this.propsitem.id)
                    alert("购买成功~~~")
                }
            }
        }

        const vm = new Vue({
            el: '#root',
            data() {
                return {
                    list: [
                        {
                            id: 111,
                            name: "小米平板5 Pro",
                            imgsrc: "./img/tp3.png",
                            context: "更大的屏幕,带来更强的拓展性高效的多任务处理灵活的多设备互联,你想做的每件事,从未如此得心应手小米平板5 Pro 12.4英寸生产力的更多可能性,由此展开。",
                            price: 2999,
                            flag: false,
                        },
                        {
                            id: 222,
                            name: "米家直驱洗烘一体机",
                            imgsrc: "./img/tp2.png",
                            context: "「以旧换新优惠50元,以旧换新到手价1949元!」「第六代DD直驱电机!智能洗烘!微蒸空气洗!高温杀菌,电机10年质保!」DD直驱电机/智能洗烘/微蒸空气洗/高温除螨洗/巴氏杀菌",
                            price: 1999,
                            flag: true,
                        },
                        {
                            id: 333,
                            name: "米家全能扫拖机器人",
                            imgsrc: "./img/tp1.png",
                            context: "免洗集尘全自动,一机解放双手,自动洗拖布 | 自动集尘 | 自动热烘干 | 自动补水 | 专用清洁剂,S-Cross AI™ 超感知立体识别避障系统,智能分配用水比例,拖地不中断",
                            price: 3999,
                            flag: false,
                        },
                    ],
                    isShow: false,
                    propsitem: {}

                }
            },
            methods: {
                shopChuan(e) {
                    this.isShow = true
                    console.log(e);
                    this.propsitem = e
                },
                hahaha(b) {
                    // console.log(b);
                    for (let i of this.list) {
                        if (i.id === b) {
                            i.flag = true
                            // console.log(i.id);
                        }
                    }
                }
            },
            components: {
                ComSon
            }
        })

    </script>

效果展示:

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

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

相关文章

虚拟工厂搭建,一键导入、即刻生产 | 大界 RoBIM CLOUD 云平台发布

大界在建筑、船舶、工程机械以及能源行业经过多年的场景实践&#xff0c;逐步形成了跨行业的 “算法数据流程” 的模型服务能力&#xff0c;并积累和沉淀为 RoBIM Cloud 平台产品。 RoBIM Cloud RoBIM Cloud 是一款云原生的智能机器人柔性生产平台&#xff0c;历时 3 年研发。大…

MavenCentral库发布记录

最近发布了 Android 路由库 URouter&#xff0c;支持 AGP8、ActivityResult启动等特性。 把提交到 Maven Central 过程记录一下。 一、注册 Sonatype 账号&#xff0c;新建项目 注册 https://​​issues.sonatype.org 登录后&#xff0c;新建项目&#xff1a; 相关选项&…

苹果macOS 14开发者预览版Beta 7发布 新增超过100款视频壁纸和屏保

8 月 31 日&#xff0c;苹果向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新&#xff08;内部版本号&#xff1a;23A5337a&#xff09;&#xff0c;本次更新距离上次发布隔了 8 天。 苹果发布 Beta 7 更新的同时&#xff0c;还发布了第 6 个公测版&#xff0c;正式版…

Vue项目build打包编译后如何再修改后台请求地址

在public文件夹下新建config.js文件 在config.js中添加请求地址&#xff1a; window.myURL {baseURL: http://127.0.0.1:8080, }在index.html中引入创建的config.js <script src"./config.js" type"text/javascript"></script>在请求后台地…

访问学者申请需要具备哪些条件?

访问学者申请是一项重要的学术活动&#xff0c;要求申请者具备一定的条件和资格。知识人网小编提箱&#xff0c;申请访问学者通常需要满足以下条件&#xff1a; 1. 学术背景&#xff1a;申请者通常需要拥有博士学位或相当于博士学位的学术资格。他们的学术背景应该与他们希望进…

报错处理:Out of memory

报错环境&#xff1a; Linux 具体报错&#xff1a; Out of memory error&#xff0c;系统内存不足 排错思路&#xff1a; 当系统的内存资源被耗尽时&#xff0c;会出现 Out of memory 错误。这可能是由于应用程序占用了大量的内存&#xff0c;或者系统负载过高导致内存不足引起…

sap 一次性供应商 供应商账户组 临时供应商

sap中有一次性供应商这个名词&#xff0c;一次性供应商和非一次性供应商又有什么区别呢&#xff1f; 有如何区分一次性供应商和非一次性供应商呢&#xff1f; 1 区分一次性供应商和非一次性供应商的标志 在供应商的表LFA1中有个字段标示XCPDK&#xff08;一次性科目&#xff…

轻松打造高效Linux工作环境

引言 作为一名Linux持续学习者&#xff0c;我们经常会遇到繁琐的日常工作任务&#xff0c;例如查找某个文件、文件传输、调试等。如何便捷高效地完成这些任务是我们必须面对的问题。本文将为你提供一些实用的技巧和工具&#xff0c;帮助你轻松打造高效的Linux工作环境。 快速查…

IDEA 设置提示信息

IDEA 设置提示信息 File->Settings->Editor->Code Completion 取消勾选 Math case

联网智能实时监控静电离子风机的工作流程

联网智能实时监控静电离子风机是通过将静电离子风机与互联网连接&#xff0c;实现对其状态和性能的远程监控和管理。 具体实现该功能的方法可以包括以下几个步骤&#xff1a; 1. 传感器安装&#xff1a;在静电离子风机上安装适当的传感器&#xff0c;用于感知相关的参数&…

六、Kafka-Eagle监控

目录 6.1 MySQL 环境准备6.2 Kafka 环境准备6.3 Kafka-Eagle 安装 6.1 MySQL 环境准备 Kafka-Eagle 的安装依赖于 MySQL&#xff0c;MySQL 主要用来存储可视化展示的数据 6.2 Kafka 环境准备 修改/opt/module/kafka/bin/kafka-server-start.sh 命令 vim bin/kafka-server-sta…

运用全新空调插座秒变智能新体验

最近台风肆虐&#xff0c;城市内涝等灾害频频发生&#xff1b;气候离不开环境&#xff0c;环境也离不开气候&#xff0c;在这两者之间&#xff0c;人类却成了第三者。 随手关灯&#xff0c;节约用电&#xff0c;是一种再普通不过的行为&#xff0c;然而10亿人在同一时间做同样…

SAP接口调用方式总结

目录 一、RFC调用/JCO调用二、Restful调用三、Webservice调用四、直联接口五、PI接口&#xff1a;具体不做赘述&#xff0c;可以百度总结&#xff1a; 前言&#xff1a;跟外围系统对接&#xff0c;首要要确认好接口的调用方式&#xff0c;然后再根据相关的调用方式进行相应的操…

windows11安装msi文件的方法

文章导航: 问题介绍开启Windows Installer服务安装msi文件 问题介绍 因为msi后缀的文件属于软件安装文件, 一般情况我们直接双击或者打开就可进行相应的安装操作. 但是对于新电脑, 自己刚买来, 而且不知道这种文件该如何打开的情况, 我们进行了这篇文件的介绍~ 希望能够帮助…

C#,《小白学程序》第十二课:日历的编制,时间DateTime的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十二课&#xff1a;日历的编制&#xff0c;时间DateTime的计算方法与代码 /// 本课学习时间类型的数据 DateTime 的简单方法&#xff0c;并编制一个月的日历。 /// </summary> /// <param name"sender"…

通义千问部署搭建

文章目录 一、部署11.1 打开通义千问-7B-预训练-模型库-选择资源1.2 使用Netbook2.1 运行2.2 复制脚本2.2.1 问题1 &#xff1a;ImportError: This modeling file requires the following packages that were not found in your environment: transformers_stream_generator. R…

Configuring HSRP(Hot Standby Routing Protocol)

网络冗余架构设计中&#xff0c;必不可少的就是网关冗余功能&#xff0c;而很多核心网中都会用到HSRP(Hot Standby Routing Protocol)协议来实现这个功能。 热备份路由协议&#xff08;HSRP&#xff09; 热备份路由协议&#xff08;HSRP&#xff09;是思科公司专有的协议&…

JVM面试核心点

一、JDK体系 二、JVM体系 三、JVM内存模型 public class Math {public static final int data 666;public static UserEntity user new UserEntity();public int compute() { // 一个方法对应一块栈帧内存区域int a 1;int b 2;int c (ab)*10;return c;}public static voi…

接口自动化测试 —— JMeter断言基本使用

断言 断言&#xff1a;就是让程序判断预期结果和实际结果是否一致 注意&#xff1a;请求发起成功了&#xff0c;不代表着一定符合预期的结果。 JMeter中常用断言 响应断言 JSON断言 持续时间断言 响应断言 步骤&#xff1a;&#xff1a;线程组——HTTP取样器——断言——…

VM装MACos

准备工具: 下载macOS Ventura 13 ISO镜像文件、VMware Workstation Pro最新版并激活(自行官网下载即可,需要镜像和key可以最下边的云盘自取) 下载Unlocker for VMware Workstation Pro,该工具用于解锁 macOS 系统支持、目前已支持macOS 13。 有需要的部分工具我放到最后 …