模态框

article/2025/8/19 0:59:27

模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应

摘自百度百科

先放上效果图:

在这里插入图片描述

基本功能为点击窗口中间的发光按钮,使模态框出现,此时除了模态框部分,页面其他部分无法再点击(被遮罩覆盖),必须先点击确定对该模态框进行响应后才能进行其他操作。鼠标按住并拖动模态框标题块处,可以实现模态框的拖拽跟随效果。

实现

模态框效果的实现分为屏幕中间按钮和模态框确定按钮的点击事件的实现,以及模态框拖拽效果的实现。

由于两个按钮的点击事件只需要令模态框和一个模糊遮罩的显示或消失即可,实现比较简单,不做赘述,重点分析一下这个拖拽效果怎么实现

拖拽效果涉及到的鼠标事件有mouseupmousedownmousemove,还需要通过鼠标事件对象的pageXpageY属性元素的offsetLeftoffsetTop属性来实时计算模态框的位置(模态框为固定定位,通过topleft实现框体移动),以此实现模态框的拖拽效果

可拖拽区域

首先要明确的是,有效的拖拽区域应该设置为模态框的一部分区域(这里设置为标题区域),这是因为网页的模态框往往有多个功能部分(如若干个输入框、按钮等),如果模态框整个部分都可以拖拽,那么就有可能影响功能区域交互效果。

在这里插入图片描述

拖拽点

所谓的拖拽点就是当鼠标在模态框可拖拽区域按下时的那个点。需要计算出这个点相对于模态框左上角的坐标,这个坐标将用于后续模态框随鼠标光标移动时边移量的计算。

当鼠标按下时,触发mousedown事件,利用鼠标事件对象的pageXpageY属性标识出当前光标位置,再利用模态框的偏移量属性offsetLeftoffsetTop计算出拖拽点坐标,计算公式为:

x = e.pageX - offsetLeft;
y = e.pageY - offsetTop;

在这里插入图片描述

模态框位置计算

当鼠标在模态框可拖拽区域按下并移动时,模态框要随着鼠标移动,这个移动是通过改变模态框的上边移量top和左边移量left实现的(模态框为固定定位)。topleft的值随鼠标坐标位置的改变而改变,利用上述求出的拖拽点相对于模态框左上角的坐标(x, y)以及相关推导关系,可以得出:

left = e.pageX - x;
top = e.pageY - y;

事件监听器的设置

至此,就可以将上述计算关系应用到mousedownmousemove事件中进行拖拽效果的实现了。

首先拖拽效果的触发,发生在鼠标在模态框可拖拽区域按下时,因此应该给模态框可拖拽区域的元素添加mousedown监听器(这里可拖拽区域元素为modalTitle):

modalTitle.onmousedown = function(e) {// 计算拖拽点位置let x = e.pageX - modalTitle.offsetLeft;let y = e.pageY - modalTitle.offsetTop;// ......
}

要明确的一点是,只有在鼠标在模态框可拖拽区域按下时才需要鼠标移动事件mousemove发生(鼠标移动触发时可以不停的更新e.pageXe.pageY的值以便实时计算出模态框边移量),如果鼠标移动事件一直存在,那么有可能在鼠标压根没有点击拖拽时模态框就乱动了。所以mousemove应该在鼠标按下时绑定mousemove事件,在鼠标松开(mouseuup)时解绑mousemove事件:

modalTitle.onmousedown = function(e) {// 计算拖拽点位置let x = e.pageX - modalTitle.offsetLeft;let y = e.pageY - modalTitle.offsetTop;// 鼠标按下时绑定 mousemove 事件targetElem.onmousemove = function(e) {modalCon.style.left = e.pageX - x;modalCon.style.top = e.pageY - y;}
}
modalTitle.onmouseup = function(e) {// 鼠标松开时解绑 mousemove 事件targetElem.onmousemove = ''
}
// 上述的 targetElem 是 mousemove 事件监听器应用的元素

