一个javascript 滑竿控件

滑杠的取值范围、最大值最小值、小数点位数可以自定义,并可以配置滑动前、后的回调函数


<style>

body{    
    font: 12px ,Arial;
}



/*slider strat*/
.SliderMain{
    background:url(http://pic002.cnblogs.com/images/2012/368483/2012112803494021.gif) no-repeat;
    181px;
    height:8px;
    position:relative;
    display:inline-block;
    zoom:1;
}
.SliderRange{
    background:url(http://pic002.cnblogs.com/images/2012/368483/2012112803495452.gif) no-repeat;
    0px;
    height:5px;
    position:absolute;
    top:1px;
    left:1px;
}
.sliderHandle{
    background:url(http://pic002.cnblogs.com/images/2012/368483/2012112803500853.gif) no-repeat;
    12px;
    height:19px;
    position:absolute;
    left:0px;
    top:-5px;
    font-size:0;
    margin-left:-5px;
}

/*slider end*/

/* ===== 无图片样式=================

.SliderMain{
    background:#E0E0E0;
    181px;
    height:8px;
    position:relative;
    display:inline-block;
    border-radius:2px;
    zoom:1;
}
.SliderRange{
    background:#FF9600;
    0px;
    height:5px;
    position:absolute;
    top:1px;
    left:1px;
}
.sliderHandle{
    background:#D6D3D6;
    border-radius:4px/2px;
    12px;
    height:19px;
    position:absolute;
    left:0px;
    top:-5px;
    font-size:0px;
    margin-left:-5px;
}

*/
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div style="border: 1px solid black;  500px; height: 80px; padding: 20px;">
<div id="SliderRange" class="SliderMain">
<div class="SliderRange"> </div>
<div class="sliderHandle"> </div>
</div>
<div><input id="test" type="text" /></div>
</div>
<script type="text/javascript">// <![CDATA[
$(document).ready(function(){
    var mySlider = new Slider('SliderRange',-50,50)
                    .setCallback(function(){                           
                           $("#test").val(this.getValue());
                        })
                    .setMinAllow(-40)
                    .setMaxAllow(40)
                    .setDecimal(2)
                    .setValue(20);
});

 
//=============滑竿=================

function Slider(id,min,max){ //by aleck
    this.min=parseFloat(min)||0; //最小值
    this.max=parseFloat(max)||100;//最大值
    this.maxAllow = null; //允许选定的最大值
    this.minAllow = null; //允许选定的最小值
    this.value = null; //当前值
    this.decimal = 0; //小数位数
    
    this.locked = true; //锁定游标    
    this.startPoint = 0; //游标滑动的起点 px    
    this.distance = 0; //游标滑动偏移量 px
    this.curPos = 0;//当前游标偏移位置 px
    this.afterMoves=[]; //滑动时回调函数,可多个
    this.beforeMoves=[]; //滑动前的回调函数
    this.dom = document.getElementById(id); //滑竿DOM    
    
    this.init();
}

Slider.prototype={
    init:function(){ //初始化
        var host = this;
                    
        host.SliderRange = $(host.dom); //滑竿总长度
        host.SliderSet = host.SliderRange.children("div:first"); //滑竿选定值长度
        host.SliderSet.css('width',host.curPos+"px"); //当前选定值长度        
        host.SliderHandel = host.SliderRange.children("div:last");//游标        
        host.SliderHandel.css("left",host.curPos+"px");    //当前游标位置
                
        host.silderLength = parseFloat(host.SliderRange.css("width")); //滑竿最大长度 px         
        host.scale = (host.max-host.min)/host.silderLength; //滑竿比例尺   
        
        host.minAllow = host.fixValue(host.minAllow==undefined?host.min:host.minAllow);
        host.maxAllow = host.fixValue(host.maxAllow==undefined?host.max:host.maxAllow);    
        host.value = host.fixValue(host.value==undefined?host.minAllow:host.value);    
                
        host.SliderHandel.mousedown(function(e){
            host.lock(false);            
            host.startPoint = e.clientX;            
            host.distance = 0;    
            host.curPos = parseFloat(host.SliderHandel.css("left"));
                     
            function m_move(e){//鼠标移动回调函数            
                if(host.locked){ return ;}
                host.distance = e.clientX-host.startPoint;
                host.startPoint = e.clientX;                
                host.move();
            }
            
            function m_up(e){ //鼠标弹起回调函数    
                host.lock(true);                    
                $(document).unbind('mousemove',m_move)
                           .unbind('mouseup',m_up);                           
                document[document.all?"onselectstart":"onmousedown"]=null;
            }  
            
            //防止拖拽时选中附近文字
            document[document.all?"onselectstart":"onmousedown"]= function(){return false;}    
            
            $(document).mousemove(m_move)
                       .mouseup(m_up);        
        });            
        return host;
    },
    setBeforeMoves:function(){
        var host = this;
        for(var i=0;i<arguments.length;i++){
            if(arguments[i].constructor===Function){
                host.beforeMoves.push(arguments[i]);
            }
        }    
        return host;
    },
    setCallback:function(){//设置滑动时的回调函数
        var host = this;
        for(var i=0;i<arguments.length;i++){
            if(arguments[i].constructor===Function){
                host.afterMoves.push(arguments[i]);
            }
        }        
        return host;
    },    
        
    move:function(){ //移动游标
        var host = this;    
        for(var i=0;i<host.beforeMoves.length;i++){
            host.beforeMoves[i].call(host);
        }    
        host.updateCurPos();
        host.SliderHandel.css("left",host.curPos+"px");    
        host.SliderSet.css('width',host.curPos+"px");        
        for(var i=0;i<host.afterMoves.length;i++){
            host.afterMoves[i].call(host);
        }
        return host;
    },
            
    updateCurPos:function(){ //修正偏移后的游标位置
        var host = this;    
        var newValue = host.min+host.scale*(host.curPos+host.distance);            
        if(newValue>=host.maxAllow){
            newValue = host.maxAllow;                
            host.curPos = ((host.maxAllow-host.min)/(host.max-host.min))*host.silderLength;            
        }else if(newValue<=host.minAllow){    
            newValue = host.minAllow;    
            host.curPos = ((host.minAllow-host.min)/(host.max-host.min))*host.silderLength;            
        }else{            
            host.curPos += host.distance;
        }    
            
        host.value = host.fixValue(newValue);            
        return host;
    },
    
            
    setValue:function(num){ //设置滑竿的值
        var host = this;
        if(!host.isNum(num)){ return host; }    
        var oldValue = host.getValue();
        host.value = host.numInRange(host.minAllow,host.maxAllow,num);         
        host.distance = (host.value-oldValue)/host.scale;        
        host.move();
        
        host.value = host.fixValue(host.value);            
        return host;
    },
    
    getValue:function(){ //获取滑竿的值
        var host = this;        
        return host.value;
    },
    
    setMaxAllow:function(num){ //设置允许的最大值
        var host = this;        
        num = (num==undefined)?host.max:num;
        if(!host.isNum(num)){ return host; }
        host.maxAllow = host.fixValue(host.numInRange(host.min,host.max,num));  
        return host;
    },
    
    setMinAllow:function(num){//设置允许的最小值
        var host = this;        
        num = (num==undefined)?host.min:num;
        if(!host.isNum(num)){ return host; }
        host.minAllow = host.fixValue(host.numInRange(host.min,host.max,num));
        return host;
    },
    
    setMinMax:function(min,max){ //设置最大值和最小值,如果只传入一个,将使用一个默认的min或max配对设置
        var host = this;
        if(!arguments.length){ return host; }
        min = (min==undefined)?host.min:min;
        max = (max==undefined)?host.max:max;
        if(!host.isNum(min)||!host.isNum(max)){ return host;}
        
        min=Math.min(parseFloat(min),parseFloat(max));
        max=Math.max(parseFloat(min),parseFloat(max));        
        host.scale = (max-min)/host.silderLength;
        
        host.min = host.fixValue(min);
        host.max = host.fixValue(max);        
        return host;
    },
    isNum:function(num){ //校验数字
        var host = this;
        return typeof(parseFloat(num))==='number'?true:false;        
    },
    numInRange:function(min,max,num){ //在允许范围内取值
        var host = this;
        return [min,max,parseFloat(num)].sort(function(a,b){return a-b;})[1];        
    },
    fixValue:function(num){//根据设置的小数点位数修正数据
        host = this;        
        return parseFloat(num).toFixed(host.decimal||0);
    },
    
    setDecimal:function(num){//设置小数点
        var host = this;
        if(!host.isNum(num)){ return host; }
        host.decimal = parseFloat(num).toFixed(0);
        return host;
    },
    
    lock:function(frag){ //锁定、解锁游标
        var host = this;
        if(arguments[0]!=undefined){
            host.locked=!!frag;
        }
        return host;

    },

    destroy:function(){//销毁控件
        host = this;
        host.dom.parentNode.removeChild(host.dom);
        host = null;
        return host;
    }

}
// ]]></script>

原文地址:https://www.cnblogs.com/ecalf/p/2791876.html