js实现碰撞检测


Posted in Javascript onJanuary 29, 2021

本文实例为大家分享了js实现碰撞检测的具体代码,供大家参考,具体内容如下

js实现碰撞检测

js实现碰撞检测

代码:

<!DOCTYPE html>
<html lang="en">
 
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  div {
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    left: 0px;
    margin: auto;
    width: 300px;
    height: 300px;
    background-color: green;
  }
  
  span {
    position: absolute;
    top: 0px;
    left: 0px;
    display: block;
    width: 100px;
    height: 100px;
    background-color: rgb(10, 151, 233);
  }
</style>
 
<body>
  <div></div>
  <span></span>
  <script>
    var div = document.getElementsByTagName('div')[0];
    var span = document.getElementsByTagName('span')[0];
    span.onmousedown = function(e) {
      // 事件对象兼容
      e = window.event || e;
      // 添加全局捕获
      if (span.setCapture) {
        span.setCapture();
      }
      // 鼠标按下获取鼠标距离页面左侧和顶部距离
      var x = e.clientX;
      var y = e.clientY;
      // 元素距离页面左侧和顶部距离
      var elex = span.offsetLeft;
      var eley = span.offsetTop;
      // 鼠标距离元素距离 =鼠标距离页面距离 -元素距离页面距离
      var X = x - elex;
      var Y = y - eley;
      document.onmousemove = function(e) {
        // 鼠标移动 获取鼠标距离页面距离
        // 事件对象兼容
        e = window.event || e;
        var movex = e.clientX;
        var movey = e.clientY;
        // 元素的left和top值 =鼠标距离页面距离 -鼠标距离元素距离
        var leftx = movex - X;
        var lefty = movey - Y;
        /*----------------------------------------------------------*/
        // 碰撞检测
        // 1.左侧安全距离 =大盒子距离页面左侧距离 -小盒子占位宽
        var safeleft = div.offsetLeft - span.offsetWidth;
        // 2.右侧安全距离 大盒子距离页面左侧距离 +大盒子占位宽
        var saferight = div.offsetLeft + div.offsetWidth;
        // 3.上侧安全距离 =大盒子距离页面顶部距离 -小盒子占位高
        var safetop = div.offsetTop - span.offsetHeight;
        // 4. 下侧安全距离 = 大盒子距离页面顶部距离 + 大盒子占位高
        var safebottom = div.offsetTop + div.offsetHeight;
 
        if (leftx < safeleft || leftx > saferight || lefty < safetop || lefty > safebottom) {
          div.style.background = 'green';
        } else {
          div.style.background = 'red';
        }
 
        /*----------------------------------------------------------*/
 
        // 边界值
        // 左
        if (leftx <= 0) {
          leftx = 0;
        }
        // 上
        if (lefty <= 0) {
          lefty = 0;
        }
        // 右
        var rightx = document.documentElement.clientWidth - span.offsetWidth;
        if (leftx >= rightx)
          leftx = rightx;
        // 下
        var righty = document.documentElement.clientHeight - span.offsetHeight;
        if (lefty >= righty) {
          lefty = righty;
        }
 
 
        span.style.left = leftx + 'px';
        span.style.top = lefty + 'px';
      }
      document.onmouseup = function() {
 
          document.onmousemove = null;
          if (span.releaseCapture) {
            span.releaseCapture();
          }
 
 
        }
        // 阻止默认事件
      return false;
    }
  </script>
</body>
 
</html>

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

Javascript 相关文章推荐
Ext.MessageBox工具类简介
Dec 10 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
jquery实现翻动fadeIn显示的方法
Mar 05 Javascript
JQuery实现级联下拉框效果实例讲解
Sep 17 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
js实现tab切换效果
Feb 16 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
vue打包之后生成一个配置文件修改接口的方法
Dec 09 Javascript
Jquery的Ajax技术使用方法
Jan 21 jQuery
JS实现的新闻列表自动滚动效果示例
Jan 30 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
Feb 15 Javascript
JS实现的字符串数组去重功能小结
Jun 17 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
Jan 29 #jQuery
vue穿梭框实现上下移动
Jan 29 #Vue.js
arcgis.js控制地图地体的显示范围超出区域自动弹回(实现思路)
Jan 28 #Javascript
vue使用transition组件动画效果的实例代码
Jan 28 #Vue.js
Bootstrap FileInput实现图片上传功能
Jan 28 #Javascript
js实现简单的倒计时
Jan 28 #Javascript
原生js实现无缝轮播图效果
Jan 28 #Javascript
You might like
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
vue实现图片上传功能
2020/05/28 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
python多线程http下载实现示例
2013/12/30 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python实现全排列的打印
2018/08/18 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
代办社保委托书范文
2014/10/06 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
优秀党员申报材料
2014/12/18 职场文书
新员工考核评语
2014/12/31 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL