亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

打造通用的勻速運動框架(實例講解)

2019-11-19 15:09:39
字體:
來源:轉載
供稿:網友

本文,是接著上 基于勻速運動的實例講解(側邊欄,淡入淡出) 繼續的,在這篇文章的最后,我們做了2個小實例:側邊欄與改變透明度的淡入淡出效果,本文我們把上文的animate函數,繼續改造,讓他變得更加的通用和強大:

1,支持多個物體的運動

2,同時運動

3,順序運動

這三種運動方式也是jquery中animate函數支持的

一、animate函數中怎么區分變化不同的樣式?

上文中,側邊欄效果 用的animate函數 改變的是left值

function animate(obj, target, speed) { clearInterval(timer); timer = setInterval(function () { if (obj.offsetLeft == target) {  clearInterval(timer); } else {  obj.style.left = obj.offsetLeft + speed + 'px'; } }, 30);}

淡入淡出效果 用的animate函數 改變的是透明度

function animate(obj, target, speed) {  clearInterval(timer);  var cur = 0;  timer = setInterval(function () {   cur = css( obj, 'opacity') * 100;   if( cur == target ){   clearInterval( timer );   }else {   cur += speed;   obj.style.opacity = cur / 100;   obj.style.filter = "alpha(opacity:" + cur + ")";   }  }, 30);  }

而我們封裝的函數,要變成通用的,首先面臨的問題就是 這個函數要同時支持left值和透明度的變化,更通用的做法應該是要支持所有的樣式變化,比如輪播功能,他有左右滑動,也有上下滑動。

我們可以在獲取樣式和改變樣式的時候,做一下判斷就可以了,判斷分2類就能達到目的,因為其他樣式( margin, left, top, right, font-size等等 )都是px,而透明度沒有px單位

function animate(obj, attr, target, speed) { clearInterval(timer); var cur = 0; timer = setInterval(function () { if (attr == 'opacity') {  cur = css(obj, 'opacity') * 100; } else {  cur = parseInt(css(obj, attr)); } if (cur == target) {  clearInterval(timer); } else {  if (attr == 'opacity') {  obj.style.opacity = ( cur + speed ) / 100;  obj.style.filter = "alpha(opacity:" + (cur + speed) + ")";  } else {  obj.style[attr] = cur + speed + "px";  } } }, 30);}

合并之后的animate相比之前多了一個參數attr, 這個參數就是變化的樣式,obj: 變化的對象, target: 樣式需要變化到的目標值. speed: 樣式每次變化的大小

如:

oImg.onmouseover = function () {  animate(this, 'opacity', 100, 10);}

oImg是獲取到的圖片對象. 這里各參數意思如下:

this:當前圖片對象

opacity: 變化的樣式是透明度

100: 鼠標移到圖片上時,透明度變成100

10: 透明度每次在原來的基礎上加10

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>合并的運動 - by ghostwu</title> <style> img {  border: none;  opacity: 0.3;  filter: alpha(opacity:30);  position: absolute;  left: 200px; } #box {  width: 150px;  height: 300px;  background: red;  position: absolute;  left: -150px;  top: 50px; } #box div {  width: 28px;  height: 100px;  position: absolute;  right: -28px;  top: 100px;  background: green; } </style> <script> window.onload = function () {  var oImg = document.getElementById("img"),  oBox = document.getElementById("box"),  timer = null;  oImg.onmouseover = function () {  animate(this, 'opacity', 100, 10);  }  oImg.onmouseout = function () {  animate(this, 'opacity', 30, -10);  }  oBox.onmouseover = function () {  animate(this, 'left', 0, 10);  }  oBox.onmouseout = function () {  animate(this, 'left', -150, -10);  }  function animate(obj, attr, target, speed) {  clearInterval(timer);  var cur = 0;  timer = setInterval(function () {   if (attr == 'opacity') {   cur = css(obj, 'opacity') * 100;   } else {   cur = parseInt(css(obj, attr));   }   if (cur == target) {   clearInterval(timer);   } else {   if (attr == 'opacity') {    obj.style.opacity = ( cur + speed ) / 100;    obj.style.filter = "alpha(opacity:" + (cur + speed) + ")";   } else {    obj.style[attr] = cur + speed + "px";   }   }  }, 30);  }  function css(obj, attr) {  if (obj.currentStyle) {   return obj.currentStyle[attr];  } else {   return getComputedStyle(obj, false)[attr];  }  } } </script></head><body><div id="box"> <div>分享到</div></div><img src="./img/h4.jpg" alt="" id="img"/></body></html>

上述就是完整的代碼實例。

當你分別測試這兩個功能的時候:

移動到圖片上然后移出來

移動到分享到,然后移出來

這樣是沒有問題的

如果你這樣測試:

