鼠标拖拽吸附效果

JavaScript鼠标拖动+自动吸附实例

学了几天的JavaScript,自己动手做了一个简单的鼠标拖动的实例,拖动过程中科自动检测与目标容器的距离,在一定的距离范围内可以自动将被拖动的元素加入到目标容器中,希望对开始学习javascript的童鞋有用……

先看看效果图(Chrome、FireFox、Opera、Safari测试通过):

效果图(虚线框:目标对象    蓝色填充透明框:临时拖动对象   红色填充框:被拖动对象)

主要思路:首先给要拖动的div添加一个鼠标按下(mousedown)事件、给document对象添加鼠标移动(mousemove)事件和鼠标弹起(mouseup)事件。鼠标开始移动的时候创建一个临时的拖动对象(temp),移动过程中改变临时拖动目标的位置,鼠标释放时将被拖动的div(elem)的位置设置为临时拖动目标temp的位置,然后移出临时拖动目标。移动过程中,同时还检测了拖动的对象和目标div的位置关系,如果碰撞(可以设置吸附的范围),则自动吸附(将被拖动的对象加入到目标对象中),需要说明的是:这里简单起见,并没有真正的把被拖动对象加入到目标对象中,只是设置了被拖动对象的位置。

鼠标按下时:获取被拖动元素的位置和鼠标按下的位置,设置拖动的标志(isDrag)值为true。

