原生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.The.Good.Parts阅读笔记(一)假值与===运算符
Nov 16 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 Javascript
jQuery focus和blur事件的应用详解
Jan 26 Javascript
回车直接实现点击某按钮的效果即触发单击事件
Feb 27 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
Bootstrap3 模态框使用实例
Feb 22 Javascript
JS全角与半角转化实例(分享)
Jul 04 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
深入理解react 组件类型及使用场景
Mar 07 Javascript
vue的keep-alive用法技巧
Aug 15 Javascript
webpack的tree shaking的实现方法
Sep 18 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 多线程上下文中安全写文件实现代码
2009/12/28 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
PHP生成压缩文件实例
2015/02/07 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
jquery里的each使用方法详解
2010/12/22 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
jQuery实现非常实用漂亮的select下拉菜单选择效果
2015/11/06 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
Python2.x与Python3.x的区别
2016/01/14 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
百度JavaScript笔试题
2015/01/15 面试题
营业经理岗位职责
2013/11/10 职场文书
冬季施工防火方案
2014/05/17 职场文书
关于环保的标语
2014/06/13 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
为自己工作观后感
2015/06/11 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python