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

首頁 > 編程 > JavaScript > 正文

封裝運動框架實戰左右與上下滑動的焦點輪播圖(實例)

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

在這篇文章打造通用的勻速運動框架(實例講解)中,封裝了一個勻速運動框架,我們在這個框架的基礎之上,加上緩沖運動效果,然后用運動框架來做幻燈片(上下,左右)。

緩沖運動通常有兩種常見的表現:比如讓一個div從0運動到500,一種是事件觸發的時候,速度很快, 一種是事件觸發的時候慢,然后慢慢加快.我們來實現先塊后慢的,常見的就是開車,比如剛從高速路上下來的車,就是120km/小時,然后進入匝道,變成40km/時. 或者40km/小時進入小區,最后停車,變成0km/小時. 從120km/小時->40km/小時, 或者40km->0km/小時,都是速度先塊后慢,這種運動怎么用程序來表示呢?

可以用目標距離( 500 ) - 當前距離( 200 ) / 一個系數( 比如12 ),就能達到速度由塊而慢的變化,當前距離在起點,分子(500 - 0 )最大,所以速度最大,如果當前距離快要接近500,分子最小,除完之后的速度也是最小。

<style> div{  width: 200px;  height: 200px;  background:red;  position: absolute;  left: 0px; } </style> <script> window.onload = function(){  var oBtn = document.querySelector( "input" ),  oBox = document.querySelector( '#box' ),  speed = 0, timer = null;  oBtn.onclick = function(){  timer = setInterval( function(){   speed = ( 500 - oBox.offsetLeft ) / 8;   oBox.style.left = oBox.offsetLeft + speed + 'px';  }, 30 );  } } </script></head><body> <input type="button" value="動起來"> <div id="box"></div></body>
但是,div并不會乖乖地停止在500px這個目標位置,最終卻是停在497.375px,只要查看當前的速度,當前的值就知道原因了

你會發現,速度永遠都在0.375這里停著,獲取到的當前的距離停在497px? 這里有個問題,我們的div不是停在497.375px嗎,怎么獲取到的沒有了后面的小數0.375呢?計算機在處理浮點數會有精度損失。我們可以單獨做一個小測試:

<div id="box"></div> <script> var oBox = document.querySelector( '#box' ); alert( oBox.offsetLeft ); </script>

你會發現這段代碼獲取到左偏移是30px而不是行間樣式中寫的30.2px。因為在獲取當前位置的時候,會舍去小數,所以速度永遠停在0.375px, 位置也是永遠停在497,所以,為了到達目標,我們就得把速度變成1,對速度向上取整( Math.ceil ),我們就能把速度變成1,div也能到達500


oBtn.onclick = function(){ timer = setInterval( function(){ speed = ( 500 - oBox.offsetLeft ) / 8; if( speed > 0 ) {  speed = Math.ceil( speed ); } console.log( speed, oBox.offsetLeft ); oBox.style.left = oBox.offsetLeft + speed + 'px'; }, 30 );}

第二個問題,如果div的位置是在900,也就是說從900運動到500,有沒有這樣的需求呢? 肯定有啊,輪播圖,從右到左就是這樣的啊。

<style> #box{  width: 200px;  height: 200px;  background:red;  position: absolute;  left: 900px; } </style> <script>// <![CDATA[ window.onload = function(){  var oBtn = document.querySelector( "input" ),  oBox = document.querySelector( '#box' ),  speed = 0, timer = null;  oBtn.onclick = function(){  timer = setInterval( function(){   speed = ( 500 - oBox.offsetLeft ) / 8;   if( speed > 0 ) {   speed = Math.ceil( speed );   }   oBox.style.left = oBox.offsetLeft + speed + 'px';  }, 30 );  } } // ]]></script></head><body> <input type="button" value="動起來"> <div id="box"></div></body>
最后目標停在503.5px,速度這個時候是負值,最后速度停在-0.5,對于反方向的速度,我們就要把它變成-1,才能到達目標,所以用向下取整(Math.floor)
oBtn.onclick = function(){ timer = setInterval( function(){ speed = ( 500 - oBox.offsetLeft ) / 8; if( speed > 0 ) {  speed = Math.ceil( speed ); }else {  speed = Math.floor( speed ); } console.log( speed, oBox.offsetLeft ); oBox.style.left = oBox.offsetLeft + speed + 'px'; }, 30 );}

然后我們把這個緩沖運動整合到勻速運動框架,就變成:

function css(obj, attr, value) { if (arguments.length == 3) { obj.style[attr] = value; } else { if (obj.currentStyle) {  return obj.currentStyle[attr]; } else {  return getComputedStyle(obj, false)[attr]; } }}function animate(obj, attr, fn) { clearInterval(obj.timer); var cur = 0; var target = 0; var speed = 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));  }  target = attr[key];  speed = ( target - cur ) / 8;  speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);  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 );}

