• 一个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>
    

  • 相关阅读:
    js问题记录
    css问题记录
    vscode配置java+gradle开发环境
    js插件
    nginx笔记
    vue刷新当前路由
    koa踩坑记录
    react踩坑笔记
    ts踩坑笔记
    vue源码阅读笔记
  • 原文地址:https://www.cnblogs.com/ecalf/p/2791876.html
Copyright © 2020-2023  润新知