那么mousemove的监听器应该应用在哪个元素上呢?既然是在模态框的可拖拽区域按下鼠标的,那就应用到模态框的可拖拽区域?但是如果应用到模态框的可拖拽区域(modalTitle)会导致一种结果就是:当鼠标移动太快,鼠标光标有可能会脱离模态框,导致失败的拖拽效果
在这里插入图片描述

那么应该应用在哪里?可以看到,鼠标是在整个文档的可视范围内移动的,那么mousemove监听器直接应用到document即可

modalTitle.addEventListener('mousedown', (e) => {let x = e.pageX - modalCon.offsetLeft;let y = e.pageY - modalCon.offsetTop;document.onmousemove = (e) => {modalCon.style.left = e.pageX - x + 'px';modalCon.style.top = e.pageY - y + 'px';}
})
modalTitle.addEventListener('mouseup', (e) => {document.onmousemove = '';
})

在这里插入图片描述

至此整个拖拽效果就完成了!!!

演示链接

代码的CodePen演示链接

文章源码:https://gitee.com/thisismyaddress/bocheng-blogs/tree/master/网页特效/模态框


http://chatgpt.dhexx.cn/article/XbjqC9qM.shtml

相关文章

HTML+CSS+JavaScript实现模态框(可拖拽)

前言 模态框是指覆盖在父窗口上的子窗口,但在HTML网页中,并没有父窗口和子窗口的概念。这里是通过可隐藏的遮罩层和一个可隐藏的盒子来实现模态框的效果。 效果演示: 下面开始详细介绍如何实现一个可拖拽的模态框。只对 JS 部分详解&#x…

Bootstrap系列之模态框(Modal)

文章の目录 1、工作原理2、示例2.1、Modal组件2.2、在线演示2.3、静态背景2.4、滚动内容2.5、垂直居中2.6、提示和弹窗2.7、使用网格2.8、不同模态框的内容2.9、改变动画2.10、移除动画2.11、动态高度2.12、Accessibility2.13、嵌入YouTube视频 3、Optional sizes4、用法4.1、通…

Oracle数据迁移

本文主要提及使用exp,imp以及Oracle数据泵等工具如何进行数据迁移: 一、数据迁移工具 1、数据迁移工具 (1)数据泵 (2)外部表:external table (3)数据加载工具:sqllo…

MySQL数据库- 几种数据迁移的方法详解都在这了!看完必懂

数据迁移的几种方式 - MySQL数据库 本文关键字:MySQL、数据库、数据迁移、导入、导出 文章目录 数据迁移的几种方式 - MySQL数据库 一、数据迁移 1. 数据的生命周期2. 数据迁移的发生二、数据导出 1. 命令方式2. 软件方式三、数据导入 1. 命令方式2. 软件方式四、…

数据迁移方法

在我的《高并发系统设计目标之可扩展性》博文中提到,随着业务的发展,我们会沿着AKF的Y轴进行微服务化的改造。但是沿着Y轴的重构过程中往往涉及到分库分表。那么这时就需要进行数据库的迁移了。沿着AKF的Z轴也类似,那么迁移有什么原则呢&…

如何高效地进行大规模数据迁移?

导读 我们在做一次系统业务模型重构的时候,往往会遇到把旧模型表中的数据迁移到新模型表中,如果这时候,我们旧表中的数据规模已达到千万级以上,那么,这个从旧表迁移到新表的过程会非常漫长,而业务仍需快速推…

电脑数据怎么迁移?

“最近我的电脑越来越卡,运行程序时还会出现卡死奔溃的现象,陪伴我多年的电脑到了退休的时候了。购买了一台新款的笔记本电脑,打开软件运行多么的流畅,别提多高兴了!可是,我想把旧电脑的数据导入到新电脑怎…

数据库整体迁移

1.迁移方法概述: 使用Navicat Premium 分别与源数据库和目标数据库建立连接,然后借助Navicat Premium自带的数据传输功能,实现Oracle数据库的迁移.其实跟从MySQL数据库迁移到oracle数据库是一个套路. O(∩_∩)O~ 听起来,是不是很简单,其实就是很简单!下边我就讲一下具体实现的细…

