zepto.hwSlider.js 8.3 KB

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