js轮播图的插件化封装详解


Posted in Javascript onJuly 17, 2017

本文实例为大家分享了js轮播图的插件化封装代码,供大家参考,具体内容如下

具体代码如下:

~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图片轮播

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
javascript实现yield的方法
Nov 06 Javascript
用jQuery toggleClass 实现鼠标移上变色
May 14 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
利用jquery禁止外层滚动条的滚动
Jan 05 Javascript
node.js支持多用户web终端实现及安全方案
Nov 29 Javascript
Vue resource三种请求格式和万能测试地址
Sep 26 Javascript
100行代码实现一个vue分页组功能
Nov 06 Javascript
ES6 Promise对象概念及用法实例详解
Oct 15 Javascript
JavaScript装饰者模式原理与用法实例详解
Mar 09 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 03 Javascript
详解Vue的sync修饰符
May 15 Vue.js
Vue.js中extend选项和delimiters选项的比较
Jul 17 #Javascript
Vue.js中组件中的slot实例详解
Jul 17 #Javascript
Vue.js上下滚动加载组件的实例代码
Jul 17 #Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 #Javascript
详解利用jsx写vue组件的方法示例
Jul 17 #Javascript
Javascript实现找不同色块的游戏
Jul 17 #Javascript
Vue.js 单页面多路由区域操作的实例详解
Jul 17 #Javascript
You might like
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
js对象的比较
2011/02/26 Javascript
jQuery 名称冲突的解决方法
2011/04/08 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python基于Tkinter实现的记事本实例
2015/06/17 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
Django框架请求生命周期实现原理
2020/11/13 Python
德国旅游网站:weg.de
2018/06/03 全球购物
测控技术与仪器个人求职信范文
2013/12/30 职场文书
商业门面租房协议书
2014/11/25 职场文书
高考升学宴主持词
2019/06/21 职场文书