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 ...
随机推荐
- TCP三次握手的过程,accept发生在三次握手的哪一个阶段?
答案是:accept过程发生在三次握手之后,三次握手完成后,客户端和服务器就建立了tcp连接并可以进行数据交互了.这时可以调用accept函数获得此连接. TCP Accept总结 TCP Accep ...
- 轮播模仿臭美APP,vue,swiper
介绍:轮播使用了swiper,重要用于移动端滑动,详情可查看官网 1.首先用npm安装 npm install swiper 2.main.js 中引入CSS import 's ...
- 第08组 Alpha冲刺(4/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11882079.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- 第01组 团队Git现场编程实战
目录 一.组员职责分工 二.github 的提交日志截图(鼓励小粒度提交) 三.程序运行截图 四.程序运行环境 五.GUI界面 六.基础功能实现 七.鼓励有想法且有用的功能 八.遇到的困难及解决方法 ...
- java并发编程(八) CAS & Unsafe & atomic
参考文档:https://www.cnblogs.com/xrq730/p/4976007.html CAS(Compare and Swap) 一个CAS方法包含三个参数CAS(V,E,N).V表示 ...
- “sockaddr”: “struct”类型重定义的错误的解决办法《转》
原帖地址:https://blog.csdn.net/clever101/article/details/100163301 windows.h和winsock2.h存在有类型重定义,往往体现在VC程 ...
- 【深入学习linux】Linux系统安装
1. 配置内存大小,和设置镜像文件,开启虚拟机,点击虚拟机,立即按F2,会出现下图 2. 选择 Boot 菜单,默认是以硬盘进行启动,但是硬盘目前为空,则不能启动,需要改成以光盘形式启动即 CD-RO ...
- kotlin基础 常见容器的取值范围
- lamda表达式求最小值
//取最小设置金额的列 var minList = LsList.OrderBy(n=>n.Price).First(); //取最小设置金额的值 var minValue = LsList.S ...
- github 体积限制
github 体积限制 仅供了解,切勿滥用.希望自觉维护良好社区. 单文件 单个文件大于 50M 时会收到警告, 100M 时会被拒绝. 该警告将告诉您哪些文件太大: remote: warning: ...