原生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学习笔记(十九) 节点的操作实现代码
Jun 20 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
javascript使用正则获取url上的某个参数
Sep 04 Javascript
javascript中 try catch用法
Aug 16 Javascript
jQuery实现折叠、展开的菜单组效果代码
Sep 16 Javascript
js闭包用法实例详解
Dec 13 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
Jun 29 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
Aug 10 Javascript
Vue.js使用axios动态获取response里的data数据操作
Sep 08 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
nodejs中函数的调用实例详解
2018/10/31 NodeJs
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
js实现3D旋转相册
2020/08/02 Javascript
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
软件测试工程师笔试题带答案
2015/03/27 面试题
网站编辑求职信
2013/10/17 职场文书
教师节促销活动方案
2014/02/14 职场文书
社区工作者感言
2014/03/02 职场文书
项目合作意向书模板
2014/07/29 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
详解php中流行的rpc框架
2021/05/29 PHP
Redis性能监控的实现
2021/07/09 Redis
JavaScript的Set数据结构详解
2022/02/18 Javascript