抛物线运动就是:当拖拽结束的时候,我们让当前的元素同时水平运动+垂直运动

在同样的移动距离下,我们鼠标移动的速度快,move方法触发的次数少,相反移动的速度慢,move方法触发的次数就多->浏览器对于每一次的move行为的触发都是由一个最小时间的。
通过观察,我们发现一个事情:水平方向我们盒子在结束拖拽的时候移动的速度和移动的距离没有必然的联系,和开始拖拽的速度也没有必然的联系,只和最后一次即将松开的那一瞬间鼠标的速度是有关系的,最后瞬间鼠标如果移动的快,我们水平运动的距离和速度也是比较大的。->获取鼠标最后一次即将松开时候的速度。
在JS盒子模型中,offsetLeft是获取当前元素的左偏移,获取到的值永远不会出现小数, 他会把真实的left值按照小数点的四舍五入进行计算
具体代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
html,body{
width:100%;
height:100%;
}
#box{
position:absolute;
top:50%;
left:50%;
width:200px;
height:200px;
background:#ff6600;
margin:-100px 0 0 -100px;
cursor:move;
/*
不知道宽高的情况下的居中
position:absolute;
top:0;
left:0;
right:0;
bottom:0;
margin:auto;
*/
}
</style>
</head>
<body>
<div id='box'>
</div>
<script>
//JS实现让当前的元素在屏幕居中的位置
var box = document.getElementById('box');
// box.style.top = ((document.documentElement.clientHeight || document.body.clientHeight)-box.offsetHeight)/2 + "px";
// box.style.left = ((document.documentElement.clientWidth || document.body.clientWidth)-box.offsetWidth)/2 + "px";
//拖拽的原理
/*
当鼠标在盒子上按下的时候,我们开始拖拽(给盒子绑定onmousemove和onmouseup),当鼠标移动的时候,我们计算盒子的最新位置
当鼠标抬起的时候说明拖拽结束了,我们的move和up就没用了,我们再把这两个方法移除
*/
box.onmousedown = down;
function down(e){
e = e || window.event;
//记录开始位置的信息
this["strX"] = e.clientX;
this["strY"] = e.clientY;
this["strL"] = parseFloat(this.style.left);
this["strT"] = parseFloat(this.style.top);
//给元素绑定移动和抬起的事件
if(this.setCapture){
this.setCapture()//把当前的鼠标和this绑定在一起
this.onmousemove = move;
this.onmouseup= up;
}else{
var _this = this;
document.onmousemove = function(e){
// move(e)//这个里面的this是window
move.call(_this,e);
}
;
document.onmouseup= function(e){
up.call(_this,e);
};
}
//当盒子运动中我们想要执行下一次拖拽,我们按下鼠标,但是由于盒子还是运动着呢,导致鼠标抓不住盒子->在按下的同时我们应该停止盒子的运动
window.clearInterval(this.flyTimer);
window.clearInterval(this.dropTimer);
}
function move(e){
e = e || window.event;
var curL = (e.clientX-this["strX"])+this["strL"];
var curT = (e.clientY-this["strY"])+this["strT"];
//边界判断
var minL = 0,minT = 0,maxL = (document.documentElement.clientWidth || document.body.clientWidth) - this.offsetWidth,maxT = (document.documentElement.clientHeight || document.body.clientHeight) - this.offsetHeight;
curL = curL < minL ? minL :(curL > maxL ? maxL : curL);
curT = curT < minT ? minT :(curT > maxT ? maxT : curT)
this.style.left = curL + "px";
this.style.top = curT + "px";
//计算我们水平方向移动的速度
/*
在浏览器最小反应时间内触发一次move,我们都记录一下当前盒子的位置,让当前的位置-上一次记录的位置=当前最后一次的偏移
*/
if(!this.pre){
this.pre = this.offsetLeft;
}else{
this.speedFly = this.offsetLeft - this.pre;
this.pre = this.offsetLeft;
}
}
function up(e){
if(this.releaseCapture){
this.releaseCapture();//把当前的鼠标和盒子解除绑定
this.onmousemove = null;
this.onmouseup= null;
}else{
document.onmousemove = null;
document.onmouseup= null;
//这样绑定的话,move和up绑定的this都是document
}
//当鼠标离开结束拖拽的时候,我们开始进行水平方向的动画运动
fly.call(this);
//当鼠标离开结束拖拽的时候,我们开始进行垂直方向的动画运动
drop.call(this);
}
//当鼠标移动过快的时候,我们的鼠标会脱离盒子,导致盒子的mousemove和mouseup事件都移除不到->"鼠标焦点丢失"
//在IE和火狐浏览器中,我们用一个方法把盒子和鼠标绑定在一起即可。
//鼠标再快也跑不出去文档:我们把mousemove和mouseup绑定给document
function fly(){
//this->当前要操作的盒子
var _this = this;
_this.flyTimer = window.setInterval(function(){
//我们运动的速度是一直在减慢的,一直到停止("指数衰减运动")
//this->window
//盒子停止运动,清除定时器:利用offsetLeft获取的值不会出现小数,对小数部分进行了四舍五入,所以我们加上或者减去一个小于0.5的速度值,其实对于盒子本身的位置并没有发生实质的改变,我们认为此阶段的盒子就停止运动了。
if(Math.abs(_this.speedFly)<0.5){
window.clearInterval(_this.flyTimer);
return;
}
_this.speedFly*=0.98;
var curL = _this.offsetLeft + _this.speedFly;
var minL = 0,maxL = (document.documentElement.clientWidth || document.body.clientWidth) - _this.offsetWidth;
if(curL>=maxL){
_this.style.left = maxL + "px";
_this.speedFly*=-1;
}else if(curL<=minL){
_this.style.left = minL + "px";
_this.speedFly*=-1;
}else{
_this.style.left = curL;
}
},10)
}
function drop(){
var _this = this;
_this.dragFlag = 0;
_this.dropTimer = window.setInterval(function(){
if(_this.dragFlag>1){//到底的时候dragFlag就大于1了
window.clearInterval(_this.dropTimer);
return;
}
_this.dropSpeed = !_this.dropSpeed ? 9.8 : _this.dropSpeed + 9.8;
//衰减
_this.dropSpeed*=0.98;
var curT = _this.offsetTop + _this.dropSpeed;
var maxT = (document.documentElement.clientHeight || document.body.clientHeight) - _this.offsetHeight;
if(curT >= maxT){// 到底了
_this.style.top = maxT + "px";
_this.dropSpeed*=-1;
_this.dragFlag++;
}else{
_this.style.top = curT + "px";
_this.dragFlag = 0;
}
})
}
</script>
</body>
</html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# js
# 弹性势能动画
# 抛物线运动
# JS抛物线动画实例制作
# JS实现的抛物线运动效果示例
# JS高仿抛物线加入购物车特效实现代码
# js绘制购物车抛物线动画
# js实现商品抛物线加入购物车特效
# JavaScript模拟重力状态下抛物运动的方法
# 基于Cesium绘制抛物弧线
# 鼠标
# 绑定
# 拖拽
# 当鼠标
# 按下
# 移除
# 都是
# 瞬间
# 四舍五入
# 是有
# 是由
# 时间内
# 这两个
# 就没
# 用了
# 火狐
# 那一
# 会把
# 比较大
# 速度快
相关文章:
Swift中switch语句区间和元组模式匹配
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
制作网站的模板软件,网站怎么建设?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何在橙子建站上传落地页?操作指南详解
内网网站制作软件,内网的网站如何发布到外网?
如何挑选优质建站一级代理提升网站排名?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
做企业网站制作流程,企业网站制作基本流程有哪些?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
建站主机CVM配置优化、SEO策略与性能提升指南
如何访问已购建站主机并解决登录问题?
建站之星2.7模板:企业网站建设与h5定制设计专题
如何通过老薛主机一键快速建站?
如何在宝塔面板中创建新站点?
宝塔面板如何快速创建新站点?
装修招标网站设计制作流程,装修招标流程?
教程网站设计制作软件,怎么创建自己的一个网站?
如何用景安虚拟主机手机版绑定域名建站?
建站之星后台管理如何实现高效配置?
开源网站制作软件,开源网站什么意思?
建站之星上传入口如何快速找到?
如何在IIS7中新建站点?详细步骤解析
如何通过西部建站助手安装IIS服务器?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
如何快速生成高效建站系统源代码?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
建站主机无法访问?如何排查域名与服务器问题
岳西云建站教程与模板下载_一站式快速建站系统操作指南
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
ppt制作免费网站有哪些,ppt模板免费下载网站?
如何选择高效可靠的多用户建站源码资源?
,sp开头的版面叫什么?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何快速重置建站主机并恢复默认配置?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
建站之星下载版如何获取与安装?
javascript中的try catch异常捕获机制用法分析
常州企业网站制作公司,全国继续教育网怎么登录?
如何构建满足综合性能需求的优质建站方案?
,怎么用自己头像做动态表情包?
建站主机服务器选型指南与性能优化方案解析
如何用免费手机建站系统零基础打造专业网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
建站之星安装模板失败:服务器环境不兼容?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。