js 鼠标拖拽元素
基础知识
event.clientX、event.clientY
鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性
event.pageX、event.pageY
类似于event.clientX、event.clientY,但它们使用的是文档坐标而非窗口坐标。这2个属性不是标准属性,但得到了广泛支持。IE事件中没有这2个属性。
event.offsetX、event.offsetY
鼠标相对于事件源元素(srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性。
event.screenX、event.screenY
鼠标相对于用户显示器屏幕左上角的X,Y坐标。标准事件和IE事件都定义了这2个属性

实现效果
web qq页面上的元素基本都可以拖拽,交互性很强,增强了体验,拖拽功能带来的好处显而易见。
思路:
用户点击元素,然后拖动,实际上是onmousedown和onmousemove两个函数的嵌套。
1、用户点击元素。需要记录到鼠标点击位置的距离,因为在拖动过程中最好是保持鼠标和元素的相对距离,而不是鼠标一直处于元素左上角,用过拖拽应该都能体会。
由于没有斜线的说法,所以是保存横向距离distX和纵向距离distY两个变量。
2、拖动元素。这时候就要发挥之前保存的距离了,元素的位置是由left和top决定的,在运动过程中是不断变化的,是需要我们计算的,计算方法就是:鼠标的位置-元素边距到鼠标的距离。就成功可以拖动了。
3、虽然可以拖动了,但是元素可能会被疯狂的用户拖出可视区,可能就找不到了,所以我们最好加一个限定,不能拖出可视区。
左边距的控制好说,判断使left=0;右边距=0是一个想法,具体的实现还是要根据左边距来控制,首先得到可视区宽度(document.documentElement.clientWidth),减去元素宽度就是元素的left值。
css
<style type="text/css">
#div{
background: red;
width: 100px;
height: 100px;
position: absolute;
}
</style>
<script type="text/javascript">
window.onload=function(){
var oDiv=document.getElementById('div');
var distX=0;
var distY=0;
oDiv.onmousedown=function(ev){
var oEvent=ev||event;
distX=oEvent.clientX-oDiv.offsetLeft; //获取边界到鼠标的距离
distY=oEvent.clientY-oDiv.offsetTop;
document.onmousemove=function(ev){
var oEvent=ev||event;
var x=oEvent.clientX-distX;
var y=oEvent.clientY-distY;
if(x<0){
x=0;
}
if(y<0){
y=0;
}
if(x>(document.documentElement.clientWidth-oDiv.offsetWidth))
{
x=document.documentElement.clientWidth-oDiv.offsetWidth;
}
oDiv.style.left=x+'px'; //根据鼠标位置相对定位,得到left,top值
oDiv.style.top=y+'px';
}
document.onmouseup=function(){
document.onmousemove=null;
document.onmouseup=null;
}
} }
</script>
<body>
<div id="div"></div>
</body>
js 鼠标拖拽元素的更多相关文章
- js 鼠标拖拽元素移动
<!DOCTYPE html><html> <head> <title> </title> <style media="sc ...
- js鼠标拖拽
html <div id="box"> </div> css ;;} #box{width:200px;height:200px;background:cy ...
- js 鼠标拖拽效果实现
效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 关于js拖拽功能,拖拽元素的position:fixed;left:0;right:0;样式引起左右拖动元素会出现落后鼠标移动距离的问题
被拖拽元素的样式如果为:position:fixed;left:0;right:0;(当时是为了让fixed定位的元素水平居中加的left:0;right:0;避免js动态计算定位的麻烦)时左右拖动会 ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- js - 面向对象 - 小案例:轮播图、随机点名、选项卡、鼠标拖拽
面向对象 对象 : (黑盒子)不了解内部结构, 知道表面的各种操作. 面向对象 : 不了解原理的情况下 会使用功能 . 面向对象是一种通用思想,并非编程中能用,任何事情都能用. 编程语言的面向对象的特 ...
- JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
这几天在做一个拖拽元素的附加功能,就是对齐到网格,实际上就是确定好元素的初始位置,然后拖拽元素时,每次移动固定的距离.让元素都可以在网格内对齐.先上效果图,然后在详细说明一下细节问题 做了一个gif图 ...
- juqery 拖拽元素
转自 http://www.cnblogs.com/holbrook/archive/2012/03/13/2394111.html 因为怕博主删除博客,所以复制过来! JQuery UI是JQue ...
- jQuery 鼠标拖拽排序
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
随机推荐
- BZOJ 1195: [HNOI2006]最短母串
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1346 Solved: 450[Submit][Status ...
- binary search模板总结
二分查找算法是最常用的一种高效算法,所以本文将常见的情形做一个总结,得到一个二分查找的模板,方便应对各种二分查找中的问题. 当前有一个有序的数列: 1, 5, 9 [每个数字都是唯一的] 1, 2, ...
- 洛谷 P4137 Rmq Problem /mex 解题报告
P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...
- MySql 主辅-一主多辅
MySql 主辅-一主多辅mysql tar源码包安装 骤及过程,以供参考 系统是centos6.x .注意:此安装是默认CentOS下已经安装了最新工具包,比如GNU make, GCC, Perl ...
- linux 用户及用户组管理
主要分为以下三部分: 1. 用户账号的添加.修改及删除 2. 用户口令的管理 3. 用户组管理 用户管理 1.添加新用户账号 $ useradd 选项 用户名 选项: -c comment 指定一段注 ...
- Redis中的简单动态字符串
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SD ...
- Looper Handler Mssage
1. 一个Handler只有一个队列;2. 在调用Handler.post(Runnable runnable)方法时,会将runnable封装成一个Message;3. 在队列执行时,会判断当前的M ...
- Memcached在Windows下的配置和使用
Memcached学习笔记---- 安装和配置 首先,下载Memcached相关文件. 打开控制台,进入Memcached主程序目录,输入: memcached.exe -d install //安装 ...
- PD915温度太高,通过设置BIOS降底CPU的核心电压来降温。
由于对电脑配置不是很懂,去年去配了台电脑,用的CPU是PD915,不用不知道,一用吓一跳. PD915在冬天的时候,运行起来温度大概在30多度,感觉很正常. 可是一到了夏天,温度就升到了70到80度之 ...
- json模块和pickle模块(二十二)
之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型, json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用 ...