日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

原生js封裝無縫輪播功能

瀏覽:148日期:2024-03-25 11:29:08

原生js封裝無縫輪播插件,供大家參考,具體內容如下

說明:

這是一個使用原生js、es5語法寫出的無縫輪播程序,代碼中對相關api進行了封裝,使得在引入該輪播js文件后,只需要在自己的js文件中添加兩行代碼即可在網頁中實現(xiàn)一個基本的無縫輪播圖效果。

基本使用步驟為:獲取dom元素數(shù)組、向輪播對象中傳參、輪播對象調用自動輪播方法。

除基本的定時器自動輪播功能外,該程序還支持設置過渡動畫時間、設置鼠標移入元素自動輪播停止、設置點擊左右側邊按鈕時輪播、設置點擊下方按鈕時輪播功能。

該程序不需要依賴css、html文件、但需要你的css、html布局遵循一定的規(guī)則。

注意該程序不支持曲線過渡速度、且在將瀏覽器切換瀏覽器窗口后有時會出現(xiàn)輪播圖錯亂的bug,暫時找不到問題的所在。

該程序僅是我一個初學者對無縫輪播函數(shù)的簡單封裝,僅能夠做學習和參考使用。

下面除輪播代碼外,我還會給出示例程序。

運行效果:

原生js封裝無縫輪播功能

思路:

根據輪播的方向確定所有輪播圖元素的排列順序,如果當前輪播圖已到達所有輪播圖的邊界,則將相對方向上的最后一張輪播圖瞬間移動到相應位置。使用這種方法實現(xiàn)輪播圖所需要的最少輪播圖數(shù)為3張,針對輪播圖數(shù)量為一張和兩張的情況則需要對其單獨處理,一張情況下,復制添加兩張和當前輪播圖相同的輪播圖元素,兩張情況下,需要按順序對當前輪播圖進行復制添加。

編譯環(huán)境:

Chrome 86.0.4240.183

代碼:

slide.js 封裝輪播圖代碼

