国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

原生JS利用transform實現banner的無限滾動

開發 前端
原生JS怎樣利用transform實現banner的無限滾動及其功能原理。一起來看看吧。

 功能

[[330208]]

  •  默認情況無限循環向右移動
  •  點擊數字切換到對應圖片
  •  點擊左右切換可切換圖片

原理

首先說下原理。

  1.  在布局上所有的圖片都是重疊的,即只要保證Y方向對齊即可,當前可見的圖z-index層級最高。
  2.  每隔3s中更換一張圖片,使用setTimeout定時。
  3.  使用gIndex記錄當前可視區域的展示的是哪張圖片下標,每次更換,計算下一張圖片的下標。
  4.  通過requestAnimationFrame實現一次圖片切換的動畫。

這種方法也可以做到整個頁面始終只有2個img標簽,而不必把所有的img節點全部創建出來,要點是每次更換不可見img的src。

動畫的實現

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

      3.  step+1

      4.  如果moveWidth>圖片寬度,步驟5,否則requestAnimationFrame請求下一次執行,繼續2-4.

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

這樣就完成了一次移動的動畫。

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.     // 綁定左右點擊事件  
  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.     // 綁定數字序號事件  
  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.     // 默認初始動畫朝右邊  
  32.     function begainAnimate() {  
  33.         clearTimeout(timeout);  
  34.         timeout = setTimeout(function () {  
  35.             rightMove();  
  36.             begainAnimate();  
  37.         }, 3000);  
  38.     }  
  39.     // 向左移動動畫  
  40.     function leftMove() {  
  41.         var nextIndex = (gIndex - 1 < 0) ? oImgs.length - 1 : gIndex - 1;  
  42.         animateSteps(nextIndex, -50);  
  43.     }  
  44.     // 向右移動動畫  
  45.     function rightMove(nextIndex) {  
  46.         if (nextIndex == undefined) {  
  47.             nextIndex = (gIndex + 1 >= oImgs.length) ? 0 : gIndex + 1;  
  48.         }  
  49.         animateSteps(nextIndex, 50);  
  50.     }  
  51.     // 一次動畫  
  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.         // 走一幀的動畫,移動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.     /* 首先設置圖片box的區域,將圖片重疊在一起  */  
  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.     /* 數字序列按鈕 */  
  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>  

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2012-05-10 14:02:46

jQuery

2015-07-17 13:15:40

Swift版幻燈無限滾動

2012-05-02 13:53:00

JavaScript

2023-09-07 07:35:59

JS操作網頁

2024-06-20 08:42:45

2025-09-19 08:13:42

2015-05-28 10:20:34

js相冊翻頁

2015-05-07 15:13:22

JS實現JQueryJQuery

2025-07-02 03:00:00

2022-09-20 11:00:14

Vue3滾動組件

2019-12-11 10:50:06

JS圖片前端

2021-06-18 10:12:09

JS代碼前端

2013-04-02 13:04:07

ListView平滑滾

2011-09-02 10:14:10

JQuery滾動Xslider

2022-07-12 08:32:17

transition跑馬燈

2012-08-10 09:46:53

jQuery

2022-04-06 18:29:58

CSSJS輸入框

2021-02-11 13:56:21

JSweb插件

2023-11-22 07:47:34

2025-03-19 09:00:00

JavaScript代碼無限滾動
點贊
收藏

51CTO技術棧公眾號

