123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- (function ($) {
- /**
- * 2018-9-20 星期四
- * //默认参数 (放在插件外面,避免每次调用插件都调用一次,节省内存)
- * =============================================================
- * 由于放在此处会造成缓存,影响下次插件使用 (已放下面插件中)
- *
- var defaults = {
- ratio: '100', //滑动最大值
- value: '', //默认值,range为true时 此时绑定值是一个数组
- range: false,//是否开启双向滑动
- clickBack: function(){
-
- }
- };
- */
- //设置全局变量
- var opts,isDown = false,index;
- //扩展方法
- $.fn.extend({
-
- slide: function(options){
- //默认参数
- var defaults = {
- ratio: '100', //滑动最大值
- value: '', //默认值,range为true时 此时绑定值必须是一个数组
- range: false,//是否开启双向滑动
- clickBack: function(){
-
- }
- };
- //扩展对象,覆盖默认对象
- opts = $.extend(defaults, options);
- return this.each(function(){
- var html,obj = $(this);
- if(opts.range){//判断是否开启双向滑动
- html = '<div class="range">'+
- '<span class="chunk-one" data-index="1">'+
- '<strong>0</strong>'+
- '</span>'+
- '<span class="chunk-two" data-index="2">'+
- '<strong>'+opts.ratio+'</strong>'+
- '</span>'+
- '<div class="strip-one">'+
-
- '</div>'+
- '<div class="strip-two">'+
-
- '</div>'+
- '</div>';
-
- }else{//单滑块
- html = '<div class="range">'+
- '<span class="chunk-two" data-index="2">'+
- '<strong>'+opts.ratio+'</strong>'+
- '</span>'+
- '<div class="strip-one">'+
-
- '</div>'+
- '<div class="strip-two">'+
-
- '</div>'+
- '</div>';
-
- }
- obj.html(html)//添加html
- obj.attr('data-ratio', opts.ratio);//设置最大值,用于后面组件取值
- obj.attr('data-range', opts.range);//设置滑块类型,用于后面组件取值
- fn.setValue(obj, opts)//设置默认值
- fn.action(obj, opts)//事件操作
- })
- }
- })
- $('html,body').on('mouseup',function(){//鼠标松开
- isDown = false
- })
- //全局方法
- var fn = {
- action: function(obj, opts){
- if(this.browserRedirect()){//判断设备 pc端使用mouse事件
- obj.on('mousedown', '.chunk-one,.chunk-two', function(){
- isDown = true
- index = $(this).attr('data-index')
- $(this).css('z-index','20').siblings('span').css('z-index','5');
- })
- obj.on('mousemove', function(event){
- if(isDown){//鼠标按下时滑动生效
- var x = event.clientX-obj.find(".range")[0].offsetLeft;//获取滑动的X轴
- if(x > obj.find(".range").width()){
- x = obj.find(".range").width()
- }else if(x<0){
- x=0
- }
- opts.ratio = obj.attr('data-ratio');//获取当前组件的最大值
- opts.range = obj.attr('data-range');//获取当前组件的滑块类型
- fn.calculate(x, obj, opts) //计算滑块值
- }
- })
- }else{//移动端使用touch事件
- obj.on('touchmove', '.chunk-one,.chunk-two' , function(event){
- $(this).css('z-index','20').siblings('span').css('z-index','5');
- index = $(this).attr('data-index')
- var x = event.originalEvent.touches[0].clientX-obj.find(".range")[0].offsetLeft;//获取滑动的X轴
- if(x > obj.find(".range").width()){
- x = obj.find(".range").width()
- }else if(x<0){
- x=0
- }
- fn.calculate(x, obj, opts) //计算滑块值
- })
- }
- },
- //计算滑块值
- calculate: function(x, obj, opts){
- if(opts.range == 'true' || opts.range == true){//判断是否开启双向滑动
- var one = obj.find('.chunk-one'),two = obj.find('.chunk-two');
- var oneLeft = one.position().left,twoLeft = two.position().left,width = obj.find(".range").width()
- if(index == 1){//第一个滑块滑动时
- if( x >= twoLeft){//第一个滑块不能大于第二个
- return false
- }
- //计算数值
- var textN = x*(opts.ratio/100)
- one.find('strong').text(Math.round(textN/width*100))
- //计算滑动值
- var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
- one.css('left', num+"%")
- }else if(index == 2){
- if(oneLeft >= x){//第一个滑块不能大于第二个
- return false
- }
- //计算数值
- var textN = x*(opts.ratio/100)
- two.find('strong').text(Math.round(textN/width*100))
- //计算滑动值
- var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
- two.css('left', num+"%")
- }
- //设置选着范围宽度
- obj.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
- setTimeout(function(){
- //由于使用动画,延时处理
- obj.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
- },300)
- //回调数据
- opts.clickBack([one.find('strong').text(), two.find('strong').text()])
- }else {//单滑块
- var two = obj.find('.chunk-two'),width = obj.find(".range").width()
- //计算数值
- var textN = x*(opts.ratio/100)
- two.find('strong').text(Math.round(textN/width*100))
- //计算滑动值
- var num = (Math.round(x/width*opts.ratio)*100)/opts.ratio
- two.css('left', num+"%")
- //设置选着范围宽度
- obj.find('.strip-two').css({'width': (two.position().left)+'px'})
- setTimeout(function(){
- //由于使用动画,延时处理
- obj.find('.strip-two').css({'width': (two.position().left)+'px'})
- },300)
- //回调数据
- opts.clickBack([two.find('strong').text()])
- }
- },
- //设置默认值
- setValue: function(self, options){
- if(options.range){//双向滑块
- var one = self.find('.chunk-one'),two = self.find('.chunk-two');
- options.value == '' ? options.value = ['0', options.ratio] : options.value
- //设置偏移数
- self.find('.chunk-one').css('left', Math.round(options.value[0]/options.ratio*100)+'%')
- self.find('.chunk-two').css('left', Math.round(options.value[1]/options.ratio*100)+'%')
- //设置数值
- self.find('.chunk-one strong').text(options.value[0])
- self.find('.chunk-two strong').text(options.value[1])
- //设置选着范围宽度
- self.find('.strip-two').css({'left': one.position().left+'px','width': (two.position().left-one.position().left)+'px'})
- }else{//单滑块
- var two = self.find('.chunk-two');
- options.value == '' ? options.value = [options.ratio/2] : options.value
- if(typeof options.value == 'string'){
- //设置偏移数
- two.css('left', Math.round(options.value/options.ratio*100)+'%')
- //设置数值
- self.find('.chunk-two strong').text(options.value)
- }else{
- //设置偏移数
- two.css('left', Math.round(options.value[0]/options.ratio*100)+'%')
- //设置数值
- self.find('.chunk-two strong').text(options.value[0])
- }
- //设置选着范围宽度
- self.find('.strip-two').css({'width': (two.position().left)+'px'})
- }
- },
- //判断设备
- browserRedirect: function(){
- var sUserAgent = navigator.userAgent.toLowerCase();
- var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
- var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
- var bIsMidp = sUserAgent.match(/midp/i) == "midp";
- var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
- var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
- var bIsAndroid = sUserAgent.match(/android/i) == "android";
- var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
- var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
- if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
- return false
- } else {
- return true
- }
- }
- }
- })(jQuery)
|