<style>
.login-header {
width: 100%;
text-align: right;
height: 30px;
font-size: 24px;
line-height: 30px;
margin-left: -100px;
}
ul, li, ol, dl, dt, dd, div, p, span, h1, h2, h3, h4, h5, h6, a {
padding: 0px;
margin: 0px;
}
.login {
width: 512px;
position: absolute;
border: #ebebeb solid 1px;
height: 280px;
left: 50%;
right: 50%;
background: #ffffff;
box-shadow: 0px 0px 20px #ddd;
z-index: 9999;
margin-left: -256px;
margin-top: 140px;
display: none;
}
.login-title {
width: 100%;
margin: 10px 0px 0px 0px;
text-align: center;
line-height: 40px;
height: 40px;
font-size: 18px;
position: relative;
cursor: move;
-moz-user-select:none;/*火狐*/
-webkit-user-select:none;/*webkit浏览器*/
-ms-user-select:none;/*IE10*/
-khtml-user-select:none;/*早期浏览器*/
user-select:none;
}
.login-input-content {
margin-top: 20px;
}
.login-button {
width: 50%;
margin: 30px auto 0px auto;
line-height: 40px;
font-size: 14px;
border: #ebebeb 1px solid;
text-align: center;
}
.login-bg {
width: 100%;
height: 100%;
position: fixed;
top: 0px;
left: 0px;
background: #000000;
filter: alpha(opacity=30);
-moz-opacity: 0.3;
-khtml-opacity: 0.3;
opacity: 0.3;
display: none;
}
a {
text-decoration: none;
color: #000000;
}
.login-button a {
display: block;
}
.login-input input.list-input {
float: left;
line-height: 35px;
height: 35px;
width: 350px;
border: #ebebeb 1px solid;
text-indent: 5px;
}
.login-input {
overflow: hidden;
margin: 0px 0px 20px 0px;
}
.login-input label {
float: left;
width: 90px;
padding-right: 10px;
text-align: right;
line-height: 35px;
height: 35px;
font-size: 14px;
}
.login-title span {
position: absolute;
font-size: 12px;
right: -20px;
top: -30px;
background: #ffffff;
border: #ebebeb solid 1px;
width: 40px;
height: 40px;
border-radius: 20px;
}
</style>
<script src="common.js"></script>
</head>
<body>
<div class="login-header"><a id="link" href="javascript:void(0);">会员登录</a></div>
<div id="login" class="login" >
<div id="title" class="login-title">会员登录
<span><a id="closeBtn" href="javascript:void(0);" class="close-login">关闭</a></span>
</div>
<div class="login-input-content">
<div class="login-input">
<label>账号:</label>
<input type="text" placeholder="请输入账号" name="info[username]" id="username" class="list-input">
</div>
<div class="login-input">
<label>密码:</label>
<input type="password" placeholder="请输入密码" name="info[password]" id="password" class="list-input">
</div>
</div>
<div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登录</a></div>
</div>
<!-- 遮盖层 -->
<div id="bg" class="login-bg" ></div>
<script>
// 1、点击超链接显示遮挡层登录框,在页面任何位置都可以关闭登录框
//获取link源事件
var link=document.getElementById('link');
//获取登录框
var login=document.getElementById('login');
var bg=document.getElementById('bg');
var closeBtn=document.getElementById('closeBtn');
//link绑定鼠标点击事件
link.onclick=function (e) {
//设置login登录框的显示样式-----元素(样式)属性值:对象名.style.属性名=“属性值”
login.style.display='block';
//设置遮挡层背景显示
bg.style.display='block';
console.log('出来 了')
e.stopPropagation();
}
//页面任何位置都可以关闭登录框
closeBtn.onclick=function () {
login.style.display='none';
console.log("隐藏了")
bg.style.display='none';
}
//按下鼠标,移动鼠标,移动登录框
var title=document.getElementById('title');
title.onmousedown=function (e) {
//鼠标在盒子中的X横坐标=获取此时可视区域的横坐标-此时登录框距离左侧页面的横坐标
var spaceX=e.clientX-login.offsetLeft;
//鼠标在盒子中的Y纵坐标=获取此时可视区域的纵坐标-此时登录框距离左侧页面的纵坐标
var spaceY=e.clientY-login.offsetTop;
//移动的事件
document.onmousemove=function (e) {
//盒子的横坐标X=新的可视区域的横坐标-spaceX ====>新的值----> 给登录框的left属性,
var leftX=e.clientX - spaceX+250;
//盒子的纵坐标Y=新的可视区域的纵坐标-spaceY ====>新的值----> 设置登录框的left属性,
var topY=e.clientY - spaceY-140;
login.style.left=leftX +'px';
login.style.top=topY +'px';
}
//事件移出
title.onmouseup=function () {
document.onmousemove=null;
}
}
</script>