有了這勻速運動框架,我們就來做幻燈片:

上下幻燈片的html樣式文件:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>slide - by ghostwu</title> <link rel="stylesheet" href="css/slide3.css" rel="external nofollow" > <script src="js/animate.js"></script> <script src="js/slide.js"></script></head><body><div id="slide"> <div id="slide-img"> <div id="img-container">  <img src="./img/1.jpg" alt="">  <img src="./img/2.jpg" alt="">  <img src="./img/3.jpg" alt="">  <img src="./img/4.jpg" alt="">  <img src="./img/5.jpg" alt=""> </div> </div> <div id="slide-nums"> <ul>  <li class="active"></li>  <li></li>  <li></li>  <li></li>  <li></li> </ul> </div></div></body></html>

slide3.css文件:

* { margin: 0; padding: 0;}li { list-style-type: none;}#slide { width: 800px; height: 450px; position: relative; margin:20px auto;}#slide-img { position: relative; width: 800px; height: 450px; overflow: hidden;}#img-container { position: absolute; left: 0px; top: 0px; height: 2250px; /*font-size:0px;*/}#img-container img { display: block; float: left;}#slide-nums { position: absolute; right:10px; bottom:10px;}#slide-nums li { float: left; margin:0px 10px; background: white; width: 20px; height: 20px; text-align: center; line-height: 20px; border-radius:10px; text-indent:-999px; opacity:0.6; filter:alpha(opacity:60); cursor:pointer;}#slide-nums li.active { background: red;}

animate.js文件:

function css(obj, attr, value) { if (arguments.length == 3) { obj.style[attr] = value; } else { if (obj.currentStyle) {  return obj.currentStyle[attr]; } else {  return getComputedStyle(obj, false)[attr]; } }}function animate(obj, attr, fn) { clearInterval(obj.timer); var cur = 0; var target = 0; var speed = 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));  }  target = attr[key];  speed = ( target - cur ) / 8;  speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);  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 );}

slide.js文件:

window.onload = function () { function Slide() { this.oImgContainer = document.getElementById("img-container"); this.aLi = document.getElementsByTagName("li"); this.index = 0; } Slide.prototype.bind = function () { var that = this; for (var i = 0; i < this.aLi.length; i++) {  this.aLi[i].index = i;  this.aLi[i].onmouseover = function () {  that.moveTop( this.index );  } } } Slide.prototype.moveTop = function (i) { this.index = i; for( var j = 0; j < this.aLi.length; j++ ){  this.aLi[j].className = ''; } this.aLi[this.index].className = 'active'; animate( this.oImgContainer, {  "top" : -this.index * 450,  "left" : 0 }); }  var oSlide = new Slide(); oSlide.bind();}

左右幻燈片只需要改下樣式即可

樣式文件:

* { margin: 0; padding: 0;}li { list-style-type: none;}#slide { width: 800px; height: 450px; position: relative; margin:20px auto;}#slide-img { position: relative; width: 800px; height: 450px; overflow: hidden;}#img-container { position: absolute; left: 0px; top: 0px; width: 4000px;}#img-container img { display: block; float: left;}#slide-nums { position: absolute; right:10px; bottom:10px;}#slide-nums li { float: left; margin:0px 10px; background: white; width: 20px; height: 20px; text-align: center; line-height: 20px; border-radius:10px; text-indent:-999px; opacity:0.6; filter:alpha(opacity:60); cursor:pointer;}#slide-nums li.active { background: red;}

js調用文件:

window.onload = function () { function Slide() { this.oImgContainer = document.getElementById("img-container"); this.aLi = document.getElementsByTagName("li"); this.index = 0; } Slide.prototype.bind = function () { var that = this; for (var i = 0; i < this.aLi.length; i++) {  this.aLi[i].index = i;  this.aLi[i].onmouseover = function () {  that.moveLeft( this.index );  } } } Slide.prototype.moveLeft = function (i) { this.index = i; for( var j = 0; j < this.aLi.length; j++ ){  this.aLi[j].className = ''; } this.aLi[this.index].className = 'active'; animate( this.oImgContainer, {  "left" : -this.index * 800 }); }  var oSlide = new Slide(); oSlide.bind();}

