JTrackBar水平拖动效果


Posted in Javascript onJuly 15, 2007

<!--
/*
----------------------------------------------------------------------
JTrackBar
初始日期:2007/07/11
Author:xlingFairy
Blog:http://xling.blueidea.com

目前只能生水平的,垂直的还没有写。
设计功能:
当改变时,触发事件onChange,并传当前值。

2007/07/12
加入拖动功能。

2007/07/13
加入皮肤功能

未做功能:指定trackFrequence,你可以自己试着修改一下。

请尊重劳动成果!不得删除原作都信息!后果自负!
----------------------------------------------------------------------
*/
function JPos(){

}

JPos.getAbsPos = function(pTarget){
    var _x = 0;
    var _y = 0;
    while(pTarget.offsetParent){
            _x += pTarget.offsetLeft;
            _y += pTarget.offsetTop;
            pTarget = pTarget.offsetParent;
    }
    _x += pTarget.offsetLeft;
    _y += pTarget.offsetTop;

    return {x:_x,y:_y};
}

JPos.getMousePos = function(evt){
    var _x,_y;
    evt = evt || window.event;
    if(evt.pageX || evt.pageY){
        _x = evt.pageX;
        _y = evt.pageY;
    }else{
        _x = evt.clientX + document.body.scrollLeft - document.body.clientLeft;
        _y = evt.clientY + document.body.scrollTop - document.body.clientTop;
    }
    return {x:_x,y:_y};
}

