自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

原生JS利用transform實(shí)現(xiàn)banner的無(wú)限滾動(dòng)

開發(fā) 前端
原生JS怎樣利用transform實(shí)現(xiàn)banner的無(wú)限滾動(dòng)及其功能原理。一起來(lái)看看吧。

 功能

[[330208]]

  •  默認(rèn)情況無(wú)限循環(huán)向右移動(dòng)
  •  點(diǎn)擊數(shù)字切換到對(duì)應(yīng)圖片
  •  點(diǎn)擊左右切換可切換圖片

原理

首先說(shuō)下原理。

  1.  在布局上所有的圖片都是重疊的,即只要保證Y方向?qū)R即可,當(dāng)前可見的圖z-index層級(jí)最高。
  2.  每隔3s中更換一張圖片,使用setTimeout定時(shí)。
  3.  使用gIndex記錄當(dāng)前可視區(qū)域的展示的是哪張圖片下標(biāo),每次更換,計(jì)算下一張圖片的下標(biāo)。
  4.  通過(guò)requestAnimationFrame實(shí)現(xiàn)一次圖片切換的動(dòng)畫。

這種方法也可以做到整個(gè)頁(yè)面始終只有2個(gè)img標(biāo)簽,而不必把所有的img節(jié)點(diǎn)全部創(chuàng)建出來(lái),要點(diǎn)是每次更換不可見img的src。

動(dòng)畫的實(shí)現(xiàn)

  1.  首先定義一個(gè)timestap,這個(gè)值記錄每個(gè)幀移動(dòng)多少距離。定義初始step=0,記錄移動(dòng)的步數(shù)。
  2.  每次移動(dòng)的距離moveWidth是timestamp*step,圖片1向右移動(dòng)增加moveWidth,圖片2從左側(cè)進(jìn)入moveWidth。因此,圖片1的transform是translate(moveWidth), 而圖片2的transform則是translate(moveWidth-圖片寬度)。

      3.  step+1

      4.  如果moveWidth>圖片寬度,步驟5,否則requestAnimationFrame請(qǐng)求下一次執(zhí)行,繼續(xù)2-4.

      5.  圖片1和2都將位置放置在起始位置,圖片2的z-index設(shè)置為最高。

這樣就完成了一次移動(dòng)的動(dòng)畫。

html代碼 

  1. <header>  
  2.     <div class="box">  
  3.         <img src="imgs/banner1.jpg">  
  4.         <img src="imgs/banner2.jpg">  
  5.         <img src="imgs/banner3.jpg">  
  6.         <img src="imgs/banner4.jpg">  
  7.     </div>  
  8.     <div class="buttons">  
  9.         <div class="active">1</div>  
  10.         <div>2</div>  
  11.         <div>3</div>  
  12.         <div>4</div>  
  13.     </div>  
  14.     <div class="left">  
  15.         <div class="arrow"></div>  
  16.     </div>  
  17.     <div class="right">  
  18.         <div class="arrow"></div>  
  19.     </div>  
  20. </header> 

