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 相关文章推荐
JS 自动安装exe程序
Nov 30 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
js验证模型自我实现的具体方法
Jun 21 Javascript
javascript圆盘抽奖程序实现原理和完整代码例子
Jun 03 Javascript
jQuery制作简洁的多级联动Select下拉框
Dec 23 Javascript
JavaScript中length属性的使用方法
Jun 05 Javascript
node网页分段渲染详解
Sep 05 Javascript
angular写一个列表的选择全选交互组件的示例
Jan 22 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
js神秘的电报密码 哈弗曼编码实现
Sep 10 Javascript
JavaScript中this函数使用实例解析
Feb 21 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
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
php给数组赋值的实例方法
2019/09/26 PHP
深入分析PHP设计模式
2020/06/15 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python顺序执行多个py文件的方法
2019/06/29 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
初中英语教学反思
2014/01/25 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
房屋出租委托书格式
2014/09/23 职场文书
商业门面租房协议书
2014/11/25 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python