(function(window, undefined) { // 獲取元素css屬性值 function getCss(elem, attr) { return elem.currentStyle ? elem.currentStyle[attr] : window.getComputedStyle(elem, null)[attr]; } // 去除字符串中的非數(shù)字,不包括負號 function toInt(str) { var rex = /[^0-9]/ig; return Number((str[0] === ’-’ && str[1] !== ’=’) ? ’-’ + str.replace(rex, ’’) : str.replace(rex, ’’)); } // 封裝動畫函數(shù),參數(shù):dom對象、css屬性值對象、動畫執(zhí)行時間、動畫完成后回調 function animation(elem, params, speed, callback) { for (var param in params) { (function(param) {var elemValue = toInt(getCss(elem, param)), targetValue = toInt(params[param]), currentDis = elemValue, unit = params[param].substr(params[param].indexOf(’[A-Za-z]+’) - 1);if (params[param].length > 2) { var prefix = params[param].substr(0, 2); if (prefix === ’+=’) targetValue = elemValue + targetValue; else if (prefix === ’-=’) targetValue = elemValue - targetValue; }var dis = (targetValue - elemValue) / speed, sizeFlag = targetValue < elemValue;var timer = setInterval(function() { elemValue = toInt(getCss(elem, param)); if (sizeFlag) { if (currentDis <= targetValue) { clearInterval(timer); elem.style[param] = targetValue + unit; } else { currentDis += dis; elem.style[param] = currentDis + unit; } } else { if (currentDis >= targetValue) { clearInterval(timer); elem.style[param] = targetValue + unit; } else { currentDis += dis; elem.style[param] = currentDis + unit; } } }, 1); })(param); } if (typeof callback === ’function’) callback(); }; // 向右輪播數(shù)組移動 function rightRoundArrayMove() { var winsLen = wins.length; var lastWin = wins[winsLen - 1]; for (var i = winsLen - 1; i > 0; i--) wins[i] = wins[i - 1]; wins[0] = lastWin; } // 向左輪播 function rightRound(time) { rightRoundArrayMove(); wins.forEach(function(win, index) { (index === 0) ? win.style.left = index * winWidth - winWidth + ’px’ : animation(win, {left: ’+=’ + winWidth + ’px’}, time ? time : animationTime); }); } // 向右輪播 function leftRound(time) { var winsLen = wins.length; var firstWin = wins[0]; for (var i = 0; i < winsLen - 1; i++) wins[i] = wins[i + 1]; wins[winsLen - 1] = firstWin; wins.forEach(function(win, index) { (index === wins.length - 1) ? win.style.left = index * winWidth - winWidth + ’px’ : animation(win, {left: ’-=’ + winWidth + ’px’}, time ? time : animationTime); }); } var // wins, btns, sbtns用于保存構造函數(shù)的參數(shù) wins, btns, sbtns, // 窗口的寬度 winWidth, // 過渡動畫時間(毫秒),默認為100 animationTime = 100, // 點擊按鈕輪播間隔 clickInterval = animationTime << 2, // 保存自動輪播定時器、定時器間隔、是否向右輪播 autoRoundTimer, qinterval, qisRight, // slide構造函數(shù),參數(shù):窗口數(shù)組,按鈕數(shù)組,側邊按鈕數(shù)組 slide = function(wins, btns, sbtns) { return new slide.prototype.init(wins, btns, sbtns); }; slide.prototype = { // 初始化窗口元素 init: function(awins, abtns, asbtns) { if (!awins) throw new Error(’The window array cannot be empty.’); wins = Object.values(awins), btns = abtns, sbtns = asbtns; // 處理窗口少于3個的情況 if (wins.length === 1) { var winParent = wins[0].parentNode; var winHTML = wins[0].outerHTML; winParent.innerHTML += winHTML + winHTML; wins = Object.values(winParent.children); } else if (wins.length === 2) { var winParent = wins[0].parentNode; winParent.innerHTML += wins[0].outerHTML + wins[1].outerHTML; wins = Object.values(winParent.children); } winWidth = wins[0].offsetWidth; wins.forEach(function(win, index) { win.style.position = ’absolute’; win.index = index; }); rightRoundArrayMove(); wins.forEach(function(win, index) { win.style.left = index * winWidth - winWidth + ’px’; }); }, // 設置過渡動畫時間 setAnimationTime: function(time) { animationTime = time; clickInterval = animationTime << 2; }, // 自動輪播,參數(shù):輪播時間間隔、是否為向右輪播 autoRound: function(interval, isRight) { autoRoundTimer = setInterval(function() {isRight ? rightRound() : leftRound(); }, interval); qinterval = interval; qisRight = isRight; }, // 側邊按鈕點擊,參數(shù)為側邊按鈕元素數(shù)組,該參數(shù)可在構造函數(shù)中傳遞或現(xiàn)在傳遞 sideBtnClickRound: function(sabtns) { var leftBtn = sabtns ? sabtns[0] : sbtns[0], rightBtn = sabtns ? sabtns[1] : sbtns[1]; var isclick= true; leftBtn.onclick = function () { if(isclick) { isclick= false; rightRound(); setTimeout(function() { isclick = true; }, clickInterval); } }; rightBtn.onclick = function () { if(isclick) { isclick= false; leftRound(); setTimeout(function() { isclick = true; }, clickInterval); } }; }, // 普通按鈕點擊,參數(shù):普通按鈕數(shù)組、回調 btnsClickRound: function(abtns, callback) { var ibtns = abtns ? abtns : btns; var isclick= true; ibtns.forEach(function(btn, index) { btn.onclick = function() { if(isclick) { isclick= false; if (typeof callback === ’function’) callback(ibtns, btn, index); var poor = index - wins[1].index; var count = Math.abs(poor); if (poor < 0) { var absPoor = count; var timer = setInterval(function() {console.log((absPoor + 1)) rightRound(animationTime / (absPoor + 2)); if ((--count) === 0) clearInterval(timer); }, animationTime); } else if (poor > 0) { var timer = setInterval(function() { leftRound(animationTime / (poor + 2)); if ((--count) === 0) clearInterval(timer); }, animationTime); } setTimeout(function() { isclick = true; }, clickInterval << 1); } } }); }, // 設置鼠標移入取消自動輪播,參數(shù):移入的元素、移入元素回調、移出元素回調 setOverStop: function(box, overCallback, outCallback) { box.onmouseover = function(e) { clearInterval(autoRoundTimer);if (typeof overCallback === ’function’) overCallback(e); } box.onmouseout = function(e) { slide.prototype.autoRound(qinterval, qisRight);if (typeof outCallback === ’function’) outCallback(e); } } } slide.prototype.init.prototype = slide.prototype; window.slide = _slide = slide; })(window);

test.js 測試示例js代碼:

onload = function() { var wins = document.querySelectorAll(’.wins > li’); var btns = document.querySelectorAll(’.btns > li’); var sideBtns = document.querySelectorAll(’.side-btns > div’); var box = document.querySelector(’.box’); var s = slide(wins, btns, sideBtns); // 創(chuàng)建輪播對象,參數(shù):窗口dom數(shù)組、下方按鈕dom數(shù)組(可選)、 s.autoRound(2000); // 設置自動輪播 s.setAnimationTime(200); // 設置過渡動畫時間 s.setOverStop(box); // 設置鼠標移入元素時自動輪播停止,參數(shù):移入的dom元素、移入元素回調、移出元素回調 s.sideBtnClickRound(); // 設置點擊側邊按鈕時輪播,參數(shù):按鈕dom數(shù)組(可選) s.btnsClickRound(); // 設置下方按鈕點擊時輪播,參數(shù):按鈕dom數(shù)組(可選)、回調}

html、css示例代碼

<!DOCTYPE html><html> <head> <meta charset='utf-8' /> <title></title> <style type='text/css'> * { margin: 0; padding: 0; } li { list-style: none; } .box { width: 1000px; height: 400px; margin: 20px auto; display: flex; align-items: center; position: relative; overflow: hidden; } .box > * { position: absolute; } .side-btns { width: inherit; height: 100px; display: flex; justify-content: space-between; z-index: 2; } .side-btns > div { width: 50px; height: inherit; text-align: center; line-height: 100px; font-size: 18px; background-color: rgba(0, 0, 0, .3); color: white; cursor: pointer; user-select: none; } .btns { width: inherit; height: 20px; display: flex; justify-content: flex-end; z-index: 2; position: absolute; bottom: 20px; } .btns > li { width: 16px; height: 16px; border-radius: 50%; margin-right: 12px; cursor: pointer; background-color: rgba(0, 0, 0, .2); } .wins { width: inherit; height: inherit; display: flex; } .wins > li { width: inherit; height: inherit; flex-grow:0; flex-shrink:0; } </style> <script src='http://m.b3g6.com/bcjs/js/slide.js'></script> <script src='http://m.b3g6.com/bcjs/js/test.js'></script> </head> <body> <div class='box'> <div class='side-btns'> <div class='left-btn'>&lt;</div> <div class='right-btn'>&gt;</div> </div> <ul class='btns'> <li></li> <li></li> <li></li> <li></li> </ul> <ul class='wins'> <li style='background-color: antiquewhite;'>a</li> <li style='background-color: aquamarine;'>b</li> <li style='background-color: green;'>c</li> <li style='background-color: brown;'>d</li> </ul> </div> </body></html>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩国产传媒| 婷婷综合成人| 石原莉奈在线亚洲二区| 欧美国产极品| 伊人久久av| 中文字幕中文字幕精品| aa亚洲婷婷| 蜜臀av性久久久久蜜臀aⅴ四虎| 极品日韩av| 亚洲专区欧美专区| 久久久久久久久久久妇女| 久久av影视| 热三久草你在线| 国产一区亚洲| 午夜亚洲福利在线老司机| 日本不卡高清| 亚洲欧美久久| 国产精品99久久免费观看| 免费在线小视频| 精品亚洲二区| а√在线中文在线新版| 日韩综合一区| 亚洲天堂资源| 亚洲一区网站| 高清av不卡| 蜜桃一区二区三区在线| 国产精品一区二区三区四区在线观看 | 成人看片网站| 激情黄产视频在线免费观看| 久久的色偷偷| 久久中文欧美| 欧美精品资源| 欧美永久精品| 国产精品黑丝在线播放| 日本一区中文字幕| 激情欧美一区二区三区| 久久精品凹凸全集| 麻豆精品一区二区综合av| 国产精品1luya在线播放| 国产不卡一区| 国产毛片精品| 美女网站一区| 日本欧美不卡| 91精品99| 麻豆精品视频在线| 日韩高清欧美激情| 午夜久久久久| 激情五月综合| 美女国产一区| 国产精品综合色区在线观看| 国产一区 二区| 亚洲一区区二区| 欧美日韩国产高清| 亚洲性图久久| 秋霞国产精品| 精品久久美女| 国产 日韩 欧美一区| 久久精品九色| 嫩草伊人久久精品少妇av杨幂| 综合国产精品| 里番精品3d一二三区| 99久久夜色精品国产亚洲1000部| 成人在线超碰| 国产日韩精品视频一区二区三区| 成人午夜在线| 天海翼精品一区二区三区| www成人在线视频| 亚洲91网站| 国产精品中文| 91亚洲成人| 国产亚洲午夜| 亚洲三级国产| 日本强好片久久久久久aaa| 日韩高清国产一区在线| 美女网站一区| 亚洲va中文在线播放免费| 国产欧美一区二区三区精品观看| 国产极品模特精品一二| 四虎精品一区二区免费| 丝袜美腿亚洲色图| 欧美1区2区3| 欧美日韩免费观看一区=区三区 | 日本色综合中文字幕| 亚洲欧美高清| 青青草精品视频| 亚洲福利精品| 国产欧美一区二区三区米奇| 国产伦乱精品| 久久裸体视频| 国内精品麻豆美女在线播放视频| 成人片免费看| 午夜欧美精品久久久久久久| 无码日韩精品一区二区免费| 免费久久久久久久久| 美女精品久久| 国产精品porn| 激情欧美一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 狠狠久久婷婷| 国产在线|日韩| 高清一区二区三区| 久久国产精品色av免费看| 老色鬼久久亚洲一区二区| 狠狠干成人综合网| 樱桃成人精品视频在线播放| 久久九九精品| 免费日韩av片| 国产日韩免费| 国产精品国产三级国产在线观看| 成人亚洲一区| 久久久人人人| 中文字幕日本一区二区| 精品一区91| 国产精品蜜芽在线观看| 在线一区av| 在线一区av| 亚洲综合专区| 精品欧美日韩精品| 日韩一二三区在线观看| 国产精品美女| 国产情侣一区| 成人在线观看免费视频| 岛国av免费在线观看| 视频二区不卡| 亚洲精品一二三**| 精品国产一区二区三区av片| 亚洲国产专区| 麻豆91精品91久久久的内涵| 91精品高清| 久久精品国产www456c0m| 欧美亚洲一级| 天堂а√在线最新版中文在线| 91视频精品| 亚洲免费中文| 国内揄拍国内精品久久| 欧美a级一区| 国产欧美91| 狠狠操综合网| 福利一区二区免费视频| 国产综合精品| 91精品美女| 亚洲国内精品| 国产videos久久| 国产精品久久777777毛茸茸| 久久黄色影院| 精品一区二区三区中文字幕在线| 日韩视频一区| 欧美国产专区| 亚洲精品乱码久久久久久蜜桃麻豆| 午夜欧美在线| 日韩不卡视频在线观看| 日韩成人亚洲| 在线天堂资源www在线污| 日韩在线免费| 日韩av网站在线免费观看| 日本午夜精品久久久久| 亚洲91久久| 亚洲一区有码| 精品久久中文| 日韩精品免费一区二区三区| 精品丝袜在线| 野花国产精品入口| 国内一区二区三区| 国产精品一级| 日韩精品亚洲aⅴ在线影院| 国产精品久久久久久久久久齐齐| 性色av一区二区怡红| 久久久国产亚洲精品| 成人在线免费观看91| 亚洲美女久久| 麻豆成人在线| 自由日本语亚洲人高潮| 久久久亚洲一区| 宅男噜噜噜66国产日韩在线观看| 亚洲精品激情| 久久国产日韩欧美精品| 国产探花在线精品| 国产精品一级| 国产一区二区三区亚洲| 久久久久九九精品影院| 日韩国产一区| 国产 日韩 欧美 综合 一区 | 亚洲一区不卡| 免费视频久久| 日韩一区二区三区精品| 国产一区二区三区免费在线| 麻豆国产91在线播放| 日韩和的一区二在线| 亚洲午夜黄色| 亚洲91视频| 中文字幕亚洲在线观看| 精品资源在线| 国户精品久久久久久久久久久不卡| 欧美精品一二| 日韩国产欧美三级| 国产精品红桃| 久久国产精品亚洲77777| 国产精品啊v在线| 免费精品视频| 日韩国产一区|