以上這篇封裝運動框架實戰左右與上下滑動的焦點輪播圖(實例)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品日本美女福利在线观看| 精品国产成人在线| 精品成人在线视频| 波霸ol色综合久久| 51视频国产精品一区二区| 日韩精品免费在线观看| 亚洲一区中文字幕在线观看| 97视频国产在线| 亚洲一区二区久久| 中国china体内裑精亚洲片| 精品国产一区久久久| 久久精品电影网站| 久久久这里只有精品视频| 国产精品午夜国产小视频| 欧美午夜女人视频在线| 国产欧美一区二区三区久久人妖| 国模gogo一区二区大胆私拍| 亚洲精品视频网上网址在线观看| 尤物精品国产第一福利三区| 国产91精品久久久| 91在线高清免费观看| 成人福利免费观看| 亚洲午夜女主播在线直播| 91日韩在线视频| 亚洲免费电影在线观看| 久久国产精品久久久久久久久久| 亚洲国产精品成人精品| 久久精品国产99国产精品澳门| 深夜福利亚洲导航| 国产精品偷伦一区二区| 国内免费久久久久久久久久久| 97视频在线免费观看| 91精品久久久久久久久中文字幕| 国产999在线观看| 正在播放欧美一区| 在线播放日韩欧美| 亚洲国产欧美一区二区丝袜黑人| 国产精品自产拍在线观看中文| 色伦专区97中文字幕| 国产一区二区三区丝袜| 国产精品视频中文字幕91| 国产成人精品一区二区三区| 韩国福利视频一区| 国产一区二区精品丝袜| 国产成人精品久久久| 成人在线免费观看视视频| 91亚洲精品一区| 57pao国产精品一区| 性欧美xxxx| 亚洲电影免费观看高清完整版在线观看| 96pao国产成视频永久免费| 少妇高潮久久77777| 57pao国产成人免费| www.日韩不卡电影av| 大胆欧美人体视频| 国产精品久久久久久久天堂| 日本久久中文字幕| 国产精品黄视频| 96sao精品视频在线观看| 国产在线日韩在线| 欧美一区二区.| 疯狂蹂躏欧美一区二区精品| 日韩精品免费电影| 欧美精品videosex极品1| 亚洲高清av在线| 最近2019好看的中文字幕免费| 日本道色综合久久影院| 亚洲国产精品网站| 欧美性感美女h网站在线观看免费| 久久精品国产视频| 成人性生交大片免费观看嘿嘿视频| 欧美日韩一区二区在线| 欧美日韩在线视频观看| 九九热这里只有精品免费看| 福利精品视频在线| 精品国产91久久久久久老师| 国产精品久久久久久久久粉嫩av| 久热国产精品视频| 成人信息集中地欧美| 青青草一区二区| xxxxx成人.com| 精品国产999| 国产成+人+综合+亚洲欧美丁香花| 尤物yw午夜国产精品视频| 国产亚洲精品va在线观看| 国产成人精品一区二区在线| 国产精品流白浆视频| 亚洲人线精品午夜| 久久久成人av| 亚洲色图在线观看| 久久在线观看视频| 欧美精品18videos性欧美| 国产精品稀缺呦系列在线| 久久久噜噜噜久久| 国产精品爽爽爽爽爽爽在线观看| 91久久综合亚洲鲁鲁五月天| 日日骚av一区| 亚洲香蕉伊综合在人在线视看| 中国china体内裑精亚洲片| 欧美日韩国产激情| 中文字幕国产精品| 国产精品美女www爽爽爽视频| 亚洲最大激情中文字幕| 深夜福利国产精品| 国产91色在线|免| 538国产精品视频一区二区| 日韩一区二区av| 欧美日韩国产精品专区| 91久久久久久久久久久| 亚洲毛片在线免费观看| 欧美日韩高清区| 中文字幕日韩精品在线| 欧美高清视频在线观看| 中文字幕综合一区| 亚洲欧美在线播放| 欧美www视频在线观看| 91精品久久久久久久久久入口| 2018中文字幕一区二区三区| 国产精品久久久久av| 国产欧美日韩精品丝袜高跟鞋| 欧美性猛交xxxx乱大交3| 国产成人中文字幕| 国产精品mp4| 久久影视电视剧凤归四时歌| 国色天香2019中文字幕在线观看| 人妖精品videosex性欧美| 91国在线精品国内播放| 国产精品xxx视频| 日韩av在线影院| 久久精品国产亚洲| 欧美亚洲午夜视频在线观看| 日韩有码视频在线| 成人妇女免费播放久久久| 91免费在线视频网站| 亚洲电影免费观看高清| 亚洲欧洲视频在线| 国产小视频91| 亚洲成色777777女色窝| 国产视频福利一区| 色老头一区二区三区在线观看| 亚洲国产天堂久久综合网| 色综合视频一区中文字幕| 国内揄拍国内精品少妇国语| 日韩av在线直播| 国产精品流白浆视频| 亚洲老头同性xxxxx| 国产精品日韩专区| 欧美性高潮床叫视频| 亚洲伊人久久大香线蕉av| 日本精品视频在线| 性色av一区二区三区红粉影视| 欧美日韩一区二区免费在线观看| 精品日韩中文字幕| 久久久久久亚洲精品不卡| 91精品国产91久久久久福利| 国产精品吹潮在线观看| 亚洲成人免费在线视频| 一区二区成人精品| 国产做受69高潮| 激情亚洲一区二区三区四区| 欧美亚洲国产视频小说| 亚洲综合在线小说| 色狠狠av一区二区三区香蕉蜜桃| 国产日韩在线免费|