javascript实现鼠标点击页面 移动DIV


Posted in Javascript onDecember 02, 2016
<script type="text/javascript">
 //那种方式移动
 var choMove = false;
 //是否绑定过click
 var isClick = true;
 //引用DIV
 var oDiv = null;
 //引用Input
 var oInput = null;
 //封装事件绑定的通用对象
 var evnetUtil = {
  addEventHandle:function(oElement,evtype,fun){
   oElement.attachEvent?oElement.attachEvent("on"+evtype,fun):oElement.addEventListener(evtype,fun,false);
  },
  removeEventHandle:function(oElement,evtype,fun){
   oElement.detachEvent?oElement.detachEvent("on"+evtype,fun):oElement.removeEventListener(evtype,fun,false);
  }
 }
 //根据开关,来让document的Click事件绑定不同的动画函数
 var eventMove = function(event){
  var ev = event || window.event;
  choMove==true?clickMove(ev):slideMove(ev); 
 } 
 //根据鼠标点击位置移动动画一
 var clickMove = function(cev){
  var mouseX = cev.clientX;   //鼠标点击的横坐标
  var mouseY = cev.clientY;  //鼠标点击的纵坐标
   //取消document的click事件绑定的函数,以避免在动画中,击点页面会又一次触发这个动画
  evnetUtil.removeEventHandle(document,'click',eventMove);
  var setCliMove = setInterval(function(){
    var oDivLeft = oDiv.offsetLeft; //DIV在页面中的Left值;
    var oDivTop = oDiv.offsetTop; //DIV在页面中的Top值;
    /*横坐标移动的速,即每30毫秒,移动speedX距离
    *mouseX-oDivLeft当前DIV与目标点之间的距离,
    *除以5,就是将这个距离分成5份
    *分母5不变,距离越小,所以移动速度就越慢
    */
    var speedX = (mouseX-oDivLeft)/5; 
    //纵坐标移动的速度,即每30毫秒,移动speedX距离,这个speedY是变化的,距离鼠标点击的位置越近,这个值越小
    var speedY = (mouseY-oDivTop)/5; 
    /*这里必需使用向上或向下取舍的函数(Math.ceil和Math.floor)
    *因为speedX和speedY是一个变化的值,即将DIV和鼠标点击的点X坐标之间的距离,平均分成5分,
    *mouseX == oDiv.offsetLeft就永远不可能相等,就不会执行if里面的语句了,所以这将一直循环下去
    */
    oDivLeft = mouseX-oDivLeft>0?Math.ceil(oDivLeft+speedX):Math.floor(oDivLeft+speedX);
    oDivTop = mouseY-oDivTop>0?Math.ceil(oDivTop+speedY):Math.floor(oDivTop+speedY);
    console.log(oDivLeft);
    //用当位置的TOP或left值,去加上每一次,即每30毫秒移动的距离,就得到新的坐标
    oDiv.style.left = oDivLeft + "px";
    oDiv.style.top = oDivTop + "px";
    //如果到达鼠标点击的位置
    if(mouseX == oDiv.offsetLeft && mouseY == oDiv.offsetTop){
     //清除这个运动动画
     clearInterval(setCliMove);
     //恢复document的click绑定的事件
     evnetUtil.addEventHandle(document,'click',eventMove);
    } 
  },30);
 } 
 //根据标鼠标轨迹移动动画二
 var slideMove = function(cev){
  alert("正在制做当中……");
 } 
 //绑定事件,改变input状态(事件对象,input对象,标识点击的那个Input)
 var binds = function(cev,oElem,index){
  //防止多次点击同一个Input
  if(oElem.className == ""){
   oElem.value=oElem.value+"(已激活)"
   oElem.className = "cur";
  }
  //点击不同的input显示不同文字和启用不同动画开关
  if(index==0){
   oInput[1].value = "根据标鼠标轨迹移动";
   oInput[1].className = "";
   choMove = true;
  }else{
   oInput[0].value = "根据鼠标点击位置移动";
   oInput[0].className = "";
   choMove = false;
  }
  //只绑document定一次,再次点击无需绑定,只需要启用不同的动画模式
  if(isClick){
   evnetUtil.addEventHandle(document,'click',eventMove);
   isClick = false;
  }
  //防止冒泡
  cev.stopPropagation ?cev.stopPropagation() : (cev.cancelBubble=true);
 }
 window.onload = function(){
  oInput = document.getElementsByTagName("input");
  oDiv = document.getElementsByTagName("div")[0];

  oInput[0].onclick = function(event){
   var This = this;
   var ev = event || window.event;
   binds(ev,This,0); 
  }
  
  oInput[1].onclick = function(event){
   var This = this;
   var ev = event || window.event;
   binds(ev,This,1);
  }
 } 
</script>

一、原理分析:

1.怎么移动?

要移动DIV到指到的坐标点(X,Y),其实质,就是同时改变DIV的DIV.style.top 和 DIV.style.left 这两个值;

2.如何看到移动?

因为要有移动效果,而不是突然间就将某个DIV的TOP和LEFT值变化为另一个值,所以就要用到:

setInterval这个阻塞函数,让函数的执行,延迟,这样就能看到移动效果。(只要是有的运动和移动都要用到这个函数);

二、现实思路

1.速度

有运动,肯定就离不开速度这个概念,在这个例子中,速度是变化的,即DIV和鼠标点击的坐标,之间的距离越大,这个速度应该越快。反之速度越慢。以保证在同一个时间内,完成不同距离的运动。

所以 速度=距离/固定值;

这样,当距离越大,速度越快。反之越小

2.如何判断DIV移动到了鼠标点击的点?

即:DIV的LEFT值和TOP值,与鼠标点击时的X和Y值都相等。

在这个例子中。要使用函数(Math.ceil和Math.floor) 具体可以看代码中的注释

总结:写这个的时候想的太复杂,所以卡了好半天。思路一定要理清,再动手。

以上就是本文的全部内容,希望对大家有所帮助,谢谢对三水点靠木的支持!

Javascript 相关文章推荐
JQuery下关于$.Ready()的分析
Dec 13 Javascript
常用Extjs工具:Extjs.util.Format使用方法
Mar 22 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
Aug 22 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 Javascript
javascript 广告移动特效的实现代码
Jun 25 Javascript
微信小程序 使用canvas制作K线实例详解
Jan 12 Javascript
JavaScript实现简单的双色球(实例讲解)
Jul 31 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
详解如何使用babel进行es6文件的编译
May 29 Javascript
浅谈node.js中间件有哪些类型
Apr 29 Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 #Javascript
bootstrap使用validate实现简单校验功能
Dec 02 #Javascript
在网页中插入百度地图的步骤详解
Dec 02 #Javascript
PHP获取当前页面完整URL的方法
Dec 02 #Javascript
jQuery插件fullPage.js实现全屏滚动效果
Dec 02 #Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
Dec 02 #Javascript
jquery实现图片列表鼠标移入微动
Dec 01 #Javascript
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python科学计算之Pandas详解
2017/01/15 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
Python画图高斯分布的示例
2019/07/10 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
Python字典实现伪切片功能
2020/10/28 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
小学生学习感言
2014/03/10 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
离婚协议书范文
2015/01/26 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电