实现弹窗拖拽效果的原理是:按下鼠标并移动——拖拽移动物体,抬起鼠标——停止移动。主要触发三个事件:onmousedown、onmousemove以及onmouseup;

首先搭建结构:一个宽350px、高200px的登录框

<div id="login">
<div id="box">登录窗</div>
</div>
<style>
*{
padding: 0;margin: 0;
}
#login{
width: 350px;
height: 200px;
border: 1px solid #999;
position: absolute;
cursor: move;
background-color: #fefefe;
}
#login #box{
width: 350px;
height: 30px;
background-color: #eee;
text-align: center;
line-height: 30px;
}
</style>

原生js代码实现:

window.onload=function(){
var login=document.getElementById('login'); //获取登录框ID
login.onmousedown=function(e){ //鼠标按下登录框区域时触发
var e=e||window.event; //兼容ie和firefox
var diffX=e.clientX-login.offsetLeft; //鼠标坐标值-登录框到左端的距离=鼠标到弹框左边的距离,下边同理
var diffY=e.clientY-login.offsetTop;
if(diffX>0&&diffY>0){
document.onmousemove=function(e){ //触发鼠标移动事件
login.style.left=e.clientX-diffX+'px'; //不断移动过程中,鼠标坐标值-鼠标到弹框左边的距离即登录框到页面的左边距离不断更新,实现拖拽效果
login.style.top=e.clientY-diffY+'px'; var cw=document.documentElement.clientWidth||document.body.clientWidth; //兼容ie和firefox,获取网页可视区域宽、高
var ch=document.documentElement.clientHeight||document.body.clientHeight;
if(e.clientX-diffX<0){ //看下图3情形,判断已出左边界
login.style.left='0px'; //出界都重置为0px
}else if(e.clientX-diffX>cw-login.offsetWidth){ //看下图2情形,判断已出右边界
login.style.left=cw-login.offsetWidth+'px'; //重置为左边最大值
}
if(e.clientY-diffY<0){ //与上同理
login.style.top='0px';
}else if(e.clientY>ch-login.offsetHeight){
login.style.top=ch-login.offsetHeight+'px';
}
}
}
document.onmouseup=function(){ //鼠标抬起时,鼠标按下与移动事件为null
document.onmousemove=null;
document.onmouseup=null;
}
}
}

如果有什么优化的方式也请多指教。

原生js简单实现拖拽效果的更多相关文章

  1. JavaScript实现最简单的拖拽效果

    一.一些无关痛痒的唠叨 拖拽还是挺不错的一个页面效果,我个人认为,其生命力在于可以让用户自己做一些操作,所谓自定义.例如: ①浏览器标签顺序的拖拽切换 现在基本上所有的选项卡式的浏览器都有顺序拖拽切换 ...

  2. 拖拽系列一、JavaScript实现简单的拖拽效果

        前端拖拽相关应用汇总 在现实生活中就像男孩子牵着(拖着)女朋友的手穿过马路:从马路的一端走到另一端这种场景很常见: 而在前端开发中拖拽效果也算是前端开发中应用最常见.最普遍的特效:其拖拽涉及知 ...

  3. jquery监听事件on写法以及简单的拖拽效果

    引子——关于jquery的某些写法 我先不对监听事件做解释,我们先来看下jquery的一些写法吧!我们最常用的是jquery的css()方法,相信大家都会用! 假如用css设置一个属性,我们写法如下: ...

  4. 用JS实现版面拖拽效果

    类似于这样的一个版面,点击标题栏,实现拖拽效果. 添加onmousedown事件 通过获取鼠标的坐标(clientX,clientY)来改变面板的位置 注意:面板使用绝对定位方式,是以左上角为参考点, ...

  5. 原生js实现div拖拽

    十分简单的效果. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  6. 原生js实现div拖拽+按下鼠标计时

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...

  7. 原生JS实现图片拖拽移动与缩放

    看一下最终效果,图片可以拖动,可以缩放 把代码贴出来,可以直接粘贴使用,大致的思想就是鼠标按下的时候获取当时的鼠标位置,要减去left和top值,移动的时候获取位置减去初始的值就得到移动的时候的lef ...

  8. 纯js实现DIV拖拽

    写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...

  9. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

随机推荐

  1. HBASE常用操作增删改查

    http://javacrazyer.iteye.com/blog/1186881 http://www.cnblogs.com/invban/p/5667701.html

  2. JavaWeb学习笔记(一)—— Http协议

    一.什么是HTTP协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览 ...

  3. C++_语法知识点大纲

    最近在学习C++的STL和泛型编程的部分,其中涉及到很多词汇.术语.在这里做一些梳理,以便有条理性地去理解泛型编程的设计理念. 整体上来讲编程主要有两种理念: 面向对象的编程——侧重点是数据: 泛型编 ...

  4. 【算法笔记】B1024 科学计数法

    1024 科学计数法 (20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数部分只有 1 位, ...

  5. 关于去掉输入一定数字n,在n后写入n个字符串的问题

    在输入数字n后要用一个getchar 去吃掉数字n后面跟着的回车符号,从而保证输入的字符串数是和n是保持一致的 具体实例代码如下: #include<stdio.h> #include&l ...

  6. loj 2038 / 洛谷 P4345 [SHOI2015] 超能粒子炮・改 题解

    好玩的推式子 题目描述 曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改--一种可以发射威力更加强大的粒子流的神秘装置. 超能粒子炮・改相比超能粒子炮,在威力上 ...

  7. pip不是内部或外部命令也不是可运行的程序或批处理文件的问题

    当我用windows电脑 pip install missingno 时 它居然会报pip不是内部或外部命令也不是可运行的程序或批处理文件的问题! 解决方法: 1)找到 pip.exe 所在位置,一般 ...

  8. c# MVC返回小驼峰Json(首字母小写)

    1.与前端交互时,前端总希望传过去的json字段名首字母小写,但是.net规范是首字线大写 如果就写了下面的转换方法 /// <summary> /// Poco类字段名转换成首字母小写的 ...

  9. JAVA实体类不要使用基本类型,基本类型包含byte、int、short、long、float、double、char、boolean

    由于JAVA的基本类型会有默认值,例如当某个类中存在private  int age;字段时,创建这个类时,age会有默认值0.当使用age属性时,它总会有值.因此在某些情况下,便无法实现age为nu ...

  10. llinux 目录结构 及Linux文件分享

    llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...