原生js实现无缝轮播图效果


Posted in Javascript onJanuary 11, 2017

话不多说,请看代码

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>无缝轮播图-原生js封装</title>
 <link rel="shortcut icon" href="../public/image/favicon.ico" type="images/x-icon"/>
 <link rel="icon" href="../public/image/favicon.png" type="images/png"/>
 <link rel="stylesheet" type="text/css" href="../public/style/cssreset-min.css">
 <link rel="stylesheet" type="text/css" href="../public/style/common.css">
 <style type="text/css">
 /*公共*/
 html{
 height:100%;
 }
 body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
 margin: 0;
 padding: 0
 }
 body{
 position: relative;
 min-height:100%;
 font-size:14px;
 font-family: Tahoma, Verdana,"Microsoft Yahei";
 color:#333;
 }
 a{
 text-decoration: none;
 color:#333;
 }
 .header{
 width: 960px;
 padding-top: 15px;
 margin: 0 auto;
 line-height: 30px;
 text-align: right;
 }
 .header a{
 margin: 0 5px;
 }
 .main{
 width:960px;
 margin: 50px auto 0;
 }
 .code{
 border:1px dashed #e2e2e2;
 padding:10px 5px;
 margin-bottom:25px;
 }
 pre {
 font-family: "Microsoft Yahei",Arial,Helvetica;
 white-space: pre-wrap; /*css-3*/ 
 white-space: -moz-pre-wrap; /*Mozilla,since1999*/ 
 white-space: -pre-wrap; /*Opera4-6*/ 
 white-space: -o-pre-wrap; /*Opera7*/ 
 word-wrap: break-word; /*InternetExplorer5.5+*/
 }
 .example{
 padding-top:40px;
 margin-bottom:90px;
 }
 .example .call{
 padding:18px 5px;
 background:#f0f5f8;
 }
 .example h2{
 padding-top:20px;
 margin-bottom:7px;
 }
 .example table {
 width:100%;
 table-layout:fixed;
 border-collapse: collapse;
 border-spacing: 0;
 border: 1px solid #cee1ee;
 border-left: 0;
 }
 .example thead {
 border-bottom: 1px solid #cee1ee;
 background-color: #e3eef8;
 }
 .example tr {
 line-height: 24px;
 font-size: 13px;
 }
 .example tr:nth-child(2n) {
 background-color: #f0f5f8;
 }
 .example tr th,.example tr td {
 border-left: 1px solid #cee1ee;
 word-break: break-all;
 word-wrap: break-word;
 padding:0 10px;
 font-weight: normal;
 }
 .example tr th {
 color: #555;
 padding-top: 2px;
 padding-bottom: 2px;
 text-align: left;
 }
 /*公共*/
 .bannerha-container{
 width: 800px;
 height: 300px;
 margin: 20px auto;
 overflow: hidden;
 position: relative;
 }
 .bannerha-wrapper{
 width: 100%;
 height: 100%;
 position: absolute;
 display: -webkit-box;
 display: box;
 }
 .bannerha-slide{
 background: #ccc;
 list-style: none;
 width: 100%;
 height: 100%;
 text-align: center;
 font-size: 18px;
 display: -webkit-box;
 display: -ms-flexbox;
 display: -webkit-flex;
 display: flex;
 -webkit-box-pack: center;
 -ms-flex-pack: center;
 -webkit-justify-content: center;
 justify-content: center;
 -webkit-box-align: center;
 -ms-flex-align: center;
 -webkit-align-items: center;
 align-items: center;
 }
 .bannerha-pagination{
 position: absolute;
 text-align: center;
 z-index: 10;

 bottom: 10px;
 left: 0;
 width: 100%;
 }
 .bannerha-pagination-bullet{
 width: 8px;
 height: 8px;
 display: inline-block;
 border-radius: 100%;
 background: #fff;
 opacity: .5;
 margin: 0 4px;
 }
 .bannerha-pagination-bullet-active{
 opacity: 1;
 background: #ff0;
 }
 .bannerha-button{
 width: 100px;
 height: 100%;
 position: absolute;
 top: 0;
 background-color: #333;
 z-index: 1;
 cursor: pointer;
 filter: alpha(opacity:20);
 opacity: 0.2;
 -webkit-transition: all .2s ease-in;
 -moz-transition: all .2s ease-in;
 -ms-transition: all .2s ease-in;
 -o-transition: all .2s ease-in;
 transition: all .2s ease-in;
 }
 .bannerha-button.active{
 filter: alpha(opacity:60);
 opacity: 0.6;
 }
 .bannerha-button-prev{
 left:0;
 }
 .bannerha-button-next{
 right:0;
 }
 </style>
 <script type="text/javascript">
 /*封装代码*/
 (function() {
 var Bannerha = function(e, opts) {
 var self = this;
 var defaults = {
 circle: true,
 speeds: 20,
 pnBtn: true,
 autoPlay: true,
 times: 3000
 }
 opts = opts || {};
 for (var w in defaults) {
 if ("undefined" == typeof opts[w]) {
 opts[w] = defaults[w];
 }
 }
 this.params = opts;
 this.container = r(e);
 if (this.container.length > 1) {
 var x = [];
 return this.container.each(function() {
 x.push(new Bannerha(this, opts))
 }), x
 }
 this.containers = this.container[0];
 this.oUl = this.container.find(".bannerha-wrapper")[0];
 this.liW = this.oUl.children[0].offsetWidth;
 this.len = this.oUl.children.length;
 this.flag = true;
 this.num = 1;
 this.timer = null;
 this.timers = null;
 this.init();
 }
 Bannerha.prototype = {
 init: function() {
 var self = this;
 this.clone();
 if (this.params.pnBtn) {
 this.pnBtn();
 }
 if (this.params.circle) {
 this.circle();
 }
 if (this.params.autoPlay) {
 this.plays();
 this.boxmove()
 }
 },
 boxmove: function() {
 var self = this;
 this.container[0].addEventListener('mouseout', function(e) {
 self.plays();
 }, false);
 this.container[0].addEventListener('mouseover', function(e) {
 self.stops();
 }, false);
 },
 plays: function() {
 var self = this;
 this.timers = setInterval(function() {
 self.go(-self.liW);
 }, self.params.times);
 },
 stops: function() {
 clearInterval(this.timers)
 },
 clone: function() {
 var fir = this.oUl.children[0].cloneNode(true),
 last = this.oUl.children[this.len - 1].cloneNode(true);
 this.oUl.appendChild(fir);
 this.oUl.insertBefore(last, this.oUl.children[0]);
 this.len = this.oUl.children.length;
 this.oUl.style.left = -this.liW + 'px';
 },
 pnBtn: function() {
 var self = this;
 this.container.append('<div class="bannerha-button bannerha-button-prev"></div><div class="bannerha-button bannerha-button-next"></div>');
 this.container[0].addEventListener('click', function(e) {
 self.events(e)
 }, false);
 this.container[0].addEventListener('mouseover', function(e) {
 self.eventsover(e)
 }, false);
 },
 circle: function() {
 var self = this;
 var pagination = document.createElement("div");
 pagination.className = "bannerha-pagination";
 for (var i = 0; i < self.len - 2; i++) {
 var btnspan = document.createElement("span");
 btnspan.className = "bannerha-pagination-bullet";
 pagination.appendChild(btnspan);
 }
 this.containers.appendChild(pagination);
 this.bullet = this.container.find(".bannerha-pagination-bullet");
 this.bullet[0].classList.add("bannerha-pagination-bullet-active");
 for (var i = 0; i < this.bullet.length; i++) {
 ! function(i) {
 self.bullet[i].addEventListener('click', function(e) {
 if (!self.flag) {
 return;
 }
 if (this.className.indexOf('bannerha-pagination-bullet-active') > -1) {
 return;
 }
 var myIndex = i - (self.num - 1);
 var offset = -self.liW * myIndex;
 self.go(offset);
 self.num = i + 1;
 self.showButton();
 }, false);
 }(i);
 }
 },
 events: function(e) {
 var self = this;
 var oSrc = e.srcElement || e.target;
 if (oSrc.tagName.toLowerCase() == 'div' && oSrc.className.indexOf('bannerha-button-prev') > -1) {
 if (!this.flag) {
 return;
 }
 self.go(this.liW);
 if (self.params.circle) {
 self.showButton();
 }
 }
 if (oSrc.tagName.toLowerCase() == 'div' && oSrc.className.indexOf('bannerha-button-next') > -1) {
 if (!this.flag) {
 return;
 }
 self.go(-this.liW);
 if (self.params.circle) {
 self.showButton();
 }
 }
 },
 eventsover: function(e) {
 var self = this;
 var oSrc = e.srcElement || e.target;
 if (oSrc.className.indexOf('bannerha-button') > -1) {
 oSrc.classList.add("active")
 oSrc.addEventListener('mouseout', function(e) {
 oSrc.classList.remove("active");
 }, false);
 }
 },
 showButton: function() {
 var self = this;
 var num = this.num - 1;
 for (var i = 0; i < this.bullet.length; i++) {
 this.bullet[i].classList.remove("bannerha-pagination-bullet-active");
 }
 this.bullet[num].classList.add("bannerha-pagination-bullet-active");
 },
 go: function(offset) {
 var self = this;
 if (self.flag) {
 self.flag = false;
 if (offset < 0) {
 self.num++;
 if (self.num > self.len - 2) {
 self.num = 1;
 }
 }
 if (offset > 0) {
 self.num--;
 if (self.num <= 0) {
 self.num = self.len - 2
 }
 }
 var srty = parseInt(self.oUl.style.left) + offset;
 if (parseInt(self.oUl.style.left) < srty || parseInt(self.oUl.style.left) > srty) {
 self.timer = setInterval(function() {
 var mernum = parseInt(self.oUl.style.left);
 var speed = (srty - mernum) / 10;
 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
 self.oUl.style.left = parseInt(self.oUl.style.left) + speed + 'px';
 if (parseInt(self.oUl.style.left) == srty) {
 clearInterval(self.timer);
 self.oUl.style.left = srty + 'px';
 if (srty > -self.liW) {
 self.oUl.style.left = -self.liW * (self.len - 2) + 'px';
 }
 if (srty < -self.liW * (self.len - 2)) {
 self.oUl.style.left = -self.liW + 'px';
 }
 self.flag = true;
 }
 }, self.params.speeds)
 }
 }
 }
 }
 var r = (function() {
 var e = function(e) {
 var a = this,
 t = 0;
 for (t = 0; t < e.length; t++) {
 a[t] = e[t];
 }
 return a.length = e.length, this
 };
 e.prototype = {
 addClass: function(e) {
 if ("undefined" == typeof e) return this;
 for (var a = e.split(" "), t = 0; t < a.length; t++)
 for (var r = 0; r < this.length; r++) this[r].classList.add(a[t]);
 return this
 },
 each: function(e) {
 for (var a = 0; a < this.length; a++) e.call(this[a], a, this[a]);
 return this
 },
 html: function(e) {
 if ("undefined" == typeof e) return this[0] ? this[0].innerHTML : void 0;
 for (var a = 0; a < this.length; a++) this[a].innerHTML = e;
 return this
 },
 find: function(a) {
 for (var t = [], r = 0; r < this.length; r++)
 for (var i = this[r].querySelectorAll(a), s = 0; s < i.length; s++) t.push(i[s]);
 return new e(t)
 },
 append: function(a) {
 var t, r;
 for (t = 0; t < this.length; t++)
 if ("string" == typeof a) {
 var i = document.createElement("div");
 for (i.innerHTML = a; i.firstChild;) this[t].appendChild(i.firstChild)
 } else if (a instanceof e)
 for (r = 0; r < a.length; r++) this[t].appendChild(a[r]);
 else this[t].appendChild(a);
 return this
 },
 }
 var a = function(a, t) {
 var r = [],
 i = 0;
 if (a && !t && a instanceof e) {
 return a;
 }
 if (a) {
 if ("string" == typeof a) {
 var s, n, o = a.trim();
 if (o.indexOf("<") >= 0 && o.indexOf(">") >= 0) {
 var l = "div";
 for (0 === o.indexOf("<li") && (l = "ul"), 0 === o.indexOf("<tr") && (l = "tbody"), (0 === o.indexOf("<td") || 0 === o.indexOf("<th")) && (l = "tr"), 0 === o.indexOf("<tbody") && (l = "table"), 0 === o.indexOf("<option") && (l = "select"), n = document.createElement(l), n.innerHTML = a, i = 0; i < n.childNodes.length; i++) r.push(n.childNodes[i])
 } else
 for (s = t || "#" !== a[0] || a.match(/[ .<>:~]/) ? (t || document).querySelectorAll(a) : [document.getElementById(a.split("#")[1])], i = 0; i < s.length; i++) s[i] && r.push(s[i])
 } else if (a.nodeType || a === window || a === document) {
 r.push(a);
 } else if (a.length > 0 && a[0].nodeType) {
 for (i = 0; i < a.length; i++) {
 r.push(a[i]);
 }
 }
 }
 return new e(r)
 };
 return a;
 }())
 window.bannerha = Bannerha;
 })()
 /*封装代码*/
 </script>
