原生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注册协议倒计时的小例子
Jun 24 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
Nov 19 Javascript
JQuery中DOM事件合成用法实例分析
Jun 13 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
angular ngClick阻止冒泡使用默认行为的方法
Nov 03 Javascript
微信小程序 slider 详解及实例代码
Jan 10 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
Oct 01 Javascript
解决Jquery下拉框数据动态获取的问题
Jan 25 jQuery
JavaScript+HTML5 canvas实现放大镜效果完整示例
May 15 Javascript
vue项目中监听手机物理返回键的实现
Jan 18 Javascript
js获取url页面id,也就是最后的数字文件名
Sep 25 Javascript
为什么node.js不适合大型项目
Apr 28 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
第十三节 对象串行化 [13]
2006/10/09 PHP
discuz安全提问算法
2007/06/06 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
php查询及多条件查询
2017/02/26 PHP
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
python实现计算倒数的方法
2015/07/11 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
加拿大大码女装购物网站:Penningtons
2020/12/26 全球购物
《三峡》教学反思
2014/03/01 职场文书
社区综治工作汇报
2014/10/27 职场文书
银行竞聘报告范文
2014/11/06 职场文书
复试通知单模板
2015/04/24 职场文书
夏洛特的网观后感
2015/06/15 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android