function JTrackBar(pParent){
    var self = this;

    var $ = function(pId){
        return document.getElementById(pId);
    }

    var $c = function(pTag){
        return document.createElement(pTag);
    }

    var body = $(pParent) || document.body;
    var oOutline    = null;
    var oTrackArea     = null;
    var oBtnPointer    = null;
    var oArrBtnLeft = oArrBtnRight = oArrBtnUp = oArrBtnDown = null;

    var inDrag         = false;
    var dragStartPos = null;

    var maxPosition     = 100;    //最大刻度
    var minPosition        = 0;    //最小刻度
    var position        = 0;    //当前位置
    var trackFrequence    = 10;    //点击一次移动多少刻度

    this.setRange = function(pMin,pMax){
        maxPosition = Math.max(pMin,pMax);
        minPosition    = Math.min(pMin,pMax);
    }    

    var outlineWidth,trackAreaWidth,preFrequenceWidth;

    this.onChange = new Function();

    var getRunStyle = function(pObj,pProperty){
        try{
            if(pObj.currentStyle)
            return eval("pObj.currentStyle." + pProperty);
        else
            return document.defaultView.getComputedStyle(pObj,"").getPropertyValue(pProperty);
        }catch(e){
            alert(e);
        }
    }

    /*-----------------------------------------------------*/
    var createOutline = function(pWidth){
        oOutline            = $c("DIV");
        body.appendChild(oOutline);
        oOutline.className    = "JTrackBarStand";
        oOutline.style.width = pWidth + "px";    
        //oOutline.style.height = "15px";
        oOutline.style.overflow = "hidden";
    }
    /*-----------------------------------------------------*/
    var createArrBtn    = function(pDirection){
        var arrBtn = $c("DIV");
        switch(pDirection){
            case "LEFT":
                arrBtn.className = "btnLeft";
                arrBtn.style.styleFloat = "left";
                arrBtn.style.cssFloat    = "left";
                break;
            case "RIGHT":
                arrBtn.className = "btnRight";
                arrBtn.style.styleFloat = "left";
                arrBtn.style.cssFloat    = "left";        
                break;
            case "UP":
                arrBtn.className = "btnUp";            
                break;
            case "DOWN":
                arrBtn.className = "btnDown";
                break;
        }

        arrBtn.direction = pDirection;
        arrBtn.onclick = arrBtn_click;
        return arrBtn;
    }

    var arrBtn_click = function(evt){

        evt = window.event || evt;
        var o = evt.srcElement || evt.target;

        switch(o.direction){
            case "LEFT":
                if(position <= minPosition)
                    return;
                self.setPositionBy( -trackFrequence);
                break;
            case "RIGHT":
                if(position >= maxPosition)
                    return;
                self.setPositionBy(trackFrequence);
                break;
        }
    }

    var trackarea_click = function(evt){
        evt = window.event || evt;
        var mPos = JPos.getMousePos(evt);

        var pos_ = JPos.getAbsPos(oTrackArea);
        var w_ = parseInt(getRunStyle(oBtnPointer,"width"));        

        self.setPosition(parseInt((mPos.x - pos_.x) / preFrequenceWidth));
    }

    var createHTrackArea = function(){
        var w_ = parseInt(getRunStyle(oArrBtnLeft,"width"));
        trackAreaWidth = outlineWidth - 2 * w_;
        preFrequenceWidth = trackAreaWidth / (maxPosition - minPosition);

        oTrackArea = $c("DIV");
        oOutline.appendChild(oTrackArea);

        oTrackArea.onclick = trackarea_click;

        oTrackArea.className = "trackArea";
        oTrackArea.style.width = trackAreaWidth + "px";
        oTrackArea.style.styleFloat = "left";
        oTrackArea.style.cssFloat    = "left";
    }

    var recalcTrackArea = function(){
        var w_ = parseInt(getRunStyle(oArrBtnLeft,"width"));
        trackAreaWidth = outlineWidth - 2 * w_;        
        preFrequenceWidth = trackAreaWidth / (maxPosition - minPosition);

        oTrackArea.style.width = trackAreaWidth + "px";
    }

    var pointer_mousedown = function(evt){
        inDrag = true;
        dragStartPos = JPos.getMousePos(evt);
        body.onmousemove = pointer_mousemove;
        body.onmouseup = pointer_mouseup;
        body.onmouseout = pointer_mouseout;
    }

    var pointer_mousemove = function(evt){
        if(!inDrag)    return;
        //evt = window.event || evt;
        //var x_ = evt.clientX;
        //window.status = x_ + " " + dragStartPos.x;
        //self.setPositionBy(x_ - dragStartPos.x);

        //window.status += " " +  evt.clientX;

        var mPos = JPos.getMousePos(evt);
        var pos_ = JPos.getAbsPos(oTrackArea);

        self.setPosition(parseInt((mPos.x - pos_.x) / preFrequenceWidth));        
    }

    var pointer_mouseup = function(){
        inDrag = false;
    }

    var pointer_mouseout = function(){
        //inDrag = false;
    }

    var createHPointer = function(){
        oBtnPointer = $c("DIV");
        oOutline.appendChild(oBtnPointer);

        //oBtnPointer.onclick = trackarea_click;
        oBtnPointer.onmousedown = pointer_mousedown;
        //oOutline.onmousemove = oBtnPointer.onmousemove = pointer_mousemove;
        //oBtnPointer.onmouseup    = pointer_mouseup;
        //oBtnPointer.onmouseout = pointer_mouseout;

        oBtnPointer.className = "btnPointer";
        oBtnPointer.style.position = "absolute";

        var w_ = parseInt(getRunStyle(oBtnPointer,"width"));

        var pos_ = JPos.getAbsPos(oTrackArea);
        oBtnPointer.style.left = pos_.x - w_/2 + "px";
        oBtnPointer.style.top = pos_.y + "px";
        oBtnPointer.style.cssText += "left:" + (pos_.x - w_/2) + "px;top:" + pos_.y + "px;";
    }

    /*-----------------------------------------------------*/
    this.createHTrackBar = function(pWidth){
        outlineWidth = pWidth;
        createOutline(pWidth);

        oArrBtnLeft = createArrBtn("LEFT");
        oOutline.appendChild(oArrBtnLeft);

        createHTrackArea();

        oArrBtnRight = createArrBtn("RIGHT");
        oOutline.appendChild(oArrBtnRight);

        createHPointer();
    }
    /*-----------------------------------------------------*/

    this.setPositionBy = function(pPosition){
        position += pPosition;
        self.setPosition(position);
    }

    this.setPosition = function(pPosition){
        position = pPosition;

        if(position > maxPosition)
            position = maxPosition;
        if(position < minPosition)
            position = minPosition;        

        var pos_ = JPos.getAbsPos(oTrackArea);
        var w_ = parseInt(getRunStyle(oBtnPointer,"width"));

        oBtnPointer.style.left = pos_.x - w_/2 + preFrequenceWidth * position  + "px"; 

        doChange();
    }

    var doChange = function(){
        self.onChange(position);
    }

    this.getPosition = function(){
        return position;
    }

    this.setSkin = function(pSkin){
        oOutline.className = pSkin;
        recalcTrackArea();
    }
}
打包文件下载

Javascript 相关文章推荐
JQuery Tab选项卡效果代码改进版
Apr 01 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
js获取或设置当前窗口url参数的小例子
Oct 14 Javascript
鼠标悬停小图标显示大图标
Jan 22 Javascript
详解Angular中$cacheFactory缓存的使用
Aug 19 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
使用ionic切换页面卡顿的解决方法
Dec 16 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
jQuery选择器之子元素过滤选择器
Sep 28 jQuery
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
Vue实现微信支付功能遇到的坑
Jun 05 Javascript
使用layui实现树形结构的方法
Sep 20 Javascript
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
Jul 11 #Javascript
doctype后如何获得body.clientHeight的方法
Jul 11 #Javascript
建立良好体验度的Web注册系统ajax
Jul 09 #Javascript
HTML中事件触发列表与解说
Jul 09 #Javascript
建议大家看下JavaScript重要知识更新
Jul 08 #Javascript
Javascript 个人笔记(没有整理,很乱)
Jul 07 #Javascript
使用户点击后退按钮使效三行代码
Jul 07 #Javascript
You might like
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
Vue数据驱动表单渲染,轻松搞定form表单
2019/07/19 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
python实现将元祖转换成数组的方法
2015/05/04 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python中id函数运行方式
2020/07/03 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
零件设计自荐信范文
2013/11/27 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
门前三包责任书
2014/04/15 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
商品陈列协议书
2014/09/29 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书