js实现无缝轮播图插件封装

 更新时间:2020年7月31日 16:59  点击:2328

前言:页面中轮播图,对于一个前端开发者来说,是最基本的技能,不论是的商城网站,还是企业站,轮播图已经成为不可缺少的一个模块,而常见的轮播图不外乎两种,一种是渐隐渐现轮播图,一种是无缝轮播图。网上关于轮播图的件也有很多,但是用人家的代码总会出现各种各样的bug,我们修改bug往往要耗费很多时间,而且有些插件的效果还不符合我们的需求,那么我们该如何封装一个自己的轮播插件呢?这就是我们今天的任务,封装轮播插件。

1、特效离不开合理的页面布局,所以我们首先需要进行页面布局:

HTML代码:

<div class="container mycontainer">
  <div class="wrapper">
    <div class="slide">
      <img src="image/jd01.jpg" alt="">
    </div>
    <div class="slide">
      <img src="image/jd02.jpg" alt="">
    </div>
    <div class="slide">
      <img src="image/jd03.jpg" alt="">
    </div>
    <div class="slide">
      <img src="image/jd04.jpg" alt="">
    </div>
  </div>
  <!-- 分页器 -->
  <ul class="pagination"></ul>
  <!-- 导航按钮 -->
  <div class="button-pre"></div>
  <div class="button-next"></div>
</div>

2、在HTML页面中引入css样式文件:css样式文件代码如下:

CSS代码:

* {
  margin: 0;
  padding: 0;
}

ul,
li {
  list-style: none;
}

.container {  
  margin: 200px auto;
  position: relative;
  overflow: hidden;
}

.slide {
  float: left;
}

img {
  display: block;
}

.pagination {
  width: 160px;
  position: absolute;
  bottom: 30px;
  margin-left: -80px;
  left: 50%;
}

.pagination li {
  float: left;
  width: 20px;
  height: 20px;
  background-color: blue;
  margin: 0 10px;
  border-radius: 50%;
}

.button-pre,
.button-next {
  width: 22px;
  height: 40px;
  position: absolute;
  top: 50%;
  margin-top: -20px;
}

.button-pre {
  left: 30px;
  background: url('../image/left.png') no-repeat center center;
}

.button-next {
  right: 30px;
  background: url('../image/right.png') no-repeat center center;
}

.pagination .active {
  background-color: red;
}
.mycontainer{
  width: 590px;
  height: 470px;
}

页面布局完成后,接下来就是javaScript代码,绑定事件;

在绑定事件之前,我们首先要知道无缝轮播图的原理和一些技术关键点。
轮播图的原理:最外层视野区域固定大小且的溢出隐藏,通过动态控制包裹图片的父元素的marginLeft值实现轮播;
关键点1:最外层的盒子container固定大小,是我们的视野区域,需要设置溢出隐藏overflow:hidden;
关键点2:所有轮播的图片使用一个共同的父元素wrapper包裹起来;
关键点3:动态克隆第一张图片所在的元素silde,然后添加到最后;
关键点4:父元素wrapper的宽度为图片个数(原始图片个数+1,因为克隆多添加了一张图片)乘以单独一张图片的宽度;
关键点5:实现无缝轮播的判断条件,marginleft样式重置时机;
关键点6:动态生成分页器按钮,并设置分页器pagination样式;
关键点7:实现自动播放和清除播放,使用计时器setInterval()和 clearInterval()
关键点8:实现代码复用,借助面向对象的开发——构造函数+原型对象+jQuery插件封装机制实现

3、关键点梳理完之后,就可以开始javascript代码:通过自执行函数实现;需要在HTML页面引入JS文件,JS文件代码如下:

JS代码:

