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


Posted in Javascript onJuly 31, 2020

前言:页面中轮播图,对于一个前端开发者来说,是最基本的技能,不论是的商城网站,还是企业站,轮播图已经成为不可缺少的一个模块,而常见的轮播图不外乎两种,一种是渐隐渐现轮播图,一种是无缝轮播图。网上关于轮播图的件也有很多,但是用人家的代码总会出现各种各样的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、完成。恭喜你,你的轮播插件可以正常切换了

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

Javascript 相关文章推荐
setTimeout与setInterval在不同浏览器下的差异
Jan 24 Javascript
js replace正则表达式应用案例讲解
Jan 17 Javascript
自己写了一个展开和收起的多更能型的js效果
Mar 05 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
Feb 13 Javascript
javascript的document.referrer浏览器支持、失效情况总结
Jul 18 Javascript
javascript结合Canvas 实现简易的圆形时钟
Mar 11 Javascript
js倒计时简单实现方法
Dec 17 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
详解jQuery中ajax.load()方法
Jan 25 Javascript
Vue-Router实现组件间跳转的三种方法
Nov 07 Javascript
VSCode使用之Vue工程配置eslint
Apr 30 Javascript
原生js滑动轮播封装
Jul 31 #Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
Jul 31 #Javascript
jquery轮播图插件使用方法详解
Jul 31 #jQuery
在Uni中使用Vue的EventBus总线机制操作
Jul 31 #Javascript
jQuery带控制按钮轮播图插件
Jul 31 #jQuery
Vue之封装公用变量以及实现方式
Jul 31 #Javascript
three.js 将图片马赛克化的示例代码
Jul 31 #Javascript
You might like
PHP学习之PHP表达式
2006/10/09 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
JavaScript入门之事件、cookie、定时等
2011/10/21 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
python方法生成txt标签文件的实例代码
2018/05/10 Python
pytorch构建多模型实例
2020/01/15 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
植物选择:Botanic Choice
2017/02/15 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
C++的几个面试题附答案
2016/08/03 面试题
自考生自我鉴定范文
2013/10/01 职场文书
家佳咖啡店创业计划书
2013/12/27 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android