// index.html ... <div class="demo"> <ul id="bannerWrap"> <li class="bannerItem"><a href=""><img src="" /></a></li> <li class="bannerItem"><a href=""><img src="" /></a></li> <li class="bannerItem"><a href=""><img src="" /></a></li> <li class="bannerItem"><a href=""><img src="" /></a></li> </ul> <ul id="pointsWrap"> <li class="pointItem on"></li> <li class="pointItem"></li> <li class="pointItem"></li> <li class="pointItem"></li> </ul> </div> ...
// banner.css//轮播图 ul 建议采用flex布局#bannerWrap { width: 100%; display: flex;}.bannerItem{ flex: 0 0 100%; align-items: center;}
// main.js中使用BSlider({ checkTime: 3000, transTime: 600, bannerWrap: '#bannerWrap', childBanner: '.bannerItem', points: '.pointItem', pointOn: 'on'});// BSlider.js/* @name: BSlider.js* @version: 1.1.0* @author: liyang* @Created: 2016-12-27* @Edited: 2017-03-07* @description 轮播图组件* @params: {* checkTime: [Number], //轮播图切换频率,单位ms,选填,默认值 3000* transTime: [Number], //轮播图过渡频率,单位ms,选填,默认值 500* bannerWrap: [String], //轮播图父容器选择器(例如'#bannerWrap'),必填* childBanner: [String], //轮播图子图选择器,必填* points: [String], //焦点圆钮选择器,必填* pointOn: [String] //焦点激活类名,必填* }*/(function(name, def) { //检测上下文环境是否为AMD或者CMD var hasDefine = typeof define === 'function', hasExports = typeof module !== 'undefined' && module.exports; if (hasDefine) { // AMD环境或CMD环境 define(def); } else if (hasExports) { //定义为普通Node模块 module.exports = def(); } else { //将模块的执行结果挂在window变量中,在浏览器中this指向window对象 this[name] = def(); }})('BSlider', function() { var BSlider = function(o) { var defaults = { checkTime: 2000, transTime: 500, bannerWrap: '', childBanner: '', points: '', pointOn: '' }; for (key in o) { defaults[key] = o[key]; } var bw = defaults.bannerWrap, cb = defaults.childBanner, pts = defaults.points, ptOn = defaults.pointOn; //bannerWrap, childBanner, points, pointOn必填 if (o === null || typeof o !== 'object' || !bw || !cb || !pts || !ptOn) { throw new Error('【 bannerWrap, childBanner, points, pointOn are necessary 】'); return false; } //轮播图父容器 var bannerBox = document.querySelector(defaults.bannerWrap), width = bannerBox.offsetWidth, //轮播图 子图 banners = bannerBox.querySelectorAll(defaults.childBanner), //圆点 && 计时器 timer, count = 1, checkTime = defaults.checkTime, transTime = defaults.transTime, points = document.querySelectorAll(defaults.points), //触摸点 moveX = 0, startX = 0, distanceX = 0, //判断是否滑动 isMove = false; // 轮播对象 var Bn = { doInit: function() { Bn.initBannerImg(); Bn.setTimer(); Bn.TOUCH(); }, //混合器 _extend: function(targetObj, utilObj) { for (key in utilObj) { targetObj[key] = utilObj[key]; } }, //初始化轮播图数量 initBannerImg: function() { Bn.setTranslateX(bannerBox, -count * width); var cloneFirst = banners[0].cloneNode(true); var cloneLast = banners[banners.length - 1].cloneNode(true); //复制第一张放末尾,复制最后一张放最前 bannerBox.appendChild(cloneFirst); bannerBox.insertBefore(cloneLast, bannerBox.childNodes[0]); Bn.setTranslateX(bannerBox, -count * width); }, //监听过渡结束 transitionEnd: function(el, cb) { if (el && typeof el === 'object') { el.addEventListener('webkitTransitionEnd', function() { cb && cb(); }) el.addEventListener('transitionEnd', function() { cb && cb(); }) } //解除禁止页面上下滚动 document.querySelector('body').removeEventListener('touchstart', Bn.forbidScroll); }, //添加过渡 addTransition: function(el) { var cs1 = { webkitTransition: "all " + transTime + "ms", transition: "all " + transTime + "ms" } Bn._extend(el.style, cs1); }, //删除过渡 removeTransition: function(el) { var cs2 = { webkitTransition: "none", transition: "none" } Bn._extend(el.style, cs2); }, //设置位移 setTranslateX: function(el, w) { var cs3 = { webkitTransform: "translateX(" + w + "px)", transform: "translateX(" + w + "px)" } Bn._extend(el.style, cs3); }, //初始化定时器 setTimer: function() { timer = setInterval(function() { count++; //开始轮播 Bn.addTransition(bannerBox); Bn.setTranslateX(bannerBox, -count * width); Bn.setPoint(); }, checkTime); Bn.transitionEnd(bannerBox, function() { //设置当前点 Bn.getCount(); //动画结束刷新状态 Bn.removeTransition(bannerBox); Bn.setTranslateX(bannerBox, -count * width); }); }, //限制当前 count getCount: function() { if (count >= points.length + 1) { count = 1; } else if (count <= 0) { count = points.length; } }, hasClass: function(el, cls) { cls = cls || ''; if (cls.replace(/\s/g, '').length == 0) return false; //当cls没有参数时,返回false return new RegExp(' ' + cls + ' ').test(' ' + el.className + ' '); }, addClass: function(el, cls) { if (!Bn.hasClass(el, cls)) { el.className = el.className == '' ? cls : el.className + ' ' + cls; } }, removeClass: function(el, cls) { if (Bn.hasClass(el, cls)) { var newClass = ' ' + el.className.replace(/[\t\r\n]/g, '') + ' '; while (newClass.indexOf(' ' + cls + ' ') >= 0) { newClass = newClass.replace(' ' + cls + ' ', ' '); } el.className = newClass.replace(/^\s+|\s+$/g, ''); } }, //点动 setPoint: function() { var arrs = []; for (var i = 0; i < points.length; i++) { arrs.push(points[i]); } arrs.forEach(function(v, i) { Bn.removeClass(v, 'on'); // v.className = ""; }) Bn.getCount(); Bn.addClass(arrs[count - 1], defaults.pointOn); // arrs[count - 1].className = defaults.pointOn; }, //触摸焦点图时禁止页面滚动 forbidScroll: function(evt) { evt.preventDefault(); }, TOUCH: function() { bannerBox.addEventListener('touchstart', function(e) { //禁止页面滑动 document.querySelector('body').addEventListener('touchstart', Bn.forbidScroll); //清除定时器 clearInterval(timer); startX = e.touches[0].clientX; }); bannerBox.addEventListener('touchmove', function(e) { isMove = true; moveX = e.touches[0].clientX; distanceX = moveX - startX; Bn.removeTransition(bannerBox); Bn.setTranslateX(bannerBox, -count * width + distanceX); }); bannerBox.addEventListener('touchend', function(e) { //滑动距离超过十分之一屏即切换,否则回弹 if (Math.abs(distanceX) > (width / 10) && isMove) { if (distanceX > 0) { count--; } else { count++; } } Bn.addTransition(bannerBox); Bn.setTranslateX(bannerBox, -count * width); //重置参数 startX = moveX = distanceX = 0; isMove = false; //重置状态 clearInterval(timer); Bn.setTimer(); Bn.setPoint(); }); } } Bn.doInit(); } return BSlider;})