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


相关推荐: 如何在腾讯云免费申请建站?  Laravel如何使用Blade模板引擎?(完整语法和示例)  Python高阶函数应用_函数作为参数说明【指导】  MySQL查询结果复制到新表的方法(更新、插入)  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  制作企业网站建设方案,怎样建设一个公司网站?  网站建设要注意的标准 促进网站用户好感度!  Linux后台任务运行方法_nohup与&使用技巧【技巧】  如何在新浪SAE免费搭建个人博客?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Android利用动画实现背景逐渐变暗  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  独立制作一个网站多少钱,建立网站需要花多少钱?  如何快速登录WAP自助建站平台?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  nginx修改上传文件大小限制的方法  香港服务器租用每月最低只需15元?  教你用AI将一段旋律扩展成一首完整的曲子  如何在阿里云虚拟服务器快速搭建网站?  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  微信小程序 scroll-view组件实现列表页实例代码  如何用虚拟主机快速搭建网站?详细步骤解析  利用vue写todolist单页应用  如何在企业微信快速生成手机电脑官网?  如何彻底卸载建站之星软件?  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何在阿里云通过域名搭建网站?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  七夕网站制作视频,七夕大促活动怎么报名?  详解jQuery中基本的动画方法  如何用已有域名快速搭建网站?  如何在建站宝盒中设置产品搜索功能?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel API资源类怎么用_Laravel API Resource数据转换  在centOS 7安装mysql 5.7的详细教程  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  实例解析angularjs的filter过滤器  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel如何配置Horizon来管理队列?(安装和使用)  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?