【学习笔记47】开关变量和拖拽效果

news2025/1/19 23:13:15

一、开关案例

    <button>点击获取验证码</button>

在这里插入图片描述

(一)基本功能的实现

        // 获取标签对象
        const oBtn = document.querySelector('button');

        // 给按钮添加点击事件
        oBtn.addEventListener('click', function () {
            // 定义变量 用于获取验证码
            let count = 5;

            oBtn.innerText = `${count}S获取验证码`;

            // 定时器
            var timer = setInterval(function () {
                count--;
                oBtn.innerText = `${count}S获取验证码`;

                // 清除定时器
                if (count === 0) {
                    oBtn.innerText = `获取验证码`;
                    clearInterval(timer)
                }
            }, 1000)
        })

(二)代码优化

  1. 我们在连续点击时会出现bug,这时需要开关变量来优化
  2. 第一次处 flag = false 用于在倒计时,连续点击不触发
  3. 第二次处 flag = true 用于倒计时结束,二次调用函数
        // 获取标签对象
        const oBtn = document.querySelector('button');

        // 定义开关变量
        let flag = true;

        // 给按钮添加点击事件
        oBtn.addEventListener('click', function () {

            // 添加开关判断 为false时禁止执行函数
            // if(false === false)  return;
            if(!flag)  return;

            // 定义变量 用于获取验证码
            let count = 5;
            oBtn.innerText = `${count}S获取验证码`;

            // 关闭开关 在定时之前让其不能重复执行代码
            flag = false;

            // 定时器
            var timer = setInterval(function () {
                count--;
                oBtn.innerText = `${count}S获取验证码`;

                // 清除定时器
                if (count === 0) {
                    // 当时间到达结束时间 重新打开开关 让函数可以二次调用
                    flag = true;
                    oBtn.innerText = `获取验证码`;
                    clearInterval(timer)
                }
            }, 1000)
        })

二、拖拽效果

(一)案例效果

  • 随着鼠标的移动,div盒子跟着鼠标移动

(二)案例分析

问题1: 事件类型是什么?

  1. 鼠标按下
  2. 鼠标移动
  3. 鼠标抬起

问题2: 事件源是什么?

  1. div
  2. 当前页面
  3. div

问题3: 移动距离是多少?

  1. 不是单纯的鼠标移动到某一个坐标点, 就代表移动多少
  2. 解决方法:
    • 在鼠标按下时,记录当前点击的坐标
    • 在鼠标移动时,重新获取最新的坐标
    • 最新的坐标 - 最初的坐标 === 移动距离

问题4: 是直接将移动距离赋值给元素吗?

  1. 在鼠标按下时, 记录元素本身的偏移量
  2. 将本身的偏移量与移动距离相加
  3. 把上一步得到的值, 赋值给元素

(三)HTML和CSS代码

    <div></div>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 100px;
            height: 100px;
            background-color: cadetblue;
            position: absolute;
        }
    </style>

(四)JS代码

1、没有定义开关变量时

        // 1. 获取标签对象
        const oDiv = document.querySelector('div');
        
        // 2. 定义变量 存储数据

        // 3. 鼠标按下   div
        oDiv.addEventListener('mousedown', function(){
            console.log(1111);
        })

        // 4. 鼠标移动   页面
        document.addEventListener('mousemove', function(){
            console.log(2222);
        })

        // 5. 鼠标抬起   div
        oDiv.addEventListener('mouseup', function(){
            console.log(3333);
        })

在这里插入图片描述

2、定义开关时

        // 1. 获取标签对象
        const oDiv = document.querySelector('div');
        
        // 2. 定义变量 存储数据
        let flag = false;    //定义开关变量 用于控制鼠标移动事件是否执行

        // 3. 鼠标按下   div
        oDiv.addEventListener('mousedown', function(){
            flag = true;
            console.log(1111);
        })

        // 4. 鼠标移动   页面
        document.addEventListener('mousemove', function(){
            if(!flag) return;
            console.log(2222);
        })

        // 5. 鼠标抬起   div
        oDiv.addEventListener('mouseup', function(){
            flag = false;
            console.log(3333);
        })

在这里插入图片描述