一区二区三区日韩精品视频| 国产精品久久久久影院日本| 99re99| 久久91精品国产91久久小草| 国产一区高清视频| 精品久久久久中文字幕小说 | 中文产幕区在线观看 | 欧美高清中文字幕| 国产在线精品免费av| 秋霞久久久久久一区二区| 激情av一区| a级国产乱理论片在线观看99| 成人婷婷网色偷偷亚洲男人的天堂| 91精品国产成人www| 国产精品高清一区二区| 这里精品视频免费| 日本肉肉一区| 色噜噜狠狠狠综合曰曰曰| 欧美大片免费高清观看| 亚洲成人激情图| 欧美人体视频xxxxx| 欧美一区二区三区免费在线看| 香蕉视频在线免费看| 欧美三级电影网站| 国产在线69| 精品国产乱码久久久久久蜜臀| 超碰中文在线| 一区二区三区四区视频| 亚洲精品aaa| 久久久久久久香蕉网| 秋霞在线一区| 成人在线免费观看视视频| 好看的av在线不卡观看| 欧美二区在线看| 久久66热re国产| 男女猛烈激情xx00免费视频| 久久精品水蜜桃av综合天堂| 妞干网免费视频| 欧美性jizz18性欧美| 成人免费网址| 在线观看国产精品日韩av| 99精品国产九九国产精品| 久久久久久免费精品| 不卡中文字幕| 欧美国产一二三区| 国产一区二区网址| 成年网站在线播放| 狠狠色香婷婷久久亚洲精品| 天堂8中文在线| 久久天堂电影网| 国产亚洲精品美女久久久久久久久久| 3d动漫啪啪精品一区二区免费 | 国产在线视频你懂得| 日韩情涩欧美日韩视频| 妞干网免费在线视频| 久99久在线视频| 日韩欧美一区二区三区在线视频 | 激情综合网站| 国产一区免费| www.在线成人| 在线91av| 精品爽片免费看久久| 欧美日韩一区二区三区不卡视频| 91香蕉亚洲精品| 国产一区二区在线视频| 成人影院一区二区三区| 欧美不卡123| 亚洲盗摄视频| 亚洲精品一区二区三区四区五区 | 欧美亚洲精品一区| 成人高清一区| 国产精品网站视频| 日韩国产欧美视频| 亚洲综合色在线观看| 日韩一级大片在线| 亚洲国产最新| 成年人免费观看的视频| 亚洲激情一二三区| 国产伦理精品| 国产精品18久久久久久首页狼 | 国产精品网址在线| 国产69精品一区二区亚洲孕妇| 亚洲精品少妇久久久久久| 日韩欧美一级精品久久| 伊人久久大香线蕉无限次| 亚洲高清精品中出| 亚洲一级不卡视频| 国产第一精品| 鲁鲁狠狠狠7777一区二区| 国产精品欧美极品| 欧美日韩大片| 精品一区二区三区免费毛片| 中文字幕一区二区不卡 | 红杏一区二区三区| 先锋在线资源一区二区三区| 一区二区三区中文在线| 成人在线不卡| 日韩精品成人一区二区在线观看| 亚洲另类一区二区| 国产区一区二| 国产卡一卡二在线| 欧美日韩你懂得| 日韩欧美国产精品综合嫩v| 国产福利视频在线播放| 精品1区2区在线观看| 欧美a级片网站| 日本福利视频| 欧美激情精品久久久久久免费印度| 蜜乳av一区二区| 日本最新在线视频| 国产精品第10页| 国产精品久久久爽爽爽麻豆色哟哟 | 国模精品视频一区二区| 国产成人午夜精品5599| 成人性生交大片免费看在线播放| 粉嫩av免费一区二区三区| 一区二区三区国产精品| 老汉色老汉首页av亚洲| 苍井空浴缸大战猛男120分钟| 一区二区三区亚洲| 国产在线播精品第三| а√天堂中文在线资源8| 日本中文不卡| 日韩视频一区二区三区在线播放| 欧美777四色影| 欧洲成人av| 91视频免费在线| 亚洲成人一区在线| 久久影视一区| 毛片在线播放网址| 国产精品免费看一区二区三区| 福利一区视频在线观看| 91精品啪在线观看国产18| 国产中文字幕在线视频| 精选一区二区三区四区五区| 91精品久久久久久蜜臀| 日本va欧美va欧美va精品| 乱馆动漫1~6集在线观看| 免费观看亚洲视频| 色吧影院999| 国产精品久久久久婷婷二区次| 欧美一级二级三级视频| 成人动漫av| 极品日韩久久| 亚洲激情自拍图| av一区二区三区| 琪琪久久久久日韩精品| 香蕉av在线| 欧美一区二区三区在线播放 | 国产高清一区在线观看| 久久精品国产一区二区三区不卡| 欧美一区二区精美| 国产一区二区三区蝌蚪| 色999久久久精品人人澡69 | 国产极品jizzhd欧美| 欧美色另类天堂2015| 欧美激情四色| 福利在线导航136| 精品中文字幕av| 日本视频久久久| 在线观看日韩一区| 男人的j进女人的j一区| 日本亚洲欧洲无免费码在线| 91在线视频观看免费| 国产精品欧美久久久| 91精品国产综合久久精品图片| 国产精品一区二区在线播放| 国产午夜亚洲精品一级在线| 特级全黄一级毛片| 欧美区高清在线| 日韩在线观看免费全| 亚洲高清免费观看高清完整版在线观看 | 波多结衣在线观看| 国产欧美欧洲在线观看| 这里只有精品电影| 久久综合久色欧美综合狠狠| 久久香蕉国产| 国产美女情趣调教h一区二区| 久草青青在线观看| 91免费在线视频网站| 日韩精品在线视频| 一区二区三区在线视频观看58| 国产精品久久久久毛片大屁完整版 | 国产一区二区自拍| 在线播放国产一区二区三区| 亚洲一区中文在线| 日韩成人一级片| 宅男在线一区| 久久久123| 快色在线观看| 影音先锋欧美在线| 国产精品video| 国产午夜精品久久久 | 精品少妇无遮挡毛片| ts人妖另类在线| 色视频www在线播放国产成人| 精品福利一区二区| 粉嫩蜜臀av国产精品网站| 国内精品视频在线观看 | 欧美hentaied在线观看|