huakuai.js 8.0 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. event.preventDefault();
  93. $(this).css('z-index','20').siblings('span').css('z-index','5');
  94. index = $(this).attr('data-index')
  95. var x = event.originalEvent.touches[0].clientX-obj.find(".range")[0].offsetLeft;//获取滑动的X轴
  96. if(x > obj.find(".range").width()){
  97. x = obj.find(".range").width()
  98. }else if(x<0){
  99. x=0
  100. }
  101. fn.calculate(x, obj, opts) //计算滑块值
  102. })
  103. }
  104. },
  105. //计算滑块值
  106. calculate: function(x, obj, opts){
  107. if(opts.range == 'true' || opts.range == true){//判断是否开启双向滑动
  108. var one = obj.find('.chunk-one'),two = obj.find('.chunk-two');
  109. var oneLeft = one.position().left,twoLeft = two.position().left,width = obj.find(".range").width()
  110. if(index == 1){//第一个滑块滑动时
  111. if( x >= twoLeft){//第一个滑块不能大于第二个
  112. return false
  113. }
  114. //计算数值
  115. var textN = x*(opts.ratio/100)
  116. one.find('strong').text(Math.round(textN/width*100))
  117. //计算滑动值
  118. var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
  119. one.css('left', Math.floor(num/25)*25+"%")
  120. }else if(index == 2){
  121. if(oneLeft >= x){//第一个滑块不能大于第二个
  122. return false
  123. }
  124. //计算数值
  125. var textN = x*(opts.ratio/100)
  126. two.find('strong').text(Math.round(textN/width*100))
  127. //计算滑动值
  128. var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
  129. two.css('left', Math.ceil(num/25)*25 +"%")
  130. }
  131. //设置选着范围宽度
  132. obj.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
  133. setTimeout(function(){
  134. //由于使用动画,延时处理
  135. obj.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
  136. },300)
  137. //回调数据
  138. opts.clickBack([one.find('strong').text(), two.find('strong').text()])
  139. }else {//单滑块
  140. var two = obj.find('.chunk-two'),width = obj.find(".range").width()
  141. //计算数值
  142. var textN = x*(opts.ratio/100)
  143. two.find('strong').text(Math.round(textN/width*100))
  144. //计算滑动值
  145. var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
  146. two.css('left', num+"%")
  147. //设置选着范围宽度
  148. obj.find('.strip-two').css({'width': (two.position().left)+'px'})
  149. setTimeout(function(){
  150. //由于使用动画,延时处理
  151. obj.find('.strip-two').css({'width': (two.position().left)+'px'})
  152. },300)
  153. //回调数据
  154. opts.clickBack([two.find('strong').text()])
  155. }
  156. },
  157. //设置默认值
  158. setValue: function(self, options){
  159. if(options.range){//双向滑块
  160. var one = self.find('.chunk-one'),two = self.find('.chunk-two');
  161. options.value == '' ? options.value = ['0', options.ratio] : options.value
  162. //设置偏移数
  163. self.find('.chunk-one').css('left', Math.round(options.value[0]/options.ratio*100)+'%')
  164. self.find('.chunk-two').css('left', Math.round(options.value[1]/options.ratio*100)+'%')
  165. //设置数值
  166. self.find('.chunk-one strong').text(options.value[0])
  167. self.find('.chunk-two strong').text(options.value[1])
  168. //设置选着范围宽度
  169. // self.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
  170. self.find('.strip-two').css({'left': one.position().left+'px','width': '5rem'})
  171. }else{//单滑块
  172. var two = self.find('.chunk-two');
  173. options.value == '' ? options.value = [options.ratio/2] : options.value
  174. if(typeof options.value == 'string'){
  175. //设置偏移数
  176. two.css('left', Math.round(options.value/options.ratio*100)+'%')
  177. //设置数值
  178. self.find('.chunk-two strong').text(options.value)
  179. }else{
  180. //设置偏移数
  181. two.css('left', Math.round(options.value[0]/options.ratio*100)+'%')
  182. //设置数值
  183. self.find('.chunk-two strong').text(options.value[0])
  184. }
  185. //设置选着范围宽度
  186. self.find('.strip-two').css({'width': (two.position().left)+'px'})
  187. }
  188. },
  189. //判断设备
  190. browserRedirect: function(){
  191. var sUserAgent = navigator.userAgent.toLowerCase();
  192. var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
  193. var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
  194. var bIsMidp = sUserAgent.match(/midp/i) == "midp";
  195. var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
  196. var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
  197. var bIsAndroid = sUserAgent.match(/android/i) == "android";
  198. var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
  199. var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
  200. if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
  201. return false
  202. } else {
  203. return true
  204. }
  205. }
  206. }
  207. })(jQuery)