数据库迁移的方法

数据库迁移的方法 我们今天以mysql为例,讲讲数据库迁移的四种方法。 1、将数据库倒出为sql文件,再重新导入(推荐)。 首先将mysql数据库锁定,并将内存中的数据写入磁盘。 flush tables with read lock ; 用mysqldump将t…

数据迁移——技术选型

日常我们在开发中,随着业务需求的变更,重构系统是很常见的事情。重构系统常见的一个场景是变更底层数据模型与存储结构。这种情况下就要对数据进行迁移,从而使业务能正常运行。 背景如下:老系统中使用了mongo数据库,由…

Oracle数据迁移MySQL

前言: 现今,Oracle数据迁移MySQL的需求已经越来越普遍,主要的迁移场景大致可以分为三类,第一类是涉及小表以及少量表的一次性迁移,无需进行增量同步,第二类是涉及大表以及多表的一次性迁移,第三类是涉及增…

电脑之间如何迁移数据?数据迁移方法描述

电脑之间如何迁移数据?当更换电脑时,很多人需要做的第一件事,就是将旧电脑的数据通过外置存储设备等拷贝到新电脑上,并且还要在新电脑上重新安装应用程序,步骤繁琐,耗费了大量的时间和精力不说,…

DB数据迁移方案

互联网系统,经常会有数据迁移的需求。系统从机房迁移到云平台,从一个云平台迁移到另一个云平台,系统重构后表结构发生了变化,分库分表,更换数据库选型等等,很多场景都需要迁移数据。 在互联网行业&#xf…

【OceanBase】四种不同的数据迁移方式

前言 OceanBase 已连续 9 年稳定支撑双 11,创新推出“三地五中心”城市级容灾新标准,在被誉为“数据库世界杯”的 TPC-C 和 TPC-H 测试上都刷新了世界纪录。自研一体化架构,兼顾分布式架构的扩展性与集中式架构的性能优势,用一套…

数据迁移介绍

数据迁移方案 数据迁移框架有几个比较有名应用比较广泛的开源项目:阿里datax,apache sqoop以及Pentaho kettle。这三个框架整体上工作原理类似,下面介绍阿里datax数据迁移框架。 对旧系统进行了重构,就需要把原来的数据迁移到新数…

代码技巧——数据迁移方案【建议收藏】

开发工作中,可能会遇到如"大表拆分"、"跨库数据迁移"等场景,本文介绍互联网常见架构下的数据迁移方案及实现; 1. 数据迁移的业务场景 以下是需要数据迁移的场景业务场景; 1.1 大表拆分 由于历史原因&…

【Pytorch】Label Smoothing

理论介绍可以参考 【Inception-v3】《Rethinking the Inception Architecture for Computer Vision》 中的 4.5 Model Regularization via Label Smoothing 本质就是用右边(意会下就行)的标签替换左边的 one-hot 编码形式,让网络别那么愤青&…

关于label smoothing(标签平滑)

目的: label smoothing常用于分类任务,防止模型在训练中过拟合,提高模型的泛化能力。 意义: 对于分类问题,我们通常使用one-hot编码,“非黑即白”,标签向量的目标类别概率为1,非目标…

【AI面试】hard label与soft label,Label Smoothing Loss 和 Smooth L1 Loss

往期文章: AI/CV面试,直达目录汇总【AI面试】NMS 与 Soft NMS 的辨析【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化在一次询问chatGPT时候,在他的回答中,由smooth L1联想提到了Label Smoothing Loss 。我把问题贴到下面,和chatGPT的回答,供你参考。不…

标签平滑(label smoothing)

目录 1.标签平滑主要解决什么问题? 2.标签平滑是怎么操作的? 3.标签平滑公式 4.代码实现 标签平滑(label smoothing)出自GoogleNet v3 关于one-hot编码的详细知识请见:One-hot编码 1.标签平滑主要解决什么问题&…