</head>
<body>
 <div class="header">
 <a href="https://github.com/huanghanzhilian/widget" target="_blank">项目地址</a>
 <a href="/widget/">返回首页</a>
 </div>
 <div class="main">
 <div class="bannerha-container" id="banner1">
 <ul class="bannerha-wrapper" >
 <li class="bannerha-slide">slide-1</li>
 <li class="bannerha-slide">slide-2</li>
 <li class="bannerha-slide">slide-3</li>
 <li class="bannerha-slide">slide-4</li>
 <li class="bannerha-slide">slide-5</li>
 </ul>
 </div>
 <script type="text/javascript">
 new bannerha("#banner1");
 </script>
 <div class="code">
 <p>
 不传参数,执行默认参数,自动轮播
 </p>
 <p>new bannerha("#banner1");</p>
 </div>
 <div class="bannerha-container" id="banner2">
 <ul class="bannerha-wrapper" >
 <li class="bannerha-slide">slide-1</li>
 <li class="bannerha-slide">slide-2</li>
 <li class="bannerha-slide">slide-3</li>
 <li class="bannerha-slide">slide-4</li>
 <li class="bannerha-slide">slide-5</li>
 </ul>
 </div>
 <script type="text/javascript">
 new bannerha("#banner2",{
 circle: true,
 speeds: 50,
 pnBtn: true,
 autoPlay: true,
 times: 1500
 });
 </script>
 <div class="code">
 <p>
 调整自动轮播速度和缓冲速度
 </p>
 <p>new bannerha("#banner2",{
 circle: true,
 speeds: 50,
 pnBtn: true,
 autoPlay: true,
 times: 1500
 });</p>
 </div>
 <div class="bannerha-container" id="banner3">
 <ul class="bannerha-wrapper" >
 <li class="bannerha-slide">slide-1</li>
 <li class="bannerha-slide">slide-2</li>
 <li class="bannerha-slide">slide-3</li>
 <li class="bannerha-slide">slide-4</li>
 <li class="bannerha-slide">slide-5</li>
 </ul>
 </div>
 <script type="text/javascript">
 new bannerha("#banner3",{
 autoPlay: false
 });
 </script>
 <div class="code">
 <p>
 关闭自动轮播
 </p>
 <p>new bannerha("#banner3",{
 autoPlay: false
 });</p>
 </div>
 <div class="bannerha-container" id="banner4">
 <ul class="bannerha-wrapper" >
 <li class="bannerha-slide">slide-1</li>
 <li class="bannerha-slide">slide-2</li>
 <li class="bannerha-slide">slide-3</li>
 <li class="bannerha-slide">slide-4</li>
 <li class="bannerha-slide">slide-5</li>
 </ul>
 </div>
 <script type="text/javascript">
 new bannerha("#banner4",{
 pnBtn: false
 });
 </script>
 <div class="code">
 <p>
 关闭左右切换按钮
 </p>
 <p>new bannerha("#banner4",{
 pnBtn: false
 });</p>
 </div>
 <div class="bannerha-container" id="banner5">
 <ul class="bannerha-wrapper" >
 <li class="bannerha-slide">slide-1</li>
 <li class="bannerha-slide">slide-2</li>
 <li class="bannerha-slide">slide-3</li>
 <li class="bannerha-slide">slide-4</li>
 <li class="bannerha-slide">slide-5</li>
 </ul>
 </div>
 <script type="text/javascript">
 new bannerha("#banner5",{
 circle: false
 });
 </script>
 <div class="code">
 <p>
 关闭底部小按钮
 </p>
 <p>new bannerha("#banner5",{
 circle: false
 });</p>
 </div>
 <div class="example">
 <div class="call">
 <h1>调用方法:</h1>
 <p>new bannerha(selector,{options});</p>
 </div>
 <h2>options参数</h2>
 <table>
 <thead>
 <tr>
 <th width="150">参数</th>
 <th width="100">默认值</th>
 <th>说明</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>circle</td>
 <td>true</td>
 <td>是否生成底部圆圈按钮</td>
 </tr>
 <tr>
 <td>speeds</td>
 <td>20</td>
 <td>设置缓冲运动速度</td>
 </tr>
 <tr>
 <td>pnBtn</td>
 <td>true</td>
 <td>是否生成左右切换按钮</td>
 </tr>
 <tr>
 <td>autoPlay</td>
 <td>true</td>
 <td>是否自动轮播</td>
 </tr>
 <tr>
 <td>times</td>
 <td>3000</td>
 <td>设置自动轮播间隔时间</td>
 </tr>
 </tbody>
 </table>
 </div>
 </div>