;(function($){
  // 默认设置
  var defaults = {
    speed:1000,
    interval:2000
  }
  function Banner(ele,options){
    // 获取元素对象
    this.element = $(ele);
    // 合并设置项
    this.options = $.extend({},defaults,options);
    // 获取包裹图片的父元素
    this.wrapper = this.element.children().first();
    // 获取要克隆的元素
    this.firstChild = this.wrapper.find('.slide:first');
    // 获取一张图片宽度
    this.Width = this.firstChild.width();
    // 记录图片下标
    this.n = 0;
    // 获取图片个数
    this.len = this.wrapper.find('.slide').length;
    // 获取切换导航按钮
    this.prev = this.element.find('.button-pre');
    this.next = this.element.find('.button-next');
    // 获取分页器
    this.pagination = this.element.find('.pagination');
    // 计时器
    this.timer = null;
  }
  // 初始化
  Banner.prototype.init = function(){
    var self = this;    
    (function () {
      // 克隆第一张图片并添加到元素的最后边,设置包裹图片父盒子的宽度
      self.wrapper.append(self.firstChild.clone(true));
      self.wrapper.css({ width:self.Width * (self.len + 1)});
      // 生成对应的分页器按钮
      for(var i = 0; i < self.len; i++){
        $('<li></li>').appendTo(self.pagination); 
      }
      // 动态设置分页器的样式
      self.pagination.find('li:first').addClass('active');
      var btnWidth = self.pagination.find('li:first').outerWidth(true) * self.len;
      self.pagination.css({width:btnWidth,marginLeft:-btnWidth / 2})
    })() 
    // 调用所有绑定的事件
    this.nextClick();  
    this.preClick();  
    this.btnClick();
    this.autoPlay();
    this.clearPlay(this.element);
  }
  // 切换下一张图片事件
  Banner.prototype.nextClick = function(){
    var self = this;
    this.next.click(function(){
      self.moveNext();
    })
  }
  // 切换图片,同时也为实现自动播放
  Banner.prototype.moveNext = function() {
    this.n++;
    // 判断重置时机和重置样式
    if (this.n > this.len ) {
      this.n = 1;
      this.wrapper.css({ marginLeft: 0 });
    }
    this.changeBtn(this.n > 3 ? 0 : this.n);
    this.wrapper.stop(true,true).animate({ marginLeft: -this.Width * this.n }, this.options.speed)
  }

  // 点击切换上一张图片
  Banner.prototype.preClick = function(){
    var self = this;
    this.prev.click(function () {
      self.n--;
      if (self.n < 0) {
        self.n = self.len - 1;
        self.wrapper.css({ marginLeft: -(self.len) * self.Width });
      }
      self.changeBtn(self.n < 0 ? self.n = 3 : self.n);
      self.wrapper.animate({ marginLeft: -self.Width * self.n }, self.options.speed)
    })
  }
  // 点击分页器切换图片
  Banner.prototype.btnClick = function(){
    var self = this;     
     this.pagination.find('li').click(function () {
      var index = $(this).index();
      self.n = index;
      self.changeBtn(index);
      self.wrapper.animate({ marginLeft: -self.Width * index }, self.options.speed)
    })
  }
  // 动态修改分页器按钮的样式
  Banner.prototype.changeBtn = function(index){
    this.pagination.find('li').eq(index).addClass('active').siblings().removeClass('active');
  }
  // 自动轮播
  Banner.prototype.autoPlay = function(){
    var self = this;
    /* 计时器中调用函数是,函数中的this 指向 window, 所以需要使用self.timer = setInterval(function(){
       self.moveNext();
     },2000);
     不能直接使用 self.timer = setInterval(self.moveNext(),2000); 形式 */
    self.timer = setInterval(function(){
      self.moveNext();
    },self.options.interval);
  }
  // 清除自动播放
  Banner.prototype.clearPlay = function(ele){
    var self = this;
    ele.mouseenter(function(){
      clearInterval(self.timer)
    }).mouseleave(function(){
      // 再次开启自动轮播
      self.timer = setInterval(function(){
        self.moveNext();
      },self.options.interval);
    })
  }
  // jQuery插件实现
$.fn.myBanner = function(params){
    // params 是自定义的配置项
    var banner = new Banner(this,params);
    banner.init();
    // 如果需要链式调用
    return this;
  }
})(jQuery)

