国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

JavaScript中彈性勢能動畫之關于拋物線運動的代碼案例

來源:懂視網 責編:小采 時間:2020-11-27 20:15:00
文檔

JavaScript中彈性勢能動畫之關于拋物線運動的代碼案例

JavaScript中彈性勢能動畫之關于拋物線運動的代碼案例:拋物線運動就是:當拖拽結束的時候,我們讓當前的元素同時水平運動+垂直運動在同樣的移動距離下,我們鼠標移動的速度快,move方法觸發的次數少,相反移動的速度慢,move方法觸發的次數就多->瀏覽器對于每一次的move行為的觸發都是由一個最小時間的通過觀察
推薦度:
導讀JavaScript中彈性勢能動畫之關于拋物線運動的代碼案例:拋物線運動就是:當拖拽結束的時候,我們讓當前的元素同時水平運動+垂直運動在同樣的移動距離下,我們鼠標移動的速度快,move方法觸發的次數少,相反移動的速度慢,move方法觸發的次數就多->瀏覽器對于每一次的move行為的觸發都是由一個最小時間的通過觀察

拋物線運動就是:當拖拽結束的時候,我們讓當前的元素同時水平運動+垂直運動

在同樣的移動距離下,我們鼠標移動的速度快,move方法觸發的次數少,相反移動的速度慢,move方法觸發的次數就多->瀏覽器對于每一次的move行為的觸發都是由一個最小時間的

通過觀察,我們發現一個事情:水平方向我們盒子在結束拖拽的時候移動的速度和移動的距離沒有必然的聯系,和開始拖拽的速度也沒有必然的聯系,只和最后一次即將松開的那一瞬間鼠標的速度是有關系的,最后瞬間鼠標如果移動的快,我們水平運動的距離和速度也是比較大的。->獲取鼠標最后一次即將松開時候的速度。

在JS盒子模型中,offsetLeft是獲取當前元素的左偏移,獲取到的值永遠不會出現小數, 他會把真實的left值按照小數點的四舍五入進行計算

具體代碼如下:

<!DOCTYPE html>
<html>
<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>

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript中彈性勢能動畫之關于拋物線運動的代碼案例

JavaScript中彈性勢能動畫之關于拋物線運動的代碼案例:拋物線運動就是:當拖拽結束的時候,我們讓當前的元素同時水平運動+垂直運動在同樣的移動距離下,我們鼠標移動的速度快,move方法觸發的次數少,相反移動的速度慢,move方法觸發的次數就多->瀏覽器對于每一次的move行為的觸發都是由一個最小時間的通過觀察
推薦度:
標簽: 動畫 js 代碼
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 欧美 日韩 成人 | 亚洲午夜在线视频 | 欧美 日韩 国产 在线 | 日韩精品免费观看 | 日韩欧美一区二区三区久久 | 亚洲欧美国产精品专区久久 | 中文字幕日本一本二本三区 | 欧美91精品 | 精品久久久久久亚洲 | 日韩在线激情 | 91色老99久久九九爱精品 | 国产一区二区三区在线视频 | 欧美亚洲综合激情在线 | 国内精品视频在线播放 | 亚洲精品乱码久久久久久 | 欧美国产日韩另类 | 亚洲国产精品成人综合久久久 | 日韩欧美国产综合 | 久久国产欧美日韩高清专区 | 欧美日韩精品一区二区三区视频在线 | 美女一级毛片免费观看 | 日韩专区在线观看 | 欧美一区二区三区在线视频 | 欧美色图在线观看 | 在线欧美a | 欧美日韩另类国产 | 综合毛片 | 国产一级特黄全黄毛片 | 国产成人精品aaaa视频一区 | 在线视频一二三区2021不卡 | 成人毛片在线播放 | 国产精品一页 | 亚洲 另类 在线 欧美 制服 | 欧美日韩精品一区二区三区视频在线 | 日本a级精品一区二区三区 日本不卡视频一区二区三区 | 日韩精品 电影一区 亚洲高清 | 国产丰满眼镜女在线观看 | 国产亚洲欧美一区二区 | 国产精品美女一区二区三区 | 亚洲欧美日韩国产综合高清 | 最新国产网址 |