移動到 分享到,然后迅速又移動到圖片上, 這個時候你會發現 分享到 停下來了,這就不符合邏輯了! 按道理來說,鼠標移動到圖片上,相當于觸發了 “分享到” 的mouseout( 鼠標移出事件 ),那么 "分享到" 這個時候要隱藏,并不是停止。 為什么會這樣呢?因為這兩個運動共享了一個定時器,當鼠標移動到圖片上,開啟定時器的時候,把“分享到”的定時器給停了。那么再做多物體運動的時候,我們就要把定時器拆分,每個對象都要有一個定時器,怎么做呢? 非常簡單,不要定義一個簡單的timer變量,我們只要把timer加在obj對象上,那么每個對象都有一個timer屬性,就達到定時器的分離效果了

修改之后的完整代碼如下,請自行展開:

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> img {  border: none;  opacity: 0.3;  filter: alpha(opacity:30);  position: absolute;  left: 200px; } #box {  width: 150px;  height: 300px;  background: red;  position: absolute;  left: -150px;  top: 50px; } #box div {  width: 28px;  height: 100px;  position: absolute;  right: -28px;  top: 100px;  background: green; } </style> <script> window.onload = function () {  var oImg = document.getElementById("img"),  oBox = document.getElementById("box");  oImg.onmouseover = function () {  animate(this, 'opacity', 100, 10);  }  oImg.onmouseout = function () {  animate(this, 'opacity', 30, -10);  }  oBox.onmouseover = function () {  animate(this, 'left', 0, 10);  }  oBox.onmouseout = function () {  animate(this, 'left', -150, -10);  }  function animate(obj, attr, target, speed) {  clearInterval(obj.timer);  var cur = 0;  obj.timer = setInterval(function () {   if (attr == 'opacity') {   cur = css(obj, 'opacity') * 100;   } else {   cur = parseInt(css(obj, attr));   }   if (cur == target) {   clearInterval(obj.timer);   } else {   if (attr == 'opacity') {    obj.style.opacity = ( cur + speed ) / 100;    obj.style.filter = "alpha(opacity:" + (cur + speed) + ")";   } else {    obj.style[attr] = cur + speed + "px";   }   }  }, 30);  }  function css(obj, attr) {  if (obj.currentStyle) {   return obj.currentStyle[attr];  } else {   return getComputedStyle(obj, false)[attr];  }  } } </script></head><body><div id="box"> <div>分享到</div></div><img src="./img/h4.jpg" alt="" id="img"/></body></html>

至此,我們就完成了多物體運動與不同樣式的修改

二、讓animate函數支持多個樣式同時改變

比如:

oBox.onmouseover = function(){  animate( this, { "width" : 500, "height" : 400 }, 10 );}

oBox是一個div元素,animate各參數的意思:

this: 當前div元素

{width : 500, "height" : 400 } : 把寬度變成500, 高度變成400,這兩個樣式要在同一時間完成,

10: 樣式每次在原來的基礎上變化10(如width初始值200--> 210, 220, 230.....)

