原生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 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
jquery 双色表格实现代码
Dec 08 Javascript
js对象数组按属性快速排序
Jan 31 Javascript
node.js中的fs.readFileSync方法使用说明
Dec 15 Javascript
JS实现可拖曳、可关闭的弹窗效果
Sep 26 Javascript
Javascript编程之继承实例汇总
Nov 28 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
DIV+CSS+jQ实现省市联动可扩展
Jun 22 Javascript
JS实现隔行换色的表格排序
Mar 27 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 Javascript
Scala解析Json字符串的实例详解
Oct 11 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.ini 配置文件的深入解析
2013/06/17 PHP
php实现无限级分类
2014/12/24 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
用javascript作一个通用向导说明
2011/08/30 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python复制文件代码实现
2013/12/23 Python
python字典多条件排序方法实例
2014/06/30 Python
手把手教你python实现SVM算法
2017/12/27 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
计算机专业推荐信范文
2013/11/20 职场文书
团队拓展活动总结
2014/08/27 职场文书
单位租房协议书范本
2014/12/04 职场文书
小学大队长竞选稿
2015/11/20 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
python读取mnist数据集方法案例详解
2021/09/04 Python