</body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
js 浮动层菜单收藏
Jan 16 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
Apr 27 Javascript
js控制淡入淡出示例代码
Nov 12 Javascript
JS实现生成会变大变小的圆环实例
Aug 05 Javascript
javascript实现九宫格相加数值相等
May 28 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
JavaScript重定向URL参数的两种方法小结
Oct 19 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
ES6数组与对象的解构赋值详解
Jun 14 Javascript
Element Steps步骤条的使用方法
Jul 26 Javascript
原生js实现无缝轮播图效果
Jan 28 Javascript
Bootstrap 填充Json数据的实例代码
Jan 11 #Javascript
原生js实现放大镜效果
Jan 11 #Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
Jan 11 #Javascript
微信小程序开发经验总结(推荐)
Jan 11 #Javascript
bootstrap手风琴制作方法详解
Jan 11 #Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 #Javascript
微信小程序 本地存储及登录页面处理实例详解
Jan 11 #Javascript
You might like
用文本作数据处理
2006/10/09 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
浅谈Python中函数的参数传递
2016/06/21 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python编程求质数实例代码
2018/01/31 Python
python模拟表单提交登录图书馆
2018/04/27 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
南京青奥会口号
2014/06/12 职场文书
稽核岗位职责范本
2015/04/13 职场文书
导游带团欢迎词
2015/09/30 职场文书
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技