slide_index.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. (function ($) {
  2. /**
  3. * 2018-9-20 星期四
  4. * //默认参数 (放在插件外面,避免每次调用插件都调用一次,节省内存)
  5. * =============================================================
  6. * 由于放在此处会造成缓存,影响下次插件使用 (已放下面插件中)
  7. *
  8. var defaults = {
  9. ratio: '100', //滑动最大值
  10. value: '', //默认值,range为true时 此时绑定值是一个数组
  11. range: false,//是否开启双向滑动
  12. clickBack: function(){
  13. }
  14. };
  15. */
  16. //设置全局变量
  17. var opts,isDown = false,index;
  18. //扩展方法
  19. $.fn.extend({
  20. slide: function(options){
  21. //默认参数
  22. var defaults = {
  23. ratio: '100', //滑动最大值
  24. value: '', //默认值,range为true时 此时绑定值必须是一个数组
  25. range: false,//是否开启双向滑动
  26. clickBack: function(){
  27. }
  28. };
  29. //扩展对象,覆盖默认对象
  30. opts = $.extend(defaults, options);
  31. return this.each(function(){
  32. var html,obj = $(this);
  33. if(opts.range){//判断是否开启双向滑动
  34. html = '<div class="range">'+
  35. '<span class="chunk-one" data-index="1">'+
  36. '<strong>0</strong>'+
  37. '</span>'+
  38. '<span class="chunk-two" data-index="2">'+
  39. '<strong>'+opts.ratio+'</strong>'+
  40. '</span>'+
  41. '<div class="strip-one">'+
  42. '</div>'+
  43. '<div class="strip-two">'+
  44. '</div>'+
  45. '</div>';
  46. }else{//单滑块
  47. html = '<div class="range">'+
  48. '<span class="chunk-two" data-index="2">'+
  49. '<strong>'+opts.ratio+'</strong>'+
  50. '</span>'+
  51. '<div class="strip-one">'+
  52. '</div>'+
  53. '<div class="strip-two">'+
  54. '</div>'+
  55. '</div>';
  56. }
  57. obj.html(html)//添加html
  58. obj.attr('data-ratio', opts.ratio);//设置最大值,用于后面组件取值
  59. obj.attr('data-range', opts.range);//设置滑块类型,用于后面组件取值
  60. fn.setValue(obj, opts)//设置默认值
  61. fn.action(obj, opts)//事件操作
  62. })
  63. }
  64. })
  65. $('html,body').on('mouseup',function(){//鼠标松开
  66. isDown = false
  67. })
  68. //全局方法
  69. var fn = {
  70. action: function(obj, opts){
  71. if(this.browserRedirect()){//判断设备 pc端使用mouse事件
  72. obj.on('mousedown', '.chunk-one,.chunk-two', function(){
  73. isDown = true
  74. index = $(this).attr('data-index')
  75. $(this).css('z-index','20').siblings('span').css('z-index','5');
  76. })
  77. obj.on('mousemove', function(event){
  78. if(isDown){//鼠标按下时滑动生效
  79. var x = event.clientX-obj.find(".range")[0].offsetLeft;//获取滑动的X轴
  80. if(x > obj.find(".range").width()){
  81. x = obj.find(".range").width()
  82. }else if(x<0){
  83. x=0
  84. }
  85. opts.ratio = obj.attr('data-ratio');//获取当前组件的最大值
  86. opts.range = obj.attr('data-range');//获取当前组件的滑块类型
  87. fn.calculate(x, obj, opts) //计算滑块值
  88. }
  89. })
  90. }else{//移动端使用touch事件
  91. obj.on('touchmove', '.chunk-one,.chunk-two' , function(event){
  92. $(this).css('z-index','20').siblings('span').css('z-index','5');
  93. index = $(this).attr('data-index')
  94. var x = event.originalEvent.touches[0].clientX-obj.find(".range")[0].offsetLeft;//获取滑动的X轴
  95. if(x > obj.find(".range").width()){
  96. x = obj.find(".range").width()
  97. }else if(x<0){
  98. x=0
  99. }
  100. fn.calculate(x, obj, opts) //计算滑块值
  101. })
  102. }
  103. },
  104. //计算滑块值
  105. calculate: function(x, obj, opts){
  106. if(opts.range == 'true' || opts.range == true){//判断是否开启双向滑动
  107. var one = obj.find('.chunk-one'),two = obj.find('.chunk-two');
  108. var oneLeft = one.position().left,twoLeft = two.position().left,width = obj.find(".range").width()
  109. if(index == 1){//第一个滑块滑动时
  110. if( x >= twoLeft){//第一个滑块不能大于第二个
  111. return false
  112. }
  113. //计算数值
  114. var textN = x*(opts.ratio/100)
  115. one.find('strong').text(Math.round(textN/width*100))
  116. //计算滑动值
  117. var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
  118. one.css('left', num+"%")
  119. }else if(index == 2){
  120. if(oneLeft >= x){//第一个滑块不能大于第二个
  121. return false
  122. }
  123. //计算数值
  124. var textN = x*(opts.ratio/100)
  125. two.find('strong').text(Math.round(textN/width*100))
  126. //计算滑动值
  127. var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
  128. two.css('left', num+"%")
  129. }
  130. //设置选着范围宽度
  131. obj.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
  132. setTimeout(function(){
  133. //由于使用动画,延时处理
  134. obj.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
  135. },300)
  136. //回调数据
  137. opts.clickBack([one.find('strong').text(), two.find('strong').text()])
  138. }else {//单滑块
  139. var two = obj.find('.chunk-two'),width = obj.find(".range").width()
  140. //计算数值
  141. var textN = x*(opts.ratio/100)
  142. two.find('strong').text(Math.round(textN/width*100))
  143. //计算滑动值
  144. var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
  145. two.css('left', num+"%")
  146. //设置选着范围宽度
  147. obj.find('.strip-two').css({'width': (two.position().left)+'px'})
  148. setTimeout(function(){
  149. //由于使用动画,延时处理
  150. obj.find('.strip-two').css({'width': (two.position().left)+'px'})
  151. },300)
  152. //回调数据
  153. opts.clickBack([two.find('strong').text()])
  154. }
  155. },
  156. //设置默认值
  157. setValue: function(self, options){
  158. if(options.range){//双向滑块
  159. var one = self.find('.chunk-one'),two = self.find('.chunk-two');
  160. options.value == '' ? options.value = ['0', options.ratio] : options.value
  161. //设置偏移数
  162. self.find('.chunk-one').css('left', Math.round(options.value[0]/options.ratio*100)+'%')
  163. self.find('.chunk-two').css('left', Math.round(options.value[1]/options.ratio*100)+'%')
  164. //设置数值
  165. self.find('.chunk-one strong').text(options.value[0])
  166. self.find('.chunk-two strong').text(options.value[1])
  167. //设置选着范围宽度
  168. self.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
  169. }else{//单滑块
  170. var two = self.find('.chunk-two');
  171. options.value == '' ? options.value = [options.ratio/2] : options.value
  172. if(typeof options.value == 'string'){
  173. //设置偏移数
  174. two.css('left', Math.round(options.value/options.ratio*100)+'%')
  175. //设置数值
  176. self.find('.chunk-two strong').text(options.value)
  177. }else{
  178. //设置偏移数
  179. two.css('left', Math.round(options.value[0]/options.ratio*100)+'%')
  180. //设置数值
  181. self.find('.chunk-two strong').text(options.value[0])
  182. }
  183. //设置选着范围宽度
  184. self.find('.strip-two').css({'width': (two.position().left)+'px'})
  185. }
  186. },
  187. //判断设备
  188. browserRedirect: function(){
  189. var sUserAgent = navigator.userAgent.toLowerCase();
  190. var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
  191. var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
  192. var bIsMidp = sUserAgent.match(/midp/i) == "midp";
  193. var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
  194. var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
  195. var bIsAndroid = sUserAgent.match(/android/i) == "android";
  196. var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
  197. var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
  198. if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
  199. return false
  200. } else {
  201. return true
  202. }
  203. }
  204. }
  205. })(jQuery)