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如何发送系统通知?(Notification渠道示例)  Laravel如何优化应用性能?(缓存和优化命令)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  JavaScript如何操作视频_媒体API怎么控制播放  Swift开发中switch语句值绑定模式  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何续费美橙建站之星域名及服务?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  如何用PHP工具快速搭建高效网站?  php结合redis实现高并发下的抢购、秒杀功能的实例  如何在腾讯云服务器快速搭建个人网站?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  浅述节点的创建及常见功能的实现  JS实现鼠标移上去显示图片或微信二维码  如何用搬瓦工VPS快速搭建个人网站?  香港网站服务器数量如何影响SEO优化效果?  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  如何快速搭建高效服务器建站系统?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何彻底删除建站之星生成的Banner?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel如何处理和验证JSON类型的数据库字段  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何用wdcp快速搭建高效网站?  如何快速上传建站程序避免常见错误?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  大连网站制作公司哪家好一点,大连买房网站哪个好?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  高防服务器租用指南:配置选择与快速部署攻略  大同网页,大同瑞慈医院官网?  北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  制作公司内部网站有哪些,内网如何建网站?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel如何实现文件上传和存储?(本地与S3配置)  中国移动官方网站首页入口 中国移动官网网页登录  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】