JS代碼 

  1. var timeout = null 
  2. window.onload = function () {  
  3.     var oLeft = document.querySelector('.left');  
  4.     var oRight = document.querySelector('.right');  
  5.     var oButton = document.querySelector('.buttons');  
  6.     var oButtons = document.querySelectorAll('.buttons div');  
  7.     var oImgs = document.querySelectorAll('.box img');  
  8.     var imgWidth = oImgs[0].width;  
  9.     var gIndex = 0 
  10.     begainAnimate();  
  11.     // 綁定左右點(diǎn)擊事件  
  12.     oLeft.onclick = function () {  
  13.         clearTimeout(timeout);  
  14.         leftMove();  
  15.         begainAnimate();  
  16.     };  
  17.     oRight.onclick = function () {  
  18.         clearTimeout(timeout);  
  19.         rightMove();  
  20.         begainAnimate();  
  21.     };  
  22.     // 綁定數(shù)字序號(hào)事件  
  23.     oButton.onclick = function (event) {  
  24.         clearTimeout(timeout);  
  25.         var targetEl = event.target;  
  26.         var nextIndex = (+targetEl.innerText) - 1;  
  27.         console.log(nextIndex);  
  28.         rightMove(nextIndex);  
  29.         begainAnimate();  
  30.     }  
  31.     // 默認(rèn)初始動(dòng)畫朝右邊  
  32.     function begainAnimate() {  
  33.         clearTimeout(timeout);  
  34.         timeout = setTimeout(function () {  
  35.             rightMove();  
  36.             begainAnimate();  
  37.         }, 3000);  
  38.     }  
  39.     // 向左移動(dòng)動(dòng)畫  
  40.     function leftMove() {  
  41.         var nextIndex = (gIndex - 1 < 0) ? oImgs.length - 1 : gIndex - 1;  
  42.         animateSteps(nextIndex, -50);  
  43.     }  
  44.     // 向右移動(dòng)動(dòng)畫  
  45.     function rightMove(nextIndex) {  
  46.         if (nextIndex == undefined) {  
  47.             nextIndex = (gIndex + 1 >= oImgs.length) ? 0 : gIndex + 1;  
  48.         }  
  49.         animateSteps(nextIndex, 50);  
  50.     }  
  51.     // 一次動(dòng)畫  
  52.     function animateSteps(nextIndex, timestamp) {  
  53.         var currentImg = oImgs[gIndex];  
  54.         var nextImg = oImgs[nextIndex];  
  55.         nextImg.style.zIndex = 10 
  56.         var step = 0 
  57.         requestAnimationFrame(goStep);  
  58.         // 走一幀的動(dòng)畫,移動(dòng)timestamp  
  59.         function goStep() {  
  60.             var moveWidth = timestamp * step++;  
  61.             if (Math.abs(moveWidth) < imgWidth) {  
  62.                 currentImg.style.transform = `translate(${moveWidth}px)`;  
  63.                 nextImg.style.transform = `translate(${moveWidth > 0 ? (moveWidth - imgWidth) : (imgWidth + moveWidth)}px)`;  
  64.                 requestAnimationFrame(goStep);  
  65.             } else {  
  66.                 currentImg.style.zIndex = 1 
  67.                 currentImg.style.transform = `translate(0px)`;  
  68.                 nextImg.style.transform = `translate(0px)`;  
  69.                 oButtons[gIndex].setAttribute('class', '');  
  70.                 oButtons[nextIndex].setAttribute('class', 'active');  
  71.                 gIndex = nextIndex 
  72.             }  
  73.         }  
  74.     }  
  75.  
  76. window.onclose = function () {  
  77.     clearTimeout(timeout);  

css布局樣式 

  1. <style>  
  2.     /* 首先設(shè)置圖片box的區(qū)域,將圖片重疊在一起  */  
  3.     header {  
  4.         width: 100%;  
  5.         position: relative;  
  6.         overflow: hidden;  
  7.     }  
  8.     .box {  
  9.         width: 100%;  
  10.         height: 300px;  
  11.     }  
  12.     .box img {  
  13.         width: 100%;  
  14.         height: 100%;  
  15.         position: absolute;  
  16.         transform: translateX(0);  
  17.         z-index: 1; 
  18.      }  
  19.     .box img:first-child {  
  20.         z-index: 10;  
  21.     }    
  22.     /* 數(shù)字序列按鈕 */  
  23.     .buttons {  
  24.         position: absolute;  
  25.         right: 10%;  
  26.         bottom: 5%;  
  27.         display: flex;  
  28.         z-index: 100;  
  29.     }  
  30.     .buttons div {  
  31.         width: 30px;  
  32.         height: 30px;  
  33.         background-color: #aaa;  
  34.         border: 1px solid #aaa;  
  35.         text-align: center;  
  36.         margin: 10px;  
  37.         cursor: pointer;  
  38.         opacity: .7;  
  39.         border-radius: 15px;  
  40.         line-height: 30px;  
  41.     }  
  42.     .buttons div.active {  
  43.         background-color: white;  
  44.     }  
  45.     /* 左右切換按鈕 */  
  46.     .left,  
  47.     .right {  
  48.         position: absolute;  
  49.         width: 80px;  
  50.         height: 80px;  
  51.         background-color: #ccc;  
  52.         z-index: 100;  
  53.         top: 110px;  
  54.         border-radius: 40px;  
  55.         opacity: .5;  
  56.         cursor: pointer;  
  57.     }  
  58.     .left {  
  59.         left: 2%;  
  60.     } 
  61.     .right {  
  62.         right: 2%;  
  63.     }  
  64.     .left .arrow {  
  65.         width: 30px;  
  66.         height: 30px;  
  67.         border-left: solid 5px #666;  
  68.         border-top: solid 5px #666;  
  69.         transform: translate(-5px, 25px) rotate(-45deg) translate(25px, 25px); 
  70.      }  
  71.     .right .arrow {  
  72.         width: 30px;  
  73.         height: 30px;  
  74.         border-left: solid 5px #666;  
  75.         border-top: solid 5px #666;  
  76.         transform: translate(50px, 25px) rotate(135deg) translate(25px, 25px);  
  77.     }  
  78. </style>  

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2012-05-10 14:02:46

jQuery

2015-07-17 13:15:40

Swift版幻燈無(wú)限滾動(dòng)

2012-05-02 13:53:00

JavaScript

2023-09-07 07:35:59

JS操作網(wǎng)頁(yè)

2024-06-20 08:42:45

2015-05-28 10:20:34

js相冊(cè)翻頁(yè)

2015-05-07 15:13:22

JS實(shí)現(xiàn)JQueryJQuery

2022-09-20 11:00:14

Vue3滾動(dòng)組件

2019-12-11 10:50:06

JS圖片前端

2021-06-18 10:12:09

JS代碼前端

2013-04-02 13:04:07

ListView平滑滾

2022-07-12 08:32:17

transition跑馬燈

2022-04-06 18:29:58

CSSJS輸入框

2012-08-10 09:46:53

jQuery

2011-09-02 10:14:10

JQuery滾動(dòng)Xslider

2021-02-11 13:56:21

JSweb插件

2010-06-23 09:08:42

2025-03-19 09:00:00

JavaScript代碼無(wú)限滾動(dòng)

2009-11-10 14:13:44

VB.NET圖片框

2022-07-28 14:26:11

AI作詩(shī)應(yīng)用開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)