JavaScript动画-碰撞检测

▓▓▓▓▓▓ 大致介绍

  碰撞检测是指在页面中有多个元素时,拖拽一个元素会出现碰撞问题,碰撞检测是以模拟拖拽磁性吸附中的范围限定为基础的

  效果:碰撞检测

▓▓▓▓▓▓ 碰撞检测

  先来看看碰撞检测的原理

  我们想要移动红色的方块,当它在大的方块外面时,大的方块为绿色。当它碰撞到大方块时,大方块变为黑色

  我们采用9宫格的方法来进行碰撞检测

  我们只需要排除四种不碰撞的情况,剩下的就是碰撞的情况

  四种不碰撞的情况:

    1、小方块在大方块上方(小方块的底边的位置小于大方块顶边的位置) 对应区域中的1、2、3

    2、小方块在大方块下方(小方块的顶边的位置大于大方块底边的位置) 对应区域中的7、8、9

    3、小方块在大方块左边(小方块的右边的位置小于大方块左边的位置) 对应区域中的1、4、7

    4、小方块在大方块右边(小方块的左边的位置大于大方块右边的位置) 对应区域中的3、6、9

  代码:

 1                 // 记录div当前的坐标值
 2                 var L = ev.clientX - mouseBoxleft;
 3                 var T = ev.clientY - mouseBoxTop;
 4
 5                 // 记录拖拽元素的位置
 6                 var T1 = T;
 7                 var B1 = T + obj.offsetHeight;
 8                 var L1 = L;
 9                 var R1 = L + obj.offsetWidth;
10
11                 // 记录碰撞元素的位置
12                 var T2 = obj2.offsetTop;
13                 var B2 = T2 + obj2.offsetHeight;
14                 var L2 = obj2.offsetLeft;
15                 var R2 = L2 + obj2.offsetWidth;
16
17                 if(R1 < L2 || B1 < T2 || L1 > R2 || T1 > B2 ){
18                     obj2.style.background = "green";
19                 }else{
20                     obj2.style.background = "black";
21                 }

  

  完整代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>test2</title>
  6     <style>
  7         #box{
  8             width: 100px;
  9             height: 100px;
 10             background: red;
 11             position: absolute;
 12             z-index: 999;
 13         }
 14         #box2{
 15             width: 100px;
 16             height: 100px;
 17             background: yellow;
 18             position: absolute;
 19             top: 200px;
 20             left: 500px;
 21         }
 22     </style>
 23 </head>
 24 <body>
 25
 26     <div id="box"></div>
 27     <div id="box2"></div>
 28     <script>
 29     var oBox = document.getElementById(‘box‘);
 30     var oBox2 = document.getElementById(‘box2‘);
 31
 32     drag(oBox,oBox2);
 33
 34     function drag(obj,obj2){
 35         obj.onmousedown = function(ev){
 36             // 鼠标按下
 37
 38             var ev = ev || event;
 39
 40             // 获取鼠标离div得距离
 41             var mouseBoxleft = ev.clientX - this.offsetLeft;
 42             var mouseBoxTop = ev.clientY - this.offsetTop;
 43
 44             // IE浏览器,全局捕获
 45             if(obj.setCapture){
 46                 obj.setCapture();
 47             }
 48
 49             document.onmousemove = function(ev){
 50             // 鼠标按下左键并移动
 51
 52                 var ev = ev || event;
 53
 54                 // 记录div当前的坐标值
 55                 var L = ev.clientX - mouseBoxleft;
 56                 var T = ev.clientY - mouseBoxTop;
 57
 58                 // 记录拖拽元素的位置
 59                 var T1 = T;
 60                 var B1 = T + obj.offsetHeight;
 61                 var L1 = L;
 62                 var R1 = L + obj.offsetWidth;
 63
 64                 // 记录碰撞元素的位置
 65                 var T2 = obj2.offsetTop;
 66                 var B2 = T2 + obj2.offsetHeight;
 67                 var L2 = obj2.offsetLeft;
 68                 var R2 = L2 + obj2.offsetWidth;
 69
 70                 if(R1 < L2 || B1 < T2 || L1 > R2 || T1 > B2 ){
 71                     obj2.style.background = "yellow";
 72                 }else{
 73                     obj2.style.background = "black";
 74                 }
 75
 76                 // 设置div移动时,它的位置
 77                 obj.style.left = L + ‘px‘;
 78                 obj.style.top = T + ‘px‘;
 79
 80             }
 81
 82             document.onmouseup = function(){
 83             // 鼠标左键抬起
 84
 85                 document.onmousemove = document.onmouseup = null;
 86
 87                 //IE下,释放全局捕获 releaseCapture();
 88                 if ( obj.releaseCapture ) {
 89                     obj.releaseCapture();
 90                 }
 91             }
 92
 93             // 阻止默认行为
 94             return false;
 95         }
 96     }
 97
 98     </script>
 99 </body>
