JavaScript 轮播图插件化封装实现
作者:异步漫步时间:2026-10-22 06:02:40浏览:209
本文详细介绍了一种基于原生 JavaScript 的轮播图插件封装方案。通过构造函数封装 DOM 元素获取与事件绑定逻辑,实现了轮播图的复用。文章提供了完整的 AutoBanner 类代码及实例化调用示例,帮助开发者快速掌握前端组件化开发技巧。
JavaScript 轮播图插件封装实现
本文分享了一套 JavaScript 轮播图的插件化封装实现代码,供开发者参考学习。
具体实现代码如下所示:
~function(){
function AutoBanner(curEleId,ajaxURL,interval){
//把之前存储获取元素的变量都作为当前实例的私有属性
this.banner = document.getElementById(curEleId);
this.bannerInner = utils.firstChild(this.banner);
this.bannerTip = utils.children(this.banner,"ul")[0];
this.bannerLink = utils.children(this.banner,'a');
this.bannerLeft = this.bannerLink[0];
this.bannerRight = this.bannerLink[1];
this.divList = this.bannerInner.getElementsByTagName('div');
this.imgList = this.bannerInner.getElementsByTagName('img');
this.oLis = this.bannerTip.getElementsByTagName('li');
//之前的全局变量也应该变为自己的私有属性
this.jsonData = null;
this.interval = interval || 3000;
this.autoTimer = null;
this.step = 0;
this.ajaxURL = ajaxURL;
//返回当前实例
return this.init();
}
AutoBanner.prototype = {
constructor:AutoBanner,
//Ajax请求数据
getData:function(){
var _this = this;
var xhr = new XMLHttpRequest;
xhr.open("get",this.ajaxURL + "?_="+Math.random(),false);
xhr.onreadystatechange = function(){
if(xhr.readyState ===4 && /^2\d{2}$/.test(xhr.status)){
_this.jsonData = utils.formatJSON(xhr.responseText)
}
}
xhr.send(null)
},
//实现数据绑定
bindData:function(){
var str = "",str2 = "";
if(this.jsonData){
for(var i = 0,len=this.jsonData.length;i<len;i++){
var curData = this.jsonData[i];
str+='<div><img src="" alt="" trueImg="'+curData['img']+'"></div>';
i===0?str2+="<li class='bg'></li>":str2+="<li></li>"
}
}
this.bannerInner.innerHTMl = str;
this.bannerTip.innerHTML = str2;
},
//延迟加载
lazyImg:function(){
var _this = this;
for(var i = 0,len = this.imgList.length;i<len;i++){
~function(i){
var curImg = _this.imgList[i];
var oImg = new Image;
oImg.src = curImg.getAttribute('trueImg');
oImg.onload = function(){
curImg.src = this.src;
curImg.style.display = block;
//只对第一张处理
if(i===0){
var curDiv = curImg.parentNode;
curDiv.style.zIndex = 1;
myAnimate(curDiv,{opacity:1},200);
}
oImg = null;
}
}(i)
}
},
//自动轮播
autoMove:function(){
if(this.step === this.jsonData.length-1){
this.step = -1
}
this.step++;
this.setBanner();
},
//切换效果和焦点对齐
setBanner:function(){
for(var i = 0,len = this.divList.length;i<len;i++){
var curDiv = this.divList[i];
if(i===this.step){
utils.css(curDiv,"zIndex",1)
//2、让当前的透明度从0变为1,当动画结束,我们需要让其他的div的透明度的值直接变为0
myAnimate(curDiv,{opacity:1},200,function(){
var curDivSib = utils.siblings(this);
for(var k = 0,len = curDivSib.length;k<len;k++){
utils.css(curDivSib[k],'opacity',0)
}
})
continue
}
utils.css(curDiv,"zIndex",0)
}
//实现焦点对其
for(i = 0,len = this.oLis.length;i<len;i++){
var curLi = this.oLis[i];
i === this.step?utils.addClass(curLi,"bg"):utils.removeClass(curLi,"bg");
}
},
//控制自动轮播
mouseEvent:function(){
var _this = this;
this.banner.onmouseover = function(){
window.clearInterval(_this.autoTimer);
_this.bannerLeft.style.display = _this.bannerRight.style.display = "block"
}
this.banner.onmouseout = function(){
_this.autoTimer = window.setInterval(function(){
_this.autoMove.call(_this)
},_this.interval);
_this.bannerLeft.style.display = _this.bannerRight.style.display = "none"
}
},
//实现焦点切换
tipEvent:function(){
var _this = this;
for(var i = 0,len = this.oLis.length;i<len;i++){
var curLi = this.oLis[i];
curLi.index = i;
curLi.onclick = function(){
_this.step = this.index;
_this.setBanner();
}
}
},
//实现左右切换
leftRight:function(){
var _this = this;
this.bannerRight.onclick = function(){
_this.autoMove();
};
this.bannerLeft.onclick = function(){
if(_this.step === 0){
_this.step = _this.jsonData.length;
}
_this.step--;
_this.setBanner();
}
},
//当前插件的唯一入口 命令模式:init相当于指挥室,指挥各军队协同作战
init:function(){
var _this = this;
this.getData();
this.bindData();
window.setTimeout(function(){
_this.lazyImg();
},500);
this.autoTimer = window.setInterval(function(){
_this.autoMove();
},this.interval);
this.mouseEvent();
this.tipEvent();
this.leftRight();
return this;
}
}
window.AutoBanner = AutoBanner
}()
//使用
var banner1 = new AutoBanner('banner','json/banner.txt',1000)
此外,本站还提供 jQuery、JavaScript 及 Bootstrap 等技术的图片轮播专题分享。
希望上述内容能对您的学习有所帮助,欢迎继续支持本站。
作者最新文章
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