最后在HTML页面中进行初始化,最好放到HTML结束标签之前的位置,因为我们封装的插件是依赖于jQuery的,因此首先引入jQuery文件,然后在引入我们自己封装的js文件;最后就是进行初始化设置:

<script>
  $(function(){
     $('.mycontainer').myBanner({
      // speed:图片切换速度
      // interval:图片切换的时间间隔
       speed:500,
       interval:3000
     });
  })
 

</script>

到此为止,我们已经实现了轮播插件的封装并且实现了复用,只需要动态的绑定不同的元素mycontainer(可以动态修改成自己的元素名字)即可实现复用。

4、如果需要修改容器的大小和图片的大小,可以直接覆盖样式即可:

.mycontainer2{
  width: 300px;
  height:200px;
}
.mycontainer2 img{
  width: 300px;
  height:200px;
}

5、完成。恭喜你,你的轮播插件可以正常切换了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • js实现浏览器打印功能的示例代码

    这篇文章主要介绍了js如何实现浏览器打印功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-15
  • Nest.js参数校验和自定义返回数据格式详解

    这篇文章主要给大家介绍了关于Nest.js参数校验和自定义返回数据格式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-28
  • 利用JS实现点击按钮后图片自动切换的简单方法

    下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • JavaScript仿支付宝密码输入框

    那么今天我就用JavaScript代码来实现这个效果吧,那么首先介绍一下整个的思路,首先我们先将确定输入密码的位数,我的需求是5位,那么就用一个div标签包住5个input标签...2016-01-02
  • js+css实现回到顶部按钮(back to top)

    这篇文章主要为大家详细介绍了js+css实现回到顶部按钮back to top回到顶部按钮,感兴趣的小伙伴们可以参考一下...2016-03-03
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • js实现调用网络摄像头及常见错误处理

    这篇文章主要介绍了js实现调用网络摄像头及常见错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-07
  • JS实现随机生成验证码

    这篇文章主要为大家详细介绍了JS实现随机生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-06
  • js组件SlotMachine实现图片切换效果制作抽奖系统

    这篇文章主要介绍了js组件SlotMachine实现图片切换效果制作抽奖系统的相关资料,需要的朋友可以参考下...2016-04-19
  • vue.js 表格分页ajax 异步加载数据

    Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.这篇文章主要介绍了vue.js 表格分页ajax 异步加载数据的相关资料,需要的朋友可以参考下...2016-10-20
  • 基于JavaScript实现表单密码的隐藏和显示出来

    为了网站的安全性,很多朋友都把密码设的比较复杂,但是如何密码不能明显示,不知道输的是对是错,为了安全起见可以把密码显示的,那么基于js代码如何实现的呢?下面通过本文给大家介绍JavaScript实现表单密码的隐藏和显示,需要的朋友参考下...2016-03-03
  • js实现列表按字母排序

    这篇文章主要为大家详细介绍了js实现列表按字母排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-11
  • 基于JavaScript实现文字超出部分隐藏

    这篇文章主要介绍了基于JavaScript实现文字超出部分隐藏 的相关资料,需要的朋友可以参考下...2016-03-01
  • JS实现响应鼠标点击动画渐变弹出层效果代码

    这篇文章主要介绍了JS实现响应鼠标点击动画渐变弹出层效果代码,具有非常自然流畅的动画过度效果,涉及JavaScript针对鼠标事件的响应及页面元素样式的动态操作相关技巧,需要的朋友可以参考下...2016-03-28
  • node.JS md5加密中文与php结果不一致怎么办

    这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
  • 浅析AngularJS Filter用法

    系统的学习了一下angularjs,发现angularjs的有些思想根php的模块smarty很像,例如数据绑定,filter。如果对smarty比较熟悉的话,学习angularjs会比较容易一点,这篇文章给大家介绍angularjs filter用法详解,感兴趣的朋友一起学习吧...2015-12-29
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • NodeJS实现阿里大鱼短信通知发送

    本文给大家介绍的是nodejs实现使用阿里大鱼短信API发送消息的方法和代码,有需要的小伙伴可以参考下。...2016-01-20