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使用查询手册
Mar 07 Javascript
javascript检测浏览器flash版本的实现代码
Dec 06 Javascript
chrome不支持form.submit的解决方案
Apr 28 Javascript
javascript动画算法实例分析
Jul 31 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
Oct 09 Javascript
Vue用v-for给src属性赋值的方法
Mar 03 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
May 09 Javascript
详解vue-cli下ESlint 配置说明
Sep 03 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
Ant Design moment对象和字符串之间的相互转化教程
Oct 27 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
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的变量类型和作用域详解
2014/03/12 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
安装dbus-python的简要教程
2015/05/05 Python
python中常用的九种预处理方法分享
2016/09/11 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
销售人员个人求职信
2013/09/26 职场文书
水务局局长岗位职责
2013/11/28 职场文书
家长给小学生的评语
2014/01/30 职场文书
安全标准化汇报材料
2014/02/03 职场文书
银行开业庆典方案
2014/02/06 职场文书
节约用水标语
2014/06/11 职场文书
单位介绍信格式范文
2015/05/04 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
php解析非标准json、非规范json的方式实例
2022/05/10 PHP