3、移动功能的实现

        // 获取标签对象
        const oDiv = document.querySelector('div');

        // 定义变量 存储数据
        let flag = false;      // 定义开关变量 用于判断鼠标移动事件
        let startX = 0;        // 定义变量 用于记录鼠标按下时 X轴的位置
        let startY = 0;        // 定义变量 用于记录鼠标按下时 Y轴的位置
        let eleTop = 0;        // 定义变量 用于记录鼠标按下时 元素本身距离顶部的偏移量
        let eleLeft = 0;       // 定义变量 用于记录鼠标按下时 元素本身距离左侧的偏移量


        // 鼠标按下  div
        oDiv.addEventListener('mousedown', function(e){
            // 鼠标移动事件正常执行
            flag = true;
            
            // 鼠标按下时 记录鼠标按下时的坐标
            startX = e.clientX;
            startY = e.clientY;

            // 鼠标按下时 记录元素偏移量
            eleTop = oDiv.offsetTop;
            eleLeft = oDiv.offsetLeft;
        })


        // 鼠标移动  页面
        document.addEventListener('mousemove', function(e){
            // 根据开关变量 判读是否执行鼠标移动事件
            if(!flag) return;

            // 鼠标移动时 记录最新的坐标
            let newX = e.clientX;
            let newY = e.clientY;

            // 计算移动的距离: 最新的坐标 - 最初的坐标 === 移动的距离
            let moveX = newX - startX;
            let moveY = newY - startY;

            // div本身的偏移量与移动距离相加
            let x = eleLeft + moveX;
            let y = eleTop + moveY;
            
            // 将移动的距离赋值给元素
            oDiv.style.top = y + 'px';
            oDiv.style.left = x + 'px';
        })

        // 鼠标抬起  div
        oDiv.addEventListener('mouseup', function(){
            flag = false;
        })

    /**
     * 初始值给什么无所谓
     *   1. 我们就在按下事件中给一个取反的值
     *   2. 在抬起事件中 给一个和初始值相同的值
     *   3. 在移动事件中 判断等于初始值的话 就让他不执行 等于抬起事件给的值 让他执行
    */

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

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

相关文章

javaSE- 方法的使用

一、方法的基本用法 方法就是一个代码片段. 类似于 C 语言中的 “函数”. 方法存在的意义(不要背, 重在体会): 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法开发, 不必重复造轮…

04_SpringBoot整合Mybatis

文章目录SpringBoot整合Mybatis0x01_创建项目导入依赖0x02_编写配置文件0x03_编写功能代码SpringBoot整合Mybatis 欢迎关注公众号“小东方不败” 0x01_创建项目导入依赖 创建项目&#xff1a; 目前稳定的最新版本是2.7.5,勾选两个依赖&#xff1a;Lombok和Spring Web 然后需…

Nodejs -- Express 路由原理及设置模块化路由

文章目录1. 路由的概念1.1 什么是路由1.2 显示生活中的路由1.3 Express中的路由1.4 Express中路由的例子1.5 路由的匹配过程2 路由的使用2.1 最简单的用法2.2 模块化路由2.3 为路由模块添加统一前缀1. 路由的概念 1.1 什么是路由 广义上来讲&#xff0c;路由就是映射关系 1.…

yarn : 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。

问题&#xff1a; yarn安装好了&#xff0c;vscode报错 报错问题&#xff1a;yarn 无法加载文件 C:\Users\sunlight\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 具体问题&#xff1a;cmd&#xff08;管理员运行&#xff09;中安装好了yarn &…

Angular使用管道和指令进行多语言切换

工作中经常遇到需要进行多种语言切换的项目。本文记录了一种在Angular页面中通过使用管道和自定义指令实现的语言切换方案。 1、实现效果 页面显示文字根据选择的语言自动进行翻译切换&#xff0c;如下图所示&#xff1a; 此时&#xff0c;页面模板的字符串全部按照管道格式书…

2023年IB生物有什么变化?

今天我们详细了解下2023年IBDP生物新课程内容、考试评估、内容、技能发展、科学本质等详细内容。IBDP生物新课程概述 IBDP新生物课程将于2023年2月开课&#xff0c;2023年8月首次授课&#xff0c;2025年5月进行首次考试。新课程反映社会变革&#xff0c;更加关注技能和概念、背…

【iMessage苹果推群发】苹果相册推archive到appstore开发证书(Development certificate)

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

DCHP通讯协议

从通讯TCP/IP的构成传输&#xff0c;到IP地址的分类&#xff0c;再到局域网与广域网的设置。 通讯协议的构成概述IPDHCP-设定动态IPDNS数据的流动广域网 网关局域网 交换机NAT桥接模式实操概述 前景知识&#xff1a;虚拟机与工艺库管理 扩展&#xff1a;NAT模式的实操。 1、T…