复制代码
elem.onmousedown = function(event){//鼠标按下isDrag = true;startX = parseInt(this.style.left||getCSSValue(this,'left'));startY = parseInt(this.style.top||getCSSValue(this,'top'));mX = event.pageX;mY = event.pageY;};
复制代码

鼠标移动时:如果isDrag为true,并且temp对象不存在,则创建temp对象,并根据鼠标的位置计算并设置temp的位置。

复制代码
document.onmousemove = function(event){//鼠标移动this.innerHTML = 'Mouse Position('+event.pageX+','+event.pageY+')';if(isDrag){//当前正在移动if(temp == undefined){//temp临时拖动目标不存在temp = document.createElement('div');temp.id = 'drag';temp.className = 'temp';document.body.appendChild(temp);//将temp临时拖动目标添加到页面中}//改变位置temp.style.left = (startX + event.pageX - mX) + 'px';temp.style.top = (startY + event.pageY - mY) + 'px';//检测是否在目标范围内if(checkIntersect(temp,$('target'),20)){//在范围内$('target').style.border = '2px #F00 dashed';$('target').style.webkitAnimationName = 'light';//闪烁动画$('target').style.webkitAnimationDuration = '1s';$('target').style.webkitAnimationDelay = '0.5s';$('target').style.webkitAnimationIterationCount = '100';}else{//不在范围内$('target').style.border = '2px #09F dashed';$('target').style.webkitAnimationName = '';}}};
复制代码

说明:这里的mousemove事件并不是添加到被拖动对象(elem)上面,如果添加到elem上面,那么鼠标如果移动太快一旦鼠标离开了elem对象,那么就会出现问题。

鼠标释放时:检测碰撞结果,根据情况设置被拖动对象(elem)的位置,如果以碰撞,则根据目标div的位置设置被拖动对象(elem)的位置,否则根据temp的位置来设置被拖动对象(elem)的位置;

复制代码
document.onmouseup = function(){//鼠标释放isDrag = false;if(checkIntersect(temp,$('target'),20)){elem.style.left=$('target').offsetLeft+'px';elem.style.top=$('target').offsetTop+'px';}else{elem.style.left=temp.offsetLeft+'px';elem.style.top=temp.offsetTop+'px';}document.body.removeChild(temp);//移出临时拖动目标temp = null;$('target').style.border = '2px #09F dashed';$('target').style.webkitAnimationName = '';//取消闪烁};
复制代码

=======================================================

用到的其他函数:在设计过程中,我们需要或许某个元素样式的一些值,如果我们采用行内式(即将样式写在元素标签里面的style属性里面),我们可以采用“obj.style.left”类似这样的语法来或许,但是如果我们的样式采用了内嵌式(将CSS写在<head>与</head>之间,并且用<style>和</style>标记进行声明)或者链接式(用类似这样的<link href="css.css" type="text/css" rel="stylesheet">方式导入外部样式表)、导入式(采用import语句),我们就无法从上面的方式中获取样式的相关值,但是我们可以用其他的方法:IE下元素有currentStyle对象,其他浏览器采用document.defaultView.getComputedStyle()方法,这样可以获取样式属性的值。代码如下:

复制代码
function getCSSValue(obj,key){//获取元素CSS值if(obj.currentStyle){//IEreturn obj.currentStyle[key];    }else{//!IEreturn document.defaultView.getComputedStyle(obj,null)[key];}}
复制代码

另外,检测碰撞的函数;

复制代码
function checkIntersect(obj1,obj2,distance){//检测碰撞,distance为吸附的范围var left1 = obj1.offsetLeft;var top1 = obj1.offsetTop;var left2 = obj2.offsetLeft;var top2 = obj2.offsetTop;var width1 = obj1.offsetWidth;var height1 = obj1.offsetHeight;var width2 = obj2.offsetWidth;var height2 = obj2.offsetHeight;return (((left1-left2>=0&&left1-left2<width2+distance)||(left2-left1>=0&&left2-left1<width1+distance))&&((top1-top2>=0&&top1-top2<height2+distance)||(top2-top1>=0&&top2-top1<height1+distance)));}
复制代码

 

总结:这里面主要用到了javascript鼠标事件,简单的DOM节点操作,还有css3的一些新的东西,比如动画(animation)、圆角(border-radius)、阴影(box-shadow)等知识。

转载于:https://www.cnblogs.com/wu-hou/p/6739498.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php修改mysql数据库中的表格,如何修改mysql数据库表?

修改mysql数据库表的方法&#xff1a;使用“ALTER TABLE”语句&#xff0c;可以改变原有表的结构&#xff0c;例如增加字段或删减字段、修改原有字段数据类型、重新命名字段或表、修改表字符集等&#xff1b;语法“ALTER TABLE [修改选项]”。修改数据表的前提是数据库中已经存…

微软最新GDI漏洞MS08-052安全解决方案

微软最新GDI漏洞MS08-052安全解决方案 Simeon微软于九月九日凌晨爆出有史以来最大的安全漏洞MS08-052&#xff0c;通过该漏洞&#xff0c;攻击者可以将木马藏于图片中&#xff0c;网民无论是通过浏览器浏览、还是用各种看图软件打开、或者在即时聊天窗口、电子邮件、Office文档…

DEM轨迹后处理

方法一&#xff1a;直接在paraview中显示 首先在输出颗粒信息的时候保存global ID&#xff1a;然后在paraview中导入vtp数据&#xff08;不要导入pvd&#xff09;&#xff0c;并使用Temporal Particle To Pathlines这个filter&#xff08;可以直接ctrlspace调出搜索框搜索&…

Oracle的JDBC Url的几种方式

1.普通SID方式jdbc:oracle:thin:username/passwordx.x.x.1:1521:SID2.普通ServerName方式 jdbc:Oracle:thin:username/password//x.x.x.1:1522/ABCD3.RAC方式jdbc:oracle:thin:(DESCRIPTION(ADDRESS_LIST(ADDRESS(PROTOCOLTCP)(HOSTx.x.x.1)(PORT1521))(ADDRESS(PROTOCOLTCP)(H…

leetcode945. 使数组唯一的最小增量(排序)

给定整数数组 A&#xff0c;每次 move 操作将会选择任意 A[i]&#xff0c;并将其递增 1。 返回使 A 中的每个值都是唯一的最少操作次数。 示例 1: 输入&#xff1a;[1,2,2] 输出&#xff1a;1 解释&#xff1a;经过一次 move 操作&#xff0c;数组将变为 [1, 2, 3]。 代码 …

数据科学 python_如何使用Python为数据科学建立肌肉记忆

数据科学 pythonby Zhen Liu刘震 首先&#xff1a;数据预处理 (Up first: data preprocessing) Do you feel frustrated by breaking your data analytics flow when searching for syntax? Why do you still not remember it after looking up it for the third time?? It…

oracle 管道通信,oracle管道化表函数

转自&#xff1a;http://pengfeng.javaeye.com/blog/260360在我所做过和参与的大多数项目中,都会有用户提出的复杂的一些统计报表之内的功能要求,根据统计的复杂程度、效率及JAVA程序调用的方便性方面考虑,主要总结出以下几种方案&#xff1a; 1、SQL语句 该方案只能实现一些相…

ebtables之BROUTING和PREROUTING的redirect的区别

ebtables和iptables实用工具都使用了Netfilter框架&#xff0c;这是它们一致的一方面&#xff0c;然而对于这两者还真有一些需要联动的地方。很多人不明白ebtales的broute表的redirect和nat表PREROUTING的redirect的区别&#xff0c;其实只要记住两点即可&#xff0c;那就是对于…

LVS的四种模式的实现

LVS 是四层负载均衡&#xff0c;也就是说建立在 OSI 模型的第四层——传输层之上&#xff0c;传输层上有我们熟悉的 TCP/UDP&#xff0c;LVS 支持 TCP/UDP 的负载均衡。LVS 的转发主要通过修改 IP 地址&#xff08;NAT 模式&#xff0c;分为源地址修改 SNAT 和目标地址修改 DNA…

MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

1、MyISAM&#xff1a;默认表类型&#xff0c;它是基于传统的ISAM类型&#xff0c;ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写&#xff0c;它是存储记录和文件的标准方法。不是事务安全的&#xff0c;而且不支持外键&#xff0c;如果执行大量的sel…

leetcode557. 反转字符串中的单词 III

给定一个字符串&#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例&#xff1a; 输入&#xff1a;“Let’s take LeetCode contest” 输出&#xff1a;“s’teL ekat edoCteeL tsetnoc” 代码 class Solution {public St…

linux命令数据盘分多个区,pvmove命令 – 移动物理盘区

pvmove命令的作用是可以将源物理卷上的物理盘区移动到一个或多个其他的目标物理卷。使用pvmove命令时可以指定一个源日志或卷。在这种情况下&#xff0c;只有逻辑卷使用的区才会被移动到目标物理卷上的空闲或指定的区。如果没有指定的物理卷&#xff0c;则使用卷组的默认规则分…

spanning-tree extend system-id

spanning-tree extend system-id 在交换机上启用extended-system ID 特征使其支持 1024 MAC 地址, 在全局模式下使用 spanning-tree extend system-id命令.禁用时前面加 no。 spanning-tree extend system-id no spanning-tree extend system-id 命令用法 在不提供 1024 MAC 地…

leetcode841. 钥匙和房间(bfs)

有 N 个房间&#xff0c;开始时你位于 0 号房间。每个房间有不同的号码&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;…&#xff0c;N-1&#xff0c;并且房间里可能有一些钥匙能使你进入下一个房间。 在形式上&#xff0c;对于每个房间 i 都有一个钥匙列表 rooms[i]&a…

Codeforces 235C Cyclical Quest (后缀自动机)

题目链接: https://codeforces.com/contest/235/problem/C 题解: 对大串建后缀自动机 对询问串复制拆环。这里一定要注意是复制一个循环节不是复制整个串&#xff01;循环节是要整除的那种 然后要做的实际上是在大串上跑&#xff0c;每经过一个点求出当前的最长公共子串&#x…

泛型型协变逆变_Java泛型类型简介:协变和逆变

泛型型协变逆变by Fabian Terh由Fabian Terh Java泛型类型简介&#xff1a;协变和逆变 (An introduction to generic types in Java: covariance and contravariance) 种类 (Types) Java is a statically typed language, which means you must first declare a variable and …

安卓系统换成linux系统软件,将旧安卓手机打造成“简易linux”机器,并部署AdGuardHome...

从原教程的安装Linux Deploy 完成后&#xff0c;在配置 Linux下载镜像的一些东西时有些许出入。首先&#xff0c;我是用的下载源地址是 http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports 清华的源挺好用的。 其他有出入的配置如图(记得把源地址改清华的&#xff0c;华中科大…

let与expr命令的用法与实战案例

let命令的用法 格式&#xff1a; let 赋值表达式 【注】let赋值表达式功能等同于&#xff1a;&#xff08;赋值表达式&#xff09; 例子&#xff1a;给自变量i加8 12345678[rootXCN ~]# i2 [rootXCN ~]# let ii8 [rootXCN ~]# echo $i 10[rootXCN ~]# ii8 #去掉let定义 [root…

在使用ToolBar + AppBarLayout,实现上划隐藏Toolbar功能,遇到了一个坑。

问题&#xff1a;Android5.0以下版本Toolbar不显示沉浸式状态栏&#xff0c;没有这个问题&#xff0c;但是5.0以上版本&#xff0c;就出现了莫名其妙的阴影问题&#xff0c;很是头疼。 分享一下我的解决方案&#xff1a; 在AppBarLayout中加一个属性&#xff1a; app:elevation…

leetcode1476. 子矩形查询

请你实现一个类 SubrectangleQueries &#xff0c;它的构造函数的参数是一个 rows x cols 的矩形&#xff08;这里用整数矩阵表示&#xff09;&#xff0c;并支持以下两种操作&#xff1a; updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) 用 new…