制作一个可拖动的html对话框

JS练习一:拖动对话框 拖动对话框效果 点击CLICK HERE 弹出登录界面对话框 鼠标按下即可拖动对话框 点击关闭按钮即可关闭对话框 代码: CSS+HTML代码 <head> <style> * { margin: 0; padding: 0; font-family: sans-serif; } body { background-color: rg 阅读详情

制作对话框,最简单的方式是使用jQuery的ui插件,一行代码就搞定。

$("<div>我是一个对话框</div>").dialog(); 

但是前提是需要引入jquery和ui库:

<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css"/>
<script src="http://code.jquery.com/jquery-1.11.2.min.js">
<script src="http://code.jquery.com/ui/1.11.4/jquery-ui.min.js">

jQuery UI的js库是比较庞大的,上面的版本需要约80kb,下载和解析都会比较花时间(当然可以进行用ui库的定制版)。为了一个对话框,动用了一个比较大的框架,然后使用了一小部分功能,有点不太值得。其实我们可以自己动手写一个有拖动效果的效果的对话框,不需要借助jQuery UI.

一、需求和效果

在页面点击合作协议时,弹出合作协议的对话框(页面添加了遮罩效果),并且可以用鼠标进行拖动。
效果展示

二、原理分析

主要利用mousemove事件,当鼠标移动的时候让对话框跟随鼠标进行移动。当鼠标按下时,响应mousedown事件,记录下当前需要进行拖动的元素,并保存到一个变量,mousemove时对该元素进行移动,mouseup时,释放掉那个变量

三、实现

首先,写好html内容,并调好样式:置为fixed,页面居中。(css代码略)

<div class='agreement-dlg'>
    <h3>合作模式</h3>
    <p>1. ...</p>
</div>

然后,写事件响应,响应三个鼠标事件。

//将所有的操作,封装到一个函数
dragAndDrop($(".agreement-dlg"));

//传进一个参数,表示哪个页面元素要进行拖动
function dragAndDrop($element){
    //用一个isDragging变量表示当前是否在拖动
    var isDragging = false;

    //响应事件,将三个事件都用同一个handler
    function handleEvent(event){
        switch(event.type){
            //鼠标按下时,置标志位为true
            case: 'mousedown':
                isDragging = true;
                break;
            case: 'mouseup':
                isDragging = false;
                break;
            //一但鼠标进行移动,更新element的位置
            case: 'mousemove':
                if(isDragging){
            //使用jQuery的css设置left和top值有很好的跨浏览器兼容性
                    $element.css({left: event.clientX, top: event.clientY});
                }
                break;
        }
        var element = $element.get(0);
        element.onmousemove = handleEvent;
        element.onmouseup   = handleEvent;
        element.onmousedown = handleEvent;
    }
}

考虑到mousemove事件发生较为频繁,可将第三个case置为第一位,提高程序的效率。

1. 第一个问题

当你把代码敲进去实现时,会发现有一个问题,就是在设置left和top时,是以鼠标在当前页面的的x/y值,所以会将对话框的左上角设置成鼠标每次按下去的位置。因此在设置left和top时,需要减去偏差值,即对话框的左上角距离鼠标点击位置的偏差。响应mousemove的代码改成:

$element.css({left: event.clientX - element.offsetX, 
               top: event.clientY - element.offsetY});
2. 第二个问题

当鼠标拖动得很迅速的时候,你会发现,对话框跟不上,掉队了。掉队了之后,由于鼠标已经在对话框之外,因此不会再响应mousemove事件了。所以不能将handler绑定在对话框上面,一但拖动过快,鼠标超出了对话框的范围,就没有拖动效果了。
回顾DOM的事件冒泡,我们知道,发生在元素节点(elementNode)的事件会不断延着父节点一直冒泡到document节点。因此,我们将事件监听绑定到document,在document上做响应,而不是element,因此将最后面的事件绑定改为:

var doc = window.document;
doc.onmousemove = handleEvent;
doc.onmousedown = handleEvent;
doc.onmouseup = handleEvent;

这样就可以解决拖动过快,鼠标超出响应范围的问题。

四、继续完善

我们还需要一个关闭对话框的按钮,加在对话框的顶部。

<div class='agreement-dlg'>
    <--添加一个对话框,使用unicode的╳符号,不需要使用图片或者icon font-->
    <div class='title-bar'>
        <a href="#nogo" class="close">╳</a>
    </div>
    <div class='_body'>
        <h3>合作模式<h3>
        <p>内容</p>
    </div>
</div>

然后在响应关闭按钮的函数里,将相关事件的handler清空,同时将对话框关闭。

$element.remove();
var doc = window.document;
doc.onmousemove = null;
doc.omousedown = null;
doc.onmouseup = null;

如果不将事件的响应函数清除,那么关闭对话框之后,三个鼠标事件仍然在监听,因为我们是绑到document上的。

最后,细心的你会发现上面的实现还有问题

第三个问题

当鼠标按下的时候,需要判断点击的对象是不是相应的对话框,如果不是的话,不进行拖动。使用上面的代码,如果点击的地方是在页面的其它位置,对话框也会有拖动效果,因此需要对操作的对象进行判断。
首先,对话框添加一个move的class

<div class='agreement-dlg move'>

然后,用一个变量存储当前拖动的对象

//不需要传参数
function dragAndDrop(){
    //用一个变量表示当前需要拖动的对象
    var draggingObj = null;
    function handleEvent(event){
        switch(event.type){
            case: 'mousedown':
            //使用jQuery的closest函数找到最近的含有move的父元素或当前元素
            //如果是用dom原生的event,注意浏览器兼容性
                draggingObj = $(event.target || event.srcElement ).closest(".move");
                break;
            case: 'mouseup':
                draggingObj = null;
                break;
            case: 'mosemove':
                if(draggingObj) ...//剩下的一样

通过这样的方式,我们只需要将页面中需要拖动的元素添加一个move的class,就能够实现该元素的拖动效果,但注意该元素的position要设为fixed或者abosolute.

参考:
《Javascript高级程序设计》第十二章《事件》(professional javascript for web developers)

JavaScript制作可拖拽的弹出对话框 示例 代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <met 阅读详情

相关推荐

可拖动对话框插件的鼠标交互实现技术

htmltable {th, td {th {pre {简介:对话框是用户界面中用于信息交互的重要组件。本文档介绍了一个可在点击后弹出并支持用户拖动的对话框插件的实现。它涵盖JavaScript和CSS的关键技术点,如事件监听、CSS定位、拖动逻辑、性能优化、动画效果、响应式设计和样式定制。提供了包含HTML、CSS和JavaScript代码的资源,帮助开发者掌握实现交互式对话框的技术。

weixin_35750483的博客 260

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

模态框是指覆盖在父窗口上的子窗口,但在HTML网页中,并没有父窗口和子窗口的概念。这里是通过可隐藏的遮罩层和一个可隐藏的盒子来实现模态框的效果。

apple_54470279的博客 6494

bootstarp拖拽布局例子

bootstarp拖拽布局例子,框架官网http://layoutit.justjavac.com/#close,实现类似QQ空间小窝布局模式下的自由布局功能。

可移动框 弹窗 可拖拽的组件

【代码】可移动框 弹窗。

weixin_50885665的博客 327

高性能HTML和SVG元素拖拽js插件plain-draggable

plain-draggable是一款高性能HTML和SVG元素拖拽js插件。通过plain-draggable插件,你可以轻松的将HTML元素或SVG元素转换为可拖拽的元素。

Html元素拖动排序

Html元素拖动排序 两个插件 满足你多种需求

js拖动窗口

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{margin:0;padding:0} #main{ position: absolute; width: 2

front_end_fan 470

html5移动端拖拽图片、拖拽标签等插件以及相应的demo、适用于手机网址开发和mui前端开发、h5app开发中的图片拖拽等

html5移动端拖拽图片、拖拽标签等插件以及相应的demo、适用于手机网址开发和mui前端开发、h5app开发中的图片拖拽、div拖拽等

为Bootstrap模态对话框添加拖拽移动功能

为什么80%的码农都做不了架构师?>>> ...

weixin_34324081的博客 124

一生一芯预学习:从零搭建Verilator仿真环境与NVBoard实战

本文详细介绍了如何从零搭建Verilator仿真环境,并完成NVBoard实战项目,为'一生一芯'预学习提供完整指导。内容包括环境配置、工具安装、波形生成、自动化构建及可视化调试技巧,帮助初学者快速掌握数字逻辑设计与仿真验证的核心技能。

keras9composer的博客 700

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1320

JavaScript 拖动对话框效果

实现效果: 点击点击按钮,弹出对话框。 按住对话框顶部并移动,实现拖动效果。 点击对话框右上角×,关闭对话框。 代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Do

火星基地 389

STM32-printf重定向串口输出

声明 本文内容转载至https://www.mculover666.cn/posts/2251182441/ 1.printf与fputc printf 定义在 <stdio.h> 头文件中,如下: int printf(const char *format, ...); printf 函数根据 format 字符串给出的格式打印输出到 stdout(标准输出)中,当然,printf 函数是不会一个字符一个字符去输出,它会调用更底层的 I/O 函数:fputc去逐个字符打印。 fputc 也定

qq_41215167的博客 4539

JS弹出对话框(可拖动)

效果图: 可拖动的对话框 #popDiv { position: absolute; visibility: hidden; overflow: hidden; border: 2px solid #AEBBCA; background-color: #EEF1F8; cursor: move; padding: 1px; z

C语言是最好的编程语言 2060

ESP8266+Mixly+MIXIO物联网实战:用色盘控制WS2812 RGB灯(附完整代码)

本文详细介绍了如何利用ESP8266微控制器、Mixly图形化编程工具与MIXIO物联网平台,快速构建一个可通过网页色盘远程控制WS2812 RGB智能灯带的实战项目。内容涵盖硬件接线、平台配置、代码编写与调试全流程,旨在帮助物联网爱好者与初学者轻松实现创意灯光应用,掌握智能硬件开发的核心技能。

gin88的博客 261

【2023】Java利用modbus4j实现工业设备Modbus TCP数据采集与解析

本文详细介绍了在2023年使用Java和modbus4j库实现工业设备Modbus TCP数据采集与解析的完整实践。内容涵盖开发环境搭建、TCP连接建立、开关量与模拟量数据的读取与解析、批量读取性能优化、控制指令写入以及常见错误排查指南,为开发者构建稳定高效的工业物联网数据采集系统提供全面指导。

rose2的博客 723

原生html页面弹窗_html+javascript可拖动弹窗

最近在慕课网上学习了一个网页可拖动对话框js实现的演示视频,这个demo中的例子是百度首页登录按钮的弹窗,如下图:​当点击左上角的登录按钮时,弹窗出现并自动居中,同时窗口可拖动的范围被限制在了可视区域内,即浏览器视窗的上下左右边界,弹窗无法移出移动出四个边界,也不会出现滚动条。​另一个效果就是,当改变窗口大小时,对话框自动居中。这个视频中用了原生js,jQuery两种写法实现案例,但本质上,对话框...

weixin_39957265的博客 1264

用 XCO 库一键找出某个 ABAP 类的全部子类

ABAP XCO库子类枚举技术解析 本文介绍了在ABAP项目中如何利用XCO库高效获取类的继承层次结构。传统方法使用CL_ABAP_CLASSDESCR或手动维护映射表存在效率低、易遗漏的问题。新方法通过XCO库的IF_XCO_AO_CLASS接口,可简洁地获取父类的所有子类(包括间接子类)。 核心API链式调用: 获取类句柄:xco_cp_abap=>class() 导航子类集合:subclasses->all 获取结果:get()返回类引用表或get_names()返回类名列表 典型应用场景

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 127

html图片随意拖动怎么实现,HTML 实现随意拖动内容位置

HTML 实现随意拖动内容位置2020-09-01 07:19:43两种方式为:拖拽普通标签位置或拖拽canvas中的文本框位置1. 实现鼠标拖动标签元素到任意位置css 代码#range{position:relative;width:600px;height:400px;margin:10px;background-color:rgb(133,246,250);}.icon{...

weixin_29798981的博客 2426

通用抓取————6D位姿估计

这意味着算法在没有物体的先验知识(如 CAD 模型)的情况下,依然能够通过神经网络捕捉物体的外观、形状和几何特征,生成相关的 6D 位姿估计。通过输入物体类别的描述,算法能够推断出该类别物体的位姿和尺度,无需特定物体的 CAD 模型。在这个坐标空间中,物体的位姿和尺度都是已知的,基于这个标准化表示,算法可以对输入图像中的物体进行 6D 位姿和尺寸的估计。○优势: ICP 是一种非常有效的位姿优化算法,特别适合精细调整物体的位姿,确保最终估计的位姿与真实物体的点云或模型高度一致。

具身机器人和通用AI 2377

PCIe 全解析笔记:从协议本质到工程实现

学习 PCIe,最容易陷入的误区是直接跳进协议手册(Base Spec 1300 多页),然后在 TLP 字段、LTSSM 状态、Ordering Rules 中迷失方向。正确的思维路径历史维度:从 PCI 到 PCIe,解决了什么核心矛盾?抽象维度:协议栈分层的真正意图是什么?工程维度:高速串行链路面临哪些物理挑战?协议如何应对?系统维度:作为 CPU 与外设的"动脉",PCIe 如何融入整个计算机体系?带着这四个视角去看每一个细节,知识才能内化为认知。

m0_46644103的博客 261

html+javascript实现可拖动可提交的弹出层对话框效果

本文为大家介绍下使用html+javascript实现可拖动弹出层、对话框、可提交,具体代码如下,感兴趣的朋友可以参考下,希望对大家有所帮助 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose....

diemi9921的博客 302

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HTML5——新增可拖动

这次我们来玩一个好玩的属性,draggable属性,先简单介绍一下 draggable 属性值:true/false 功能:用它修饰的所有标签变为可拖动(原本只有img元素和设置了href属性的a标签默认可拖动) 接下来我们来玩一下 <!DOCTYPE html> <html> <head> <meta charset="utf-8">...

Lanly-Li的博客 1100

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

如何在 HTML 中创建一个可拖动的元素,并且实现拖放功能,需要涉及哪些 HTML5 的 API?

HTML5 拖放 API 是 HTML5 标准中新增的一组 API,它允许我们在网页上实现元素的拖动和放置功能。通过这些 API,我们可以轻松地让元素变得可拖动,并且在拖动过程中进行各种操作,比如改变元素的样式、传递数据等。通过本文的学习,我们了解了如何在 HTML 中创建一个可拖动的元素,并且实现拖放功能。我们学习了 HTML5 拖放 API 的基本用法,包括draggable属性、dragstartdragenterdragoverdropdragend等事件。

前端大白话 1088

HTML可拖拽模拟对话框

&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Test&lt;/title&gt; &lt;style type="text/css" &gt; html,body { height:100%; width

钢铁鸭 730

无标题栏对话框的拖动

很多基于对话框的应用程序都是不带框架的,也就是说对话框没有标题栏。众所周知,窗口的移动都是通过鼠标点住标题栏拖动窗口实现的,那么现在没有了标题栏,如何移动对话框呢?本文拟针对这个问题提出解决的办法。     解决这个问题有两种方案。一种很业余,另外一种比较专业。前者使用一种常规思

519
下一篇: html5响应式图片
codingPigg
博客等级 码龄12年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值