完整的同時運動變化 代碼:

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> div { width: 200px; height: 200px; background: red; } </style> <script> window.onload = function () {  var oBox = document.getElementById("box");  oBox.onmouseover = function(){//  animate( this, { "width" : 500, "height" : 500 }, 10 );  animate( this, { "width" : 500, "height" : 400 }, 10 );  }  function animate(obj, attr, speed) {  clearInterval(obj.timer);  var cur = 0;  obj.timer = setInterval(function () {   for ( var key in attr ) {   if (key == 'opacity') {    cur = css(obj, 'opacity') * 100;   } else {    cur = parseInt(css(obj, key));   }   var target = attr[key];   if (cur == target) {    clearInterval(obj.timer);   } else {    if (key == 'opacity') {    obj.style.opacity = ( cur + speed ) / 100;    obj.style.filter = "alpha(opacity:" + (cur + speed) + ")";    } else {    obj.style[key] = cur + speed + "px";    }   }   }  }, 30);  }  function css(obj, attr) {  if (obj.currentStyle) {   return obj.currentStyle[attr];  } else {   return getComputedStyle(obj, false)[attr];  }  } } </script></head><body> <div id="box"></div></body></html>

請自行展開這段代碼,這段代碼能夠同時運動,但是有一個問題:

div的初始寬度與高度( width : 200, height : 200)

變化步長一樣( 10 )

變化時間一樣( 每30毫秒變化一次 )

目標( width: 500, height : 400 )

你能想到什么問題嗎?( 兩個人在同一起跑線上,速度一樣, 時間一樣,但是要同時到達不同的目標,一個500, 一個400 )

答案是很明顯的,肯定是目標近的( height : 400 )那個先到達,然后把對象上的定時器關了,另一個目標更遠的( width: 500 )肯定到達不了

你可以在這句代碼下面,輸出當前的值和目標值:

var target = attr[key];console.log( key, cur, target );

輸出來的結果是:

從上圖可以看出,height已經達到了400px,但是width停在了410px,為什么不是400px ? 因為width = 400的時候, 就是( cur == 500 ) 相當于( 400 == 500 ) 不成立,所以執行了else語句,width = cur + 10 = 400 + 10 = 410,然后height到達400px停止了定時器,所以width停在了410px.

那么我們怎么解決這個問題呢?

其實也好辦,就是height = 400的時候 不要把定時器關了,應該等width = 500的時候再關閉定時器,不就在同一時間,完成了同時到達目標的效果嗎?

修改后的代碼如下:

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> div { width: 200px; height: 200px; background: red; } </style> <script> window.onload = function () {  var oBox = document.getElementById("box");  oBox.onmouseover = function(){  animate( this, { "width" : 500, "height" : 400 }, 10 );  }  function animate(obj, attr, speed) {  clearInterval(obj.timer);  var cur = 0;  obj.timer = setInterval(function () {   var bFlag = true;   for ( var key in attr ) {   if (key == 'opacity') {    cur = css(obj, 'opacity') * 100;   } else {    cur = parseInt(css(obj, key));   }   var target = attr[key];   if (cur != target) {    bFlag = false;    if (key == 'opacity') {    obj.style.opacity = ( cur + speed ) / 100;    obj.style.filter = "alpha(opacity:" + (cur + speed) + ")";    } else {    obj.style[key] = cur + speed + "px";    }   }   }   if ( bFlag ) {   clearInterval( obj.timer );   }  }, 30);  }  function css(obj, attr) {  if (obj.currentStyle) {   return obj.currentStyle[attr];  } else {   return getComputedStyle(obj, false)[attr];  }  } } </script></head><body> <div id="box"></div></body></html>

聲明一個變量,每次變化完一次( width, height )樣式 把bFlag = true, 只要在for循環中有一個沒有到達目標,bFlag的值都是false,這樣就不會關閉定時器。當兩個都到達目標,才關閉定時器.

三、順序運動

如樣式變化,按順序來,不是同時變化, 如:

oBox.onmouseover = function(){//回調函數: 把函數當做參數傳遞給另一個函數  animate( this, { 'width' : 500 }, 10, function(){    animate( this, { 'height' : 500 }, 10 );  } );}

當把width變成500px的時候,如果傳遞了回調函數, 再接著執行回調函數里面的運動

修改后的完整代碼:

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>通用的勻速運動框架 - by ghostwu</title> <style> div {  width: 200px;  height: 200px;  background: red; } </style> <script> window.onload = function () {  var oBox = document.getElementById("box");  oBox.onmouseover = function(){  //回調函數: 把函數當做參數傳遞給另一個函數  animate( this, { 'width' : 500 }, 10, function(){   animate( this, { 'height' : 500 }, 10 );  } );  }  function animate(obj, attr, speed, fn ) {  clearInterval(obj.timer);  var cur = 0;  obj.timer = setInterval(function () {   var bFlag = true;   for (var key in attr) {   if (key == 'opacity') {    cur = css(obj, 'opacity') * 100;   } else {    cur = parseInt(css(obj, key));   }   var target = attr[key];   if (cur != target) {    bFlag = false;    if (key == 'opacity') {    obj.style.opacity = ( cur + speed ) / 100;    obj.style.filter = "alpha(opacity:" + (cur + speed) + ")";    } else {    obj.style[key] = cur + speed + "px";    }   }   }   if (bFlag) {   clearInterval(obj.timer);   fn && fn.call( obj );   }  }, 30);  }  function css(obj, attr) {  if (obj.currentStyle) {   return obj.currentStyle[attr];  } else {   return getComputedStyle(obj, false)[attr];  }  } } </script></head><body><div id="box"></div></body></html>

以上這篇打造通用的勻速運動框架(實例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美放荡办公室videos4k| 91禁国产网站| xvideos国产精品| 狠狠躁天天躁日日躁欧美| 日韩国产欧美精品在线| 亚洲欧美一区二区三区久久| 中文字幕无线精品亚洲乱码一区| 日韩精品视频免费在线观看| www.精品av.com| 欧美最猛性xxxxx免费| 欧美极品欧美精品欧美视频| 精品中文视频在线| 成人免费自拍视频| 国产在线98福利播放视频| 日韩欧美高清视频| 日韩欧美主播在线| 色婷婷久久av| 中文字幕免费精品一区| 日韩av在线看| 久久久www成人免费精品张筱雨| 中文字幕一区二区精品| 在线亚洲男人天堂| 欧美中文在线观看| 一区二区成人av| 欧美片一区二区三区| 高清欧美性猛交xxxx黑人猛交| 亚洲欧美日本另类| 91久久精品美女| 久久久久久久久久久人体| 成人黄色在线播放| 久久99久国产精品黄毛片入口| 高清一区二区三区日本久| 日韩欧美在线观看视频| 国产欧美最新羞羞视频在线观看| 日韩大片免费观看视频播放| 日韩中文第一页| 欧美激情一级二级| 欧美日韩高清在线观看| 亚洲视频在线观看网站| 精品精品国产国产自在线| 91久久久久久久| 欧美日韩午夜剧场| 久久99国产精品自在自在app| 自拍偷拍亚洲一区| 亚洲午夜未满十八勿入免费观看全集| 9.1国产丝袜在线观看| 欧美性xxxx极品高清hd直播| www.欧美精品一二三区| 国产精品视频男人的天堂| 亚洲天堂一区二区三区| 日韩经典第一页| 亚洲开心激情网| 尤物99国产成人精品视频| 亚洲欧美激情视频| 欧美高清在线视频观看不卡| 亚洲肉体裸体xxxx137| 欧美日韩中文字幕在线视频| 国产精品久久久av久久久| 亚洲国产日韩欧美在线99| 91网站在线看| 亚洲国产一区自拍| 亚洲综合一区二区不卡| 亚洲福利小视频| 日韩精品在线电影| 久久影院在线观看| 欧美另类精品xxxx孕妇| 国产999在线观看| 国产精品久久久亚洲| 欧美激情亚洲综合一区| 国产精品爽爽ⅴa在线观看| 国产精品久久久久久久久久久不卡| 国产精品视频精品| 国产精品久久久久国产a级| 日韩av免费在线播放| 91av在线看| 久久天天躁日日躁| 亚洲激情第一页| 91精品国产777在线观看| 亚洲一区精品电影| 亚洲xxxx视频| 国产情人节一区| 日韩精品在线观看视频| 久久99精品久久久久久青青91| 久久亚洲影音av资源网| 国产精品久久久久久久久粉嫩av| 欧美日韩国产专区| 亚洲精品美女久久| 欧美丰满少妇xxxx| 国产综合久久久久久| 青草青草久热精品视频在线观看| 粉嫩av一区二区三区免费野| 日韩高清av一区二区三区| 久久久国产精品亚洲一区| 国产亚洲成av人片在线观看桃| 国产精品久久久久久av| 国产精品综合久久久| 国产日韩欧美综合| 久久噜噜噜精品国产亚洲综合| 国产精品久久久久久久久久久久久久| 国产日韩欧美中文| 欧美理论电影网| 欧美日韩国产专区| 懂色av影视一区二区三区| 日韩精品有码在线观看| 伊人久久久久久久久久| 一区二区国产精品视频| 5566日本婷婷色中文字幕97| 一本大道久久加勒比香蕉| 亚洲精品免费一区二区三区| 久久久爽爽爽美女图片| 国产99久久精品一区二区| 精品色蜜蜜精品视频在线观看| 亚洲成人网在线观看| 久久久久久成人精品| 亚洲欧洲在线播放| 国产精品色视频| 97精品国产97久久久久久春色| 欧洲成人在线视频| 韩剧1988免费观看全集| 欧美成人精品激情在线观看| 国产一区二区动漫| 成人亚洲激情网| 国产精品国语对白| 欧美成人免费小视频| 欧美激情网友自拍| 久久久综合免费视频| 中文字幕综合一区| 中日韩美女免费视频网站在线观看| 日韩电影中文字幕在线| 中文字幕亚洲欧美日韩2019| 国产精品99久久久久久人| 欧美精品成人在线| 国产精品免费久久久久久| 欧美激情第一页xxx| 亚洲欧美中文字幕在线一区| 欧美寡妇偷汉性猛交| 成人h片在线播放免费网站| 97在线视频免费| 国产精品海角社区在线观看| 亚洲国产高清福利视频| 欧美裸体视频网站| 亚洲欧美成人在线| 欧美性xxxxhd| 欧美老女人在线视频| 国外日韩电影在线观看| 国产91色在线| 九色精品美女在线| 91爱视频在线| 日韩高清不卡av| 国产日韩欧美另类| 亚洲在线视频福利| 日韩成人av网址| 亚洲毛片在线免费观看| 欧美日韩美女视频| 91亚洲精品在线| 欧美在线观看网站| 日韩在线观看免费高清| 成人淫片在线看| 最近2019中文字幕第三页视频| 青青久久aⅴ北条麻妃| 亚洲成人网在线| 久久久久久91香蕉国产| 亚洲欧美www| 日韩欧美精品中文字幕|