100 </html>
时间: 2024-10-28 23:32:02

JavaScript动画-碰撞检测的相关文章

javascript动画系列第三篇——碰撞检测

前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多,接下来使用九宫格分析法 假设黄色元素要与红色元素进行碰撞.将红色元素所处的区域分为9部分,自身处于第9部分,周围还存在8个部分.只要黄色元素进入红色元素的第9部分,就算碰撞.否则,都算未碰撞 总共分为以下5种情况: 1.处于上侧未碰撞区域——1.2.3区域 2.处于右侧未碰撞区域——3.4.5区域

javascript动画效果之缓冲动画(修改版)

在编写多块同时触发运动的时候,发现一个BUG, timer = setInterval(show, 30);本来show是一个自定义函数,当设为timer = setInterval(show(one,two), 30);时,发现show里面的参数one和two无法被导入,所以需要做以下代码改进和优化 原版的html和css代码在这里javascript动画效果之缓冲动画 js代码如下 1 <script> 2 function $(id) { 3 return typeof id === &

JavaScript动画知多少?

今天,小学生以自己浅薄的见地,在前辈大能的基础上写这篇文章,希望给大家打开一扇窥探JavaScript(以下简称JS)动画的窗户. JS如何制造出动画效果? 结合浏览器提供的 setInterval 或 setTimeout API,高频改变DOM元素的一些属性,即可创造一个肉眼可见的动画效果.一个看起来非常流畅的JS动画除了需要良好的变换算法外,与其执行宿主也是非不开的.程序写得再好,如果浏览器过于老旧,电脑CPU性能低下,也会出现卡顿,甚至卡死. 执行一个动画函数对于浏览器来说是个苦差,设置

Javascript动画效果(四)

Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下滚入的效果,那么那种效果是如何实现的呢? 首先我们我们完成该效果的html和css代码,代码如下: html部分代码: <div id="move"> <a href="#"><i><img src="images/1

JavaScript网站设计实践(三)设计有特色的主页,给主页链接添加JavaScript动画脚本

原文:JavaScript网站设计实践(三)设计有特色的主页,给主页链接添加JavaScript动画脚本 一.主页一般都会比较有特色,现在在网站设计(二)实现的基础上,来给主页添加一点动画效果. 1.这里实现的动画效果是:当鼠标悬停在其中某个超链接时,会显示出属于该页面的背景缩略图,让用户知道这个链接的页面大概内容是什么. 效果图: 2.实现这个效果的思路 (1)把主页的几个链接的背景图片缩放到150px*150px,拼成一张750*150的图片,并保存为slideshow.png,存放到ima

javascript动画系列第一篇——模拟拖拽

× 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容性问题,以及功能实现的方式,用的不是很广泛.javascript动画广泛使用的还是模拟拖拽.本文将详细介绍该内容 原理介绍 模拟拖拽最终效果和在桌面上移动文件夹的效果类似 鼠标按下时,拖拽开始.鼠标移动时,被拖拽元素跟着鼠标一起移动.鼠标抬起时,拖拽结束 所以,拖拽的重点是确定被拖拽元素是如何移动的

慕课网javascript动画特效 多透明度 源代码

慕课网javascript动画特效 多透明度 源代码<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>多物体运动</title> <style> div{ width:200px; height:100px; background:yellow; margin-bottom: 20px; filte

JavaScript动画工作原理之(完结篇)

原作者:Steven Riche 发布时间:2014年2月18日 原文链接:http://code.tutsplus.com/tutorials/javascript-animation-that-works-part-4-of-4--net-35263 翻译:子毅 --------- 将JavaScript进行到底 碎碎两句 折腾了一个多月,杂七杂八的事情加在一起,简直糟透了.博客停了大概有一个月了,从今天起一切都是新的,做好自己就OK了 ---------------------------

Win10系列:JavaScript 动画1

在应用程序中使用动画会使应用显得更加生动,进而给用户带来良好的视觉效果.例如,当用户将某个项添加到列表时,新项不会立即出现在列表中,而是采用动画形式到达相应位置,并且列表中的其他项也采用动画形式移动到新位置,以便为添加的项腾出空间.这样的动画效果能够让用户更清晰地看到变化过程,而不是只能看到变化之后的结果. 应用程序的动画效果可以使用Windows动画库来创建,开发人员无需自己编写动画效果代码即可获得Metro风格的动画外观和效果.另外还可以通过设置页面元素的style对象的相关属性来创建.下面