JS Web API 拖拽对话框案例
<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 拖拽对话框案例的更多相关文章
- 案例(拖拽对话框、高清放大镜、自制滚动条、元素的隐藏方式、表格隔行变色、tab切换效果、字符串拼接、刷新评论)
一.拖拽对话框 <style> .of{ width: 500px; } #link,#close{ text-decoration: none; margin: 0 10px; font ...
- php和js实现文件拖拽上传
Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- JS实现拖拽小案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vuejs2.0使用Sortable.js实现的拖拽功能
简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...
- javascript--鼠标拖拽窗口案例(鼠标按下,在鼠标移动过程中,盒子跟着一起移动,鼠标松开,盒子停止移动)
界面如图所示: 要求:在“信息注册”栏,按下鼠标,然后鼠标在页面移动,在鼠标移动过程中,该窗口跟着鼠标移动,当鼠标松开的时候,窗口停止移动.点击“关闭”,该窗口隐藏. 实现思路: 1.页面结构分析:一 ...
- vue2.0使用Sortable.js实现的拖拽功能
简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jQuery ui中的sortable.js,只是在拖拽完成后,在update的回调函数中又重新排序了存放数据的数组.但 ...
- vuejs2.0使用Sortable.js实现的拖拽功能( 转)
文章目录 简介 实现效果 html主要代码 css代码 js代码 简介 在使用vue1.x之前的版本的时候,页面中的拖拽功能,我在项目中是直接用的jquery ui中的sortable.js,只是 ...
- Dropzone.js实现文件拖拽上传
dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...
随机推荐
- LINUX下的gdb调试方法
首先对目标文件进行编译 例如: gcc test.c -o test 这时会生成一个文件test,然后我们就可以对test进行调试了 示例: gdb test 好了以后是设定断点 示例: break ...
- 小说美句摘抄&&动漫壁纸
不知道为啥脑子一抽打算开个坑(反正咱是个不务正业的人) 大部分是网文里的,某些是轻小说里的,文学名著--咱也不像会看那个的人啊-- upd 2019.11.6:把一些自己觉得好的动漫壁纸贴一贴,图床用 ...
- 记一次vue+vuex+vue-router+axios+elementUI开发(三)
项目用到了状态管理工具 Vuex 中文文档:https://vuex.vuejs.org/zh/guide/ 大家都知道,vue中可用props将父组件的数据传递给子组件,但是有个问题,子组件一般不 ...
- HttpClient 连接泄漏问题
AbstractConnPool.java 提交记录 https://github.com/apache/httpcomponents-core/commits/4.4.x/httpcore/src/ ...
- 【转】Spring Boot @Condition 注解,组合条件你知道吗
原文:https://www.cnblogs.com/FraserYu/p/11280420.html 上一篇文章 你应该知道的 @ConfigurationProperties 注解的使用姿势,这一 ...
- rtsp 客户端请求视频的时候支持输入用户名和密码的格式
rtsp://[<username>[:<password>]@]<server-address-or-name>[:<port>][/<path ...
- MySQL函数find_in_set介绍
MySQL函数find_in_set介绍 数据库中的某个字段我十以字符存储的,同时又以","隔开的.如果想要查询这个字段中包含某个字符串该怎么查询?使用like?感觉不妥,如果使用 ...
- windows server core 2016 IIS远程管理的那些坑
打算从win10访问数据中心版2016 core,结果IIS远程管理不了. 需要修改core上防火墙和注册表,开启一些相关服务. 具体需要如下操作. 1.win10 启用IIS管理特性 2.参考htt ...
- 试图从目录中执行 CGI、ISAPI 或其他可执行程序
首先来看我遇到问题时的情况,直接上图! 从上图的错误提示信息可以看出,是权限不够,被拒绝访问,开始我以为是我的程序的php程序的原因,但是其他站点没事啊,就对这个站点的权限重新分配了下,给了最高权 ...
- avformat_open_input阻塞操作中断的支持
avformat_open_input默认是阻塞操作,如果不加控制,等待时间可能会达到30s以上,对于有些情况,等待30s的体验是无法接受的. ffmpeg支持interrupt_callback机制 ...