原生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 相关文章推荐
JS获取父节点方法
Aug 20 Javascript
js 内存释放问题
Apr 25 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
js里取容器大小、定位、距离等属性搜集整理
Aug 19 Javascript
JavaScript编程中布尔对象的基本使用
Oct 25 Javascript
第一章之初识Bootstrap
Apr 25 Javascript
详解微信小程序开发之下拉刷新 上拉加载
Nov 24 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
Dec 27 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
vue-父子组件和ref实例详解
Nov 10 Javascript
js面向对象之实现淘宝放大镜
Jan 15 Javascript
探索浏览器页面关闭window.close()的使用详解
Aug 21 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/09/30 PHP
php实现网站插件机制的方法
2009/11/10 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
详谈Python基础之内置函数和递归
2017/06/21 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
python实现字符串和数字拼接
2020/03/02 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
详解python的super()的作用和原理
2020/10/29 Python
Python可以用来做什么
2020/11/23 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
超市开学活动方案
2014/03/01 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
Opencv中cv2.floodFill算法的使用
2021/06/18 Python
Python基于百度API识别并提取图片中文字
2021/06/27 Python
js不常见操作运算符总结
2021/11/20 Javascript
Python字符串的转义字符
2022/04/07 Python