zepto.hwSlider.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /*
  2. * hwSlider内容滑动切换插件(基于Zepto) - v1.0
  3. * by 月光光
  4. * http://www.helloweba.com
  5. */
  6. ;(function ($, window, document, undefined) {
  7. var HwSlider = function (ele, opt) {
  8. var self = this;
  9. self.$element = ele,
  10. self.defaults = {
  11. width: 600, //初始宽度
  12. height: 320, //初始高度
  13. start: 1, //初始滑动位置,从第几个开始滑动
  14. interval: 3000, //间隔时间,单位ms
  15. autoPlay: false, //是否自动滑动
  16. dotShow: true, //是否显示圆点导航
  17. arrShow: true, //是否显示左右方向箭头导航
  18. touch: true //是否支持触摸滑动
  19. },
  20. self.options = $.extend({}, self.defaults, opt)
  21. }
  22. HwSlider.prototype = {
  23. init: function () {
  24. var self = this,
  25. ele = self.$element;
  26. var sliderInder = ele.children('ul')
  27. var hwsliderLi = sliderInder.children('li');
  28. var hwsliderSize = hwsliderLi.length; //滑块的总个数
  29. var index = self.options.start;
  30. var touchStartY = 0, touchStartX = 0;
  31. for (i = 1; i <= hwsliderSize; i++) {
  32. if (index == i) hwsliderLi.eq(index - 1).css('display', 'block');
  33. }
  34. //显示左右方向键
  35. if (self.options.arrShow) {
  36. var arrElement = '<a href="javascript:;" class="arr prev">&lt;</a><a href="javascript:;" class="arr next">&gt;</a>';
  37. ele.append(arrElement);
  38. }
  39. //显示圆点导航
  40. if (self.options.dotShow) {
  41. var dot = '';
  42. if (hwsliderSize == 1) return false;
  43. for (i = 1; i <= hwsliderSize; i++) {
  44. if (index == i) {
  45. dot += '<span data-index="' + i + '" class="active"></span>';
  46. } else {
  47. dot += '<span data-index="' + i + '"></span>';
  48. }
  49. }
  50. var dotElement = '<div class="dots">' + dot + '</div>';
  51. ele.append(dotElement);
  52. }
  53. //初始化组件
  54. var resize = function () {
  55. var sWidth = ele.width();
  56. //根据滑块宽度等比例缩放高度
  57. var sHeight = self.options.height / self.options.width * sWidth;
  58. // ele.css('height',sHeight);
  59. if (self.options.arrShow) {
  60. var arrOffset = (sHeight - 40) / 2;
  61. ele.find(".arr").css('top', arrOffset + 'px'); //导航箭头位置
  62. }
  63. /*if(self.options.dotShow){
  64. var dotWidth = hwsliderSize*20;
  65. var dotOffset = (sWidth-dotWidth)/2;
  66. ele.find(".dots").css('left',dotOffset+'px'); //导航圆点位置
  67. }*/
  68. }
  69. // ele.css('height',self.options.height);
  70. resize();
  71. //窗口大小变换时自适应
  72. $(window).resize(function () {
  73. resize();
  74. });
  75. //点击导航圆点
  76. if (self.options.dotShow) {
  77. ele.find(".dots span").on('click', function (event) {
  78. event.preventDefault();
  79. if (self.clickable) {
  80. var dotIndex = $(this).data('index');
  81. if (dotIndex > index) {
  82. dir = 'next';
  83. } else {
  84. dir = 'prev';
  85. }
  86. if (dotIndex != index) {
  87. index = dotIndex;
  88. self.moveTo(index, dir);
  89. }
  90. }
  91. });
  92. }
  93. if (self.options.arrShow) {
  94. //点击右箭头
  95. ele.find('.next').on('click', function (event) {
  96. event.preventDefault();
  97. if (index >= hwsliderSize) {
  98. index = 1;
  99. } else {
  100. index += 1;
  101. }
  102. self.moveTo(index, 'next');
  103. });
  104. //点击左箭头
  105. ele.find(".prev").on('click', function (event) {
  106. event.preventDefault();
  107. if (index == 1) {
  108. index = hwsliderSize;
  109. } else {
  110. index -= 1;
  111. }
  112. self.moveTo(index, 'prev');
  113. });
  114. }
  115. //自动滑动
  116. if (self.options.autoPlay) {
  117. var timer;
  118. var play = function () {
  119. index++;
  120. if (index > hwsliderSize) {
  121. index = 1;
  122. }
  123. self.moveTo(index, 'next');
  124. }
  125. timer = setInterval(play, self.options.interval); //设置定时器
  126. }
  127. ;
  128. //触摸滑动
  129. if (self.options.touch) {
  130. hwsliderLi.on({
  131. //触控开始
  132. 'touchstart': function (e) {
  133. touchStartY = e.touches[0].clientY;
  134. touchStartX = e.touches[0].clientX;
  135. },
  136. //触控结束
  137. 'touchend': function (e) {
  138. var touchEndY = e.changedTouches[0].clientY,
  139. touchEndX = e.changedTouches[0].clientX,
  140. yDiff = touchStartY - touchEndY,
  141. xDiff = touchStartX - touchEndX;
  142. //判断滑动方向
  143. if (Math.abs(xDiff) > Math.abs(yDiff)) {
  144. if (xDiff > 5) {
  145. if (index >= hwsliderSize) {
  146. index = 1;
  147. } else {
  148. index += 1;
  149. }
  150. self.moveTo(index, 'next');
  151. } else {
  152. if (index == 1) {
  153. index = hwsliderSize;
  154. } else {
  155. index -= 1;
  156. }
  157. self.moveTo(index, 'prev');
  158. }
  159. }
  160. touchStartY = null;
  161. touchStartX = null;
  162. },
  163. //触控移动
  164. 'touchmove': function (e) {
  165. if (e.preventDefault) {
  166. e.preventDefault();
  167. }
  168. }
  169. });
  170. }
  171. },
  172. //滑动移动
  173. moveTo: function (index, dir) {
  174. var self = this,
  175. ele = self.$element;
  176. var dots = ele.find(".dots span");
  177. var sliderInder = ele.children('ul');
  178. var hwsliderLi = sliderInder.children('li');
  179. var hwsliderSize = hwsliderLi.length;
  180. if (dir == 'next') {
  181. //当前滑块动画
  182. hwsliderLi.removeAttr('class').css('display', 'none');
  183. hwsliderLi.eq(index - hwsliderSize).addClass('moveout_right').css('display', 'block');
  184. //下一个滑块动画
  185. hwsliderLi.removeClass('active').eq(index - 1).addClass('movein_right').css('display', 'block');
  186. } else {
  187. //当前滑块动画
  188. hwsliderLi.removeAttr('class').css('display', 'none');
  189. hwsliderLi.eq(index - hwsliderSize).addClass('moveout_left').css('display', 'block');
  190. //下一个滑块动画
  191. hwsliderLi.removeClass('active').eq(index - 1).addClass('movein_left').css('display', 'block');
  192. }
  193. //self.clickable = true;
  194. //显示可切换的圆点
  195. dots.removeClass('active');
  196. dots.eq(index - 1).addClass('active');
  197. }
  198. }
  199. $.fn.hwSlider = function (options) {
  200. var hwSlider = new HwSlider(this, options);
  201. return this.each(function () {
  202. hwSlider.init();
  203. });
  204. };
  205. })(Zepto, window, document);