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获取url参数值的两种方式
Sep 10 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
Dec 13 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
使用jquery提交form表单并自定义action的方法
May 25 Javascript
JavaScript lodash常见用法系列小结
Aug 24 Javascript
基于cookie实现zTree树刷新后展开状态不变
Feb 28 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
Nov 23 Javascript
vue iView 上传组件之手动上传功能
Mar 16 Javascript
微信小程序 如何保持登录状态
Aug 16 Javascript
通过vue写一个瀑布流插件代码实例
Sep 07 Javascript
原生JS无缝滑动轮播图
Oct 22 Javascript
解决ant Design Search无法输入内容的问题
Oct 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
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
php函数连续调用实例分析
2015/07/30 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
Python3 log10()函数简单用法
2019/02/19 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
python中必要的名词解释
2019/11/20 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
详解Django中异步任务之django-celery
2020/11/05 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
如何选择使用结构还是类
2014/05/30 面试题
双语教学实施方案
2014/03/23 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
人民调解协议书范本
2014/10/11 职场文书
竞聘书的秘诀
2019/04/02 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server