思路:
1、当鼠标按下时,求出鼠标在盒子中的位置;
鼠标在盒子中的位置 = 鼠标在页面中的位置 - 盒子在页面中的位置

2、当鼠标移动时,保持鼠标在盒子中的位置不变(即盒子跟随鼠标移动)
盒子的坐标 = 鼠标当前在页面中的位置 - 鼠标在盒子中的位置

使用到的属性有:offsetLeft、offsetTop、pageX、pageY
注意:盒子要脱离文档流,即设置 position:absolute

====================问题解决l====================
问题:鼠标弹起了,盒子还黏在鼠标上。
解决:当鼠标弹起时,移除鼠标移动事件。
关闭按钮:当鼠标点击关闭按钮时,隐藏盒子
注意:使用getPage(e)解决pageX和pageY的浏览器兼容性问题

JS Web API 拖拽对话框案例的更多相关文章

  1. 案例(拖拽对话框、高清放大镜、自制滚动条、元素的隐藏方式、表格隔行变色、tab切换效果、字符串拼接、刷新评论)

    一.拖拽对话框 <style> .of{ width: 500px; } #link,#close{ text-decoration: none; margin: 0 10px; font ...

  2. php和js实现文件拖拽上传

    Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...

  3. JS Event 鼠标拖拽事件

    <!DOCTYPE html><html> <head>        <meta charset="UTF-8">         ...

  4. JS实现拖拽小案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. vuejs2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...

  6. javascript--鼠标拖拽窗口案例(鼠标按下,在鼠标移动过程中,盒子跟着一起移动,鼠标松开,盒子停止移动)

    界面如图所示: 要求:在“信息注册”栏,按下鼠标,然后鼠标在页面移动,在鼠标移动过程中,该窗口跟着鼠标移动,当鼠标松开的时候,窗口停止移动.点击“关闭”,该窗口隐藏. 实现思路: 1.页面结构分析:一 ...

  7. vue2.0使用Sortable.js实现的拖拽功能

    简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jQuery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...

  8. vuejs2.0使用Sortable.js实现的拖拽功能( 转)

    文章目录   简介 实现效果 html主要代码 css代码 js代码 简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是 ...

  9. Dropzone.js实现文件拖拽上传

    dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...

随机推荐

  1. 洛谷 P1873 【砍树】

    P1873 传送门 题外话 话说我们也要当一当光头强?? 大体题意 就是让你砍树,统一的高度,然后让你砍树,看看订什么高度合适. 思路: 二分答案,对高度二分,如果砍得树长度不够,那就说明高度高了. ...

  2. SQL进阶-索引设置&sql优化

    一.索引设置 1.索引的设置原则 经常出现在WHERE条件.关联条件中的字段作为索引字段: 在满足查询需求的前提下,应尽可能少的创建索引:(对于一个组合索引,可以满足以组合索引左边的一部分字段的查询需 ...

  3. Centos7 U盘安装&命令大全

    软件下载 1.centos下载,下载地址https://www.centos.org/download/ 我选择的镜像是:CentOS-7-x86_64-DVD-1804.iso 2.UltraISO ...

  4. 【转】Linux 系统如何处理名称解析

    原文写的很好:https://blog.arstercz.com/linux-%E7%B3%BB%E7%BB%9F%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%90% ...

  5. 韦东山视频第3课第2节_JNI_C调用JAVA_P【学习笔记】

    C调JAVA方法主要步骤如下: 一.C代码调用java的静态方法 Hello.java public class Hello{ public static void main(String args[ ...

  6. sqlserver cdc用法

    SELECT top(10)  * from (SELECT  sys.fn_cdc_map_lsn_to_time([__$start_lsn])  'addtime',* FROM cdc.dbo ...

  7. Systemd笔记

    Systemd管理的启动脚本位于 /usr/lib/systemd/system/ 下 Systemd启动顺序约定为: 当前服务满足启动条件, 则立即创建进程进行并行启动, 启动条件指服务的依赖关系( ...

  8. ubuntu16 修改gitlab root密码

    搭建了一个gitlab的git服务器,默认的管理员为root; 长时间不用root忘记了root密码: 我们可以在服务器上直接重置root的密码: 以下操作在终端下执行 #进入gitlab控制台 su ...

  9. patchUpload.vue?5e29:406 Uncaught (in promise) DOMException: Failed to execute 'readAsArrayBuffer' on 'FileReader': The object is already busy reading Blobs.

    patchUpload.vue?5e29:406 Uncaught (in promise) DOMException: Failed to execute 'readAsArrayBuffer' o ...

  10. vue---父子组件之间的通信【props,$refs、$emit】

    在用vue进行项目开发的时候,父子组件之间的通信是经常被用到的,下面就来具体说说父子组件通信的三种方式: 父组件: <template> <div> <h1>我是父 ...