原生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 相关文章推荐
JQuery 学习笔记 选择器之五
Jul 23 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
Jun 04 Javascript
取消选中单选框radio的三种方式示例介绍
Dec 23 Javascript
jquery form 加载数据示例
Apr 21 Javascript
一个JS函数搞定网页标题(title)闪动效果
May 13 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
Dec 18 Javascript
最全面的JS倒计时代码
Sep 17 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
Nov 29 Javascript
微信小程序 下拉列表的实现实例代码
Mar 08 Javascript
js实现省市级联效果分享
Aug 10 Javascript
移动前端图片压缩上传的实例
Dec 06 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 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
建立文件交换功能的脚本(一)
2006/10/09 PHP
PHP数据类型的总结分析
2013/06/13 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
js 编写规范
2010/03/03 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
vue实现登录功能
2020/12/31 Vue.js
使用SAE部署Python运行环境的教程
2015/05/05 Python
Python中List.count()方法的使用教程
2015/05/20 Python
python实现俄罗斯方块游戏
2020/03/25 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
PyQt5实现简易电子词典
2019/06/25 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
时尚圣经:The Fashion Bible
2019/03/03 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
美容院营销方案
2014/03/05 职场文书
物理学专业求职信
2014/07/04 职场文书
工作失误检讨书范文
2015/01/26 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android