原生js实现弹出层登录拖拽功能


Posted in Javascript onDecember 05, 2016

在WEB开发过程中,总会遇到一些从未接触过的需求,总是想尽一切办法去研究,最终实现效果,在实现效果的那一刻成就感爆棚,有木有?

留言墙、弹出框等一些常见地方都有拖拽功能,方便用户体验嘛。

实现拖拽功能 ,三个事件 mousemove , mouseup ,mousedown, 偏移量(offsetLeft, offsetTop , offsetWidth ,offsetHeight),窗口坐标位置(clientX ,clientY ) 以及获取可视区域方法的兼容性处理。

之前做的比较多的留言墙效果时写过的,这当时做的笔记,现在来整理整理。

JavaScript代码:

window.onload = function() {
 var btn = document.getElementsByClassName('login')[0]
 var close = document.getElementById('close');
 var login = document.getElementById('login');
 var top = (document.documentElement.clientHeight - 250) / 2; //top值等于(获取页面可视区域的宽度 - 登录框的高度) / 2
 var left = (document.documentElement.clientWidth - 350) / 2;
 var open = document.getElementById('screen');
 btn.onclick = function() {
  login.style.display = 'block';
  login.style.left = left + 'px';
  login.style.top = top + 'px';
  open.style.display = 'block';
  open.style.width = getInner().width + 'px'; //弹出层的宽度等于可视窗口的宽度
  open.style.height = getInner().height + 'px';
 }
 close.onclick = function() {
  login.style.display = 'none';
  open.style.display = 'none';
 }
 window.onresize = function() {
   var top = (getInner().height - 250) / 2;
   var left = (getInner().width - 350) / 2;
   login.style.left = left + 'px';
   login.style.top = top + 'px';
  }
  //跨浏览器获取可视窗口
 function getInner() {
  if (window.innerWidth != 'undefined') { //IE 不支持返回undefind
   return {
    width: window.innerWidth,
    height: window.innerHeight
   }
  } else {
   return {
    width: document.documentElement.clientWidth,
    height: document.documentElement.clientHeight
   }
  }
 }
 //实现拖拽功能 ,三个事件 mousemove , mouseup ,mousedown
 //clientX ,clientY 时鼠标指针相对于整个屏幕的坐标距离
 //offsetLeft, offsetTop 获取当前元素相对于父元素的位置,在这里,父元素是document
 login.onmousedown = function(e) {
   stop(e); //阻止事件默认行为
   var e = e || window.event;
   var oLeft = e.clientX - login.offsetLeft; //login.offsetLeft 获取盒子边框到浏览器左边框的距离
   var otop = e.clientY - login.offsetTop;
   document.onmousemove = function(e) { //移动的是整体的doucment
    var e = e || window.event;
    //不能移出可视区域
    var left = e.clientX - oLeft;
    var top = e.clientY - otop;
    //左右
    if (left < 0) { //如果盒子距左边的距离小于零,即超出
     left = 0;
    } else if (left > getInner().width - login.offsetWidth) { //可视区域的长度,减去盒子的长度 offsetWidth
     left = getInner().width - login.offsetWidth;
    }
    //上下
    if (top < 0) {
     top = 0;
    } else if (top > getInner().height - login.offsetHeight) {
     top = getInner().height - login.offsetHeight;
    }
    login.style.left = left + 'px';
    login.style.top = top + 'px';
   }
   document.onmouseup = function() {
    document.onmousemove = null;
    document.onmouseup = null;
   }
  }
  //取消默认行为
 function stop(e) {
  var e = e || window.event;
  if (typeof e.preventDefault != 'undefined') {
   e.preventDefault(); //W3C
  } else {
   e.returnValue = false; //IE阻止事件默认行为
  }
 }
}

HTML代码:

<div id="header">
 <div class="logo"><img src="images/logo.gif" alt="" /></div>
 <div class="member">个人中心
  <ul class="list">
   <li><a href="###">设置</a></li>
   <li><a href="###">换肤</a></li>
   <li><a href="###">帮助</a></li>
   <li><a href="###">退出</a></li>
  </ul>
 </div>
 <div class="login">登录</div>
</div>

<div id="login">
 <h2><img src="images/close.png" alt="" class="close" id="close" />登录</h2>
 <div class="user">用户名<input type="text" name="user" class="text" /></div>
 <div class="pass">密  码 
  <input type="password" name="pass" class="text" /></div>
 <div class="button">
  <input type="button" class="submit" value="" /></div>
 <div class="other">注册新用户 | 忘记密码</div>
</div>
<div id="screen"></div>
<script type="text/javascript" src="demo.js"></script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
Node.js实现数据推送
Apr 14 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
原生js封装添加class,删除class的实例
Nov 06 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
May 10 Javascript
解决layui checkbox 提交多个值的问题
Sep 02 Javascript
详解JavaScript中精度失准问题及解决方法
Feb 04 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
Dec 05 #Javascript
原生js编写基于面向对象的分页组件
Dec 05 #Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 #Javascript
浅谈Node.js:Buffer模块
Dec 05 #Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
Dec 05 #Javascript
详解jquery easyui之datagrid使用参考
Dec 05 #Javascript
微信小程序 less文件编译成wxss文件实现办法
Dec 05 #Javascript
You might like
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
深入分析PHP设计模式
2020/06/15 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
javascript代码加载优化方法
2011/01/30 Javascript
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
Python yield 小结和实例
2014/04/25 Python
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Python3 合并二叉树的实现
2019/09/30 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
社区七一党员活动方案
2014/01/25 职场文书
投资合作协议书范本
2014/04/17 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
于丹论语心得观后感
2015/06/15 职场文书