yolov5量化注意事项

&#xff08;1&#xff09;使用onnxsim 0.4.1版本、ort版本1.13.1 否则使用--dynamic True时所生成的onnx就会乱掉。 &#xff08;2&#xff09;利用trtexec生成engine 所使用的命令如下&#xff1a; trtexec.exe --onnxyolov5n_ptq_detect_dynamic.onnx --saveEngineptq_int…

小白学流程引擎-FLowable(二) — 从零搭建自己的FLowable服务 — 搭建流程服务-FLowable的新手指南

一、介绍 纵览Gitee搜索Flowable开源项目&#xff0c;大多都是已开发好的项目&#xff0c;而笔者从零开始搭建属于自己的Flowable引擎&#xff0c;并且是可以拿到生产上使用的。 二、软件架构 Springboot Flowable modeler idm Mysql SrpingBoot version&#xff1a;2.7…

牛客网verilog刷题知识点盘点(75道题的版本)

牛客网verilog刷题知识点盘点(75道题的版本) 还有几个坑没填 任务和函数 1.任务和函数必须在模块内定义&#xff0c;其作用范围仅适用于该模块&#xff0c;可以在模块内多次调用。 2.任务和函数中可以声明局部变量&#xff0c;如寄存器&#xff0c;时间&#xff0c;整数&…

企业云工如何高效居家协同办公?试试这个方法

近日的疫情反扑让全国各地的防疫压力增加&#xff0c;并且甚至很多地方不知道的啥时候就要被居家隔离&#xff0c;所以在新的防疫背景下&#xff0c;居家就顺理成章地成为一种常态化的学习和工作方式。 现在越来越多公司也将日常业务搬到了线上&#xff0c;以保证疫情期间公司的…

基于ssm的旅游网站的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

vue——路由

目录 一、介绍路由 1、路由是什么 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。 2、为什么要使用路由 3、主要用途 二、安装路由 1、安装命令 2、配置文件 3、在main.js 中进行挂载 三、案例展示 …

Linux服务器配置与管理(基于Centos7.2)任务目标(五)

文章目录一、知识目标二、能力目标二、任务实施任务一&#xff1a;安装Apache任务二&#xff1a;配置简单Web站点任务三&#xff1a;配置基于主机名的虚抛主机任务四&#xff1a;安装vsftpd任务五&#xff1a;匿名用户访问FTP服务器任务六&#xff1a;本地用户配置一、知识目标…

HummerRisk 使用场景-混合云安全治理(2)--阿里云安全最佳实践

背景&#xff1a; 阿里云安全最佳实践&#xff0c;是基于众多客户上云的成功案例萃取而成的最优化企业上云指导。每个最佳实践包括使用场景、多产品部署架构及部署手册。 最佳实践目前覆盖23种常用场景&#xff0c;目前有200篇最佳实践&#xff0c;涉及100款以上阿里云产品的…

20221128-1Spring_day02(资料来自黑马程序)

Spring_day02 今日目标 掌握IOC/DI配置管理第三方bean掌握IOC/DI的注解开发掌握IOC/DI注解管理第三方bean完成Spring与Mybatis及Junit的整合开发 1&#xff0c;IOC/DI配置管理第三方bean 前面所讲的知识点都是基于我们自己写的类&#xff0c;现在如果有需求让我们去管理第三方…

安卓讲课笔记5.11 菜单

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;菜单概述1、选项菜单2、上下文菜单3、子菜单&#xff08;二&#xff09;选项菜单案例演示1、创建安卓应用2、准备图片素材3、字符串资源文件4 、主布局资源文件5、主界面类实现功能6、启动应用&…

2. Vue3 Composition API

Composition API 1.Composition API 接下来我们来介绍一下Vue3中新增的Composition API如何使用。注意Composition API仅仅是Vue3中新增的API&#xff0c;我们依然可以使用Options API。先来实现一下之前演示的获取鼠标位置的案例。做这个案例之前&#xff0c;需要先介绍一下…

MybatisPlus简单使用与自定义sql以及通过自定义sql实现多表联查的分页查询

MybatisPlus简单使用与自定义sql以及通过自定义sql实现多表联查的分页查询前言1. mybatis的简单使用2. MybatisPlus 的简单使用2.1 入门2.1.1 简单配置2.1.2 入门例子2.1.3 测试2.2 MybatisPlus自带封装的增删改查2.2.1 傻瓜式使用2.2.2 批量添加数据3 MybatisPlus 动态查询sql…