/jQuery/FullScreen/js/index2-3.js

https://github.com/CruxF/IMOOC · JavaScript · 186 lines · 151 code · 21 blank · 14 comment · 42 complexity · e8b64289511464af6bf71579bd806382 MD5 · raw file

  1. (function ($) {
  2. var privateFun = function () {
  3. }
  4. var PageSwitch = (function () {
  5. function PageSwitch(element, options) {
  6. this.settings = $.extend(true, $.fn.PageSwitch.defaults, options || {});
  7. this.element = element;
  8. this.init();
  9. }
  10. PageSwitch.prototype = {
  11. //说明:初始化插件
  12. //实现:初始化dom结构,布局,分页及绑定事件
  13. init: function () {
  14. var me = this;
  15. me.selectors = me.settings.selectors;
  16. me.sections = me.element.find(me.selectors.sections);
  17. me.section = me.sections.find(me.selectors.section);
  18. me.direction = me.settings.direction == "vertical" ? true : false;
  19. me.pagesCount = me.pagesCount();
  20. me.index = (me.settings.index >= 0 && me.settings.index < me.pagesCount) ? me.settings.index : 0;
  21. if (!me.direction) {
  22. me._initLayout();
  23. }
  24. if (me.settings.pagination) {
  25. me._initPaging();
  26. }
  27. me._initEvent();
  28. },
  29. //说明:获取滑动页面数量
  30. pagesCount: function () {
  31. return me.section.length;
  32. },
  33. //说明:获取滑动的宽度(横屏滑动)或高度(竖屏滑动)
  34. switchLength: function () {
  35. return this.direction == 1 ? this.element.height() : this.element.width();
  36. },
  37. //说明:向前滑动即上一页面
  38. prev: function () {
  39. var me = this;
  40. if (me.index > 0) {
  41. me.index--;
  42. } else if (me.settings.loop) {
  43. me.index = me.pagesCount - 1;
  44. }
  45. me._scrollPage();
  46. },
  47. //说明:向后滑动即下一页面
  48. next: function () {
  49. var me = this;
  50. if (me.index < me.pagesCount) {
  51. me.index++;
  52. } else if (me.settings.loop) {
  53. me.index = 0;
  54. }
  55. me._scrollPage();
  56. },
  57. //说明:主要针对横屏情况进行页面布局
  58. _initLayout: function () {
  59. var me = this;
  60. var width = (me.pagesCount * 100) + "%";
  61. var cellWidth = (100 / me.pagesCount).toFixed(2) + "%";
  62. me.sections.width(width);
  63. me.section.width(cellWidth).css("float", "left");
  64. },
  65. //说明:实现分页的dom结构及CSS样式
  66. _initPaging: function () {
  67. var me = this;
  68. var pagesClass = me.selectors.page.substring(1);
  69. me.activeClass = me.selectors.active.substring(1);
  70. var pageHtml = "<ul class=" + pagesClass + ">";
  71. for (var i = 0; i < me.pagesCount; i++) {
  72. pageHtml += "<li></li>";
  73. }
  74. me.element.append(pageHtml);
  75. var pages = me.element.find(me.selectors.page);
  76. me.pageItem = pages.find("li");
  77. me.pageItem.eq(me.index).addClass(me.activeClass);
  78. if (me.direction) {
  79. pages.addClass("vertical");
  80. } else {
  81. pages.addClass("horizontal");
  82. }
  83. },
  84. //说明:初始化插件事件
  85. _initEvent: function () {
  86. var me = this;
  87. //绑定分页click事件
  88. me.element.on("click", me.selectors.page + " li", function () {
  89. me.index = $(this).index();
  90. me._scrollPage();
  91. });
  92. //绑定鼠标滚轮事件
  93. me.element.on("mousewheel DOMMouseScroll", function (e) {
  94. var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
  95. if (delta > 0 && (me.index && !me.settings.loop || me.settings.loop)) {
  96. me.prve();
  97. } else if (delta < 0 && (me.index < (me.pagesCount - 1) && !me.settings.loop || me.settings.loop)) {
  98. me.next();
  99. }
  100. });
  101. //绑定键盘事件
  102. if (me.settings.keyboard) {
  103. $(window).keydown(function (e) {
  104. var keyCode = e.keyCode;
  105. if (keyCode == 37 || keyCode == 38) {
  106. me.prve();
  107. } else if (keyCode == 39 || keyCode == 40) {
  108. me.next();
  109. }
  110. });
  111. }
  112. //绑定窗口改变事件
  113. $(window).resize(function () {
  114. var currentLength = me.switchLength();
  115. var offset = me.settings.direction ? me.section.eq(me.index).offset().top : me.section.eq(me.index).offset().left;
  116. if (Math.abs(offset) > currentLength / 2 && me.index < (me.pagesCount - 1)) {
  117. me.index++;
  118. }
  119. if (me.index) {
  120. me._scrollPage();
  121. }
  122. });
  123. /*支持CSS3动画的浏览器,绑定transitionend事件(即在动画结束后调用起回调函数)*/
  124. me.sections.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend", function () {
  125. if (me.settings.callback && $.type(me.settings.callback) === "function") {
  126. me.settings.callback();
  127. }
  128. });
  129. }
  130. };
  131. return PageSwitch;
  132. })();
  133. $.fn.PageSwitch = function (options) {
  134. return this.each(function () {
  135. var me = $(this);
  136. var instance = me.data("PageSwitch");
  137. if (!instance) {
  138. instance = new PageSwitch(me, options);
  139. me.data("PageSwitch", instance);
  140. }
  141. if ($.type(options) === "string") {
  142. return instance[options]();
  143. }
  144. });
  145. }
  146. $.fn.PageSwitch.defaults = {
  147. selectors: {
  148. sections: ".sections",
  149. section: ".section",
  150. page: ".pages",
  151. active: ".active",
  152. },
  153. index: 0, //页面开始的索引
  154. easing: "ease", //动画效果
  155. duration: 500, //动画执行时间
  156. loop: false, //是否循环切换
  157. pagination: true, //是否进行分页
  158. keyboard: true, //是否触发键盘事件
  159. direction: "vertical", //滑动方向vertical,horizontal
  160. callback: "" //回调函数
  161. };
  162. $(function () {
  163. $('[data-PageSwitch]').PageSwitch();
  164. });
  165. })(jQuery);