JS碰撞运动实现方法详解

发布时间 - 2026-01-10 21:51:10    点击率:

本文实例分析了JS碰撞运动实现方法。分享给大家供大家参考,具体如下:

描述:撞到目标点弹回来(速度反转)

一、无重力的漂浮div

var div1=document.getElementById("div1");
var iSpeedX=6;
var iSpeedY=8;
setInterval(function(){
  var l=div1.offsetLeft+iSpeedX;
  var t=div1.offsetTop+iSpeedY;
  if(t>=document.documentElement.clientHeight-div1.offsetHeight){
    iSpeedY*=-1; //速度反向
    t=document.documentElement.clientHeight-div1.offsetHeight; //超出下边界时,把它拉回到下边界,不然右边滚动条会闪动出现一下
  }
  else if(t<=0){
    iSpeedY*=-1;
    t=0;
  }
  if(l>=document.documentElement.clientWidth-div1.offsetWidth){
    iSpeedX*=-1;
    l=document.documentElement.clientWidth-div1.offsetWidthl;
  }
  else if(l<=0){
    iSpeedX*=-1;
    l=0;
  }
  div1.style.left=l+'px';
  div1.style.top=t+'px';
},30);

二、碰撞+重力

所谓重力就是Y轴的速度不断增加

setInterval(function(){
  iSpeedY+=3;
  var l=div1.offsetLeft+iSpeedX;
  var t=div1.offsetTop+iSpeedY;
  if(t>=document.documentElement.clientHeight-div1.offsetHeight){
    iSpeedY*=-0.8;
    iSpeedX*=0.8; //横向速度也要变慢,否则碰到地面时会停不下来
    t=document.documentElement.clientHeight-div1.offsetHeight;
  }
  else if(t<=0){
    iSpeedY*=-1;
    iSpeedX*=0.8;
    t=0;
  }
  if(l>=document.documentElement.clientWidth-div1.offsetWidth){
    iSpeedX*=-0.8;
    l=document.documentElement.clientWidth-div1.offsetWidthl;
  }
  else if(l<=0){
    iSpeedX*=-0.8;
    l=0;
  }
  if(Math.abs(iSpeedX)<1){ //解决小数的问题,因为假如速度是小数,正的没问题,100(iSpeed=0.5)-->100.5-->100,负的100(iSpeed=-0.5)--->99.5-->99,可能会出现x轴反向时滑行
    iSpeedX=0;
  }
  if(Math.abs(iSpeedY)<1){
    iSpeedY=0;
  }
  div1.style.left=l+'px';
  div1.style.top=t+'px';
},30);

三、碰撞+重力+拖拽

window.onload=function ()
{
  var oDiv=document.getElementById('div1');
  var lastX=0;
  var lastY=0;
  oDiv.onmousedown=function (ev)
  {
    var oEvent=ev||event;
    var disX=oEvent.clientX-oDiv.offsetLeft;
    var disY=oEvent.clientY-oDiv.offsetTop;
    document.onmousemove=function (ev)
    {
      var oEvent=ev||event;
      var l=oEvent.clientX-disX;
      var t=oEvent.clientY-disY;
      oDiv.style.left=l+'px';
      oDiv.style.top=t+'px';
      iSpeedX=l-lastX; //拖拽结束时的速度
      iSpeedY=t-lastY;
      lastX=l; //更新上一个点的位置
      lastY=t;
    };
    document.onmouseup=function ()
    {
      document.onmousemove=null;
      document.onmouseup=null;
      startMove(); //拖拽结束时执行
    };
    clearInterval(timer);
  };
};
var timer=null;
var iSpeedX=0;
var iSpeedY=0;
function startMove()
{
  clearInterval(timer);
  timer=setInterval(function (){
    var oDiv=document.getElementById('div1');
    iSpeedY+=3;
    var l=oDiv.offsetLeft+iSpeedX;
    var t=oDiv.offsetTop+iSpeedY;
    if(t>=document.documentElement.clientHeight-oDiv.offsetHeight)
    {
      iSpeedY*=-0.8;
      iSpeedX*=0.8;
      t=document.documentElement.clientHeight-oDiv.offsetHeight;
    }
    else if(t<=0)
    {
      iSpeedY*=-1;
      iSpeedX*=0.8;
      t=0;
    }
    if(l>=document.documentElement.clientWidth-oDiv.offsetWidth)
    {
      iSpeedX*=-0.8;
      l=document.documentElement.clientWidth-oDiv.offsetWidth;
    }
    else if(l<=0)
    {
      iSpeedX*=-0.8;
      l=0;
    }
    if(Math.abs(iSpeedX)<1)
    {
      iSpeedX=0;
    }
    if(Math.abs(iSpeedY)<1)
    {
      iSpeedY=0;
    }
    if(iSpeedX==0 && iSpeedY==0 && t==document.documentElement.clientHeight-oDiv.offsetHeight)
    {
      clearInterval(timer);
    }
    else
    {
      oDiv.style.left=l+'px';
      oDiv.style.top=t+'px';
    }
    document.title=iSpeedX;
  }, 30);
}

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript运动效果与技巧汇总》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。


# JS  # 碰撞  # 运动  # 原生JS实现多个小球碰撞反弹效果示例  # JS实现简单的浮动碰撞效果示例  # JS实现小球的弹性碰撞效果  # javascript实现10个球随机运动、碰撞实例详解  # js实现div色块碰撞  # 拖拽  # 结束时  # 相关内容  # 也要  # 遍历  # 把它  # 感兴趣  # 数据结构  # 给大家  # 更多关于  # 撞到  # 所述  # 程序设计  # 变慢  # 滚动条  # lt  # documentElement  # clientHeight  # offsetHeight  # left 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Windows服务器上快速搭建网站?  如何快速选择适合个人网站的云服务器配置?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  如何安全更换建站之星模板并保留数据?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel如何处理表单验证?(Requests代码示例)  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  Python文件流缓冲机制_IO性能解析【教程】  创业网站制作流程,创业网站可靠吗?  高防服务器:AI智能防御DDoS攻击与数据安全保障  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  浅谈Javascript中的Label语句  详解阿里云nginx服务器多站点的配置  Laravel如何自定义分页视图?(Pagination示例)  简单实现Android文件上传  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Firefox Developer Edition开发者版本入口  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何在阿里云高效完成企业建站全流程?  Python进程池调度策略_任务分发说明【指导】  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  制作公司内部网站有哪些,内网如何建网站?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何用景安虚拟主机手机版绑定域名建站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  如何为不同团队 ID 动态生成多个独立按钮  长沙做网站要多少钱,长沙国安网络怎么样?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  java中使用zxing批量生成二维码立牌  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  简历没回改:利用AI润色让你的文字更专业  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  怎么用AI帮你设计一套个性化的手机App图标?  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作