用JTrackBar实现的模拟苹果风格的滚动条


Posted in Javascript onAugust 06, 2007

用JTrackBar实现的模拟苹果风格的滚动条 

function JObj(){} 
JObj.$c = function(tag){return document.createElement(tag)}; 
JObj.$ = function(id){return document.getElementById(id)}; 
JObj.isRate = function(pRateString){ 
    if(!isNaN(pRateString)) return false; 
    if(pRateString.substr(pRateString.length-1,1) != "%") 
        return false; 
    if(isNaN(pRateString.substring(0,pRateString.length - 1))) 
        return false; 
    return true; 
} function JPos(){} 
JPos.getAbsPos = function(pTarget){ 
    var x_ = 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_ = 0; 
    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_};         
} 

<!-- 
/* 
---------------------------------------------------------------------- 
JTrackBar 
初始日期:2007/07/11 
Author:xlingFairy 
Blog:http://xling.blueidea.com 
目前只能生水平的,垂直的还没有写。 
设计功能: 
当改变时,触发事件onChange,并传当前值。 
2007/07/12 
加入拖动功能。 
2007/07/13 
加入皮肤功能 
2007/08/06 
加入垂直的。并修正一个setRange带来的BUG. 
未做功能:指定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 trackBarType;    //V & H 
    if((typeof pParent).toUpperCase() == "OBJECT") 
        var body = pParent; 
    else 
        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 base            = 0; 
    var position        = 0;    //当前位置 
    var trackFrequence    = 10;    //点击一次移动多少刻度 
    var defaultArrowW = defaultArrowH = 15;//Only for IE! 
    this.setRange = function(pMin,pMax){ 
        maxPosition = Math.max(pMin,pMax); 
        minPosition    = Math.min(pMin,pMax); 
        maxPosition -= minPosition; 
        base = minPosition; 
        minPosition = 0; 
    }     
    var outlineWidth,trackAreaWidth,preFrequenceWidth; 
    var outlineHeight,trackAreaHeight,preFrequenceHeight; 
    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(pWH){ 
        oOutline            = $c("DIV"); 
        body.appendChild(oOutline); 
        oOutline.className    = "JTrackBarStand"; 
        if(trackBarType == "H") 
            oOutline.style.width = pWH + "px"; 
        else if(trackBarType == "V") 
            oOutline.style.height = pWH + "px"; 
        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": 
            case "UP": 
                self.setPositionBy( -trackFrequence); 
                break; 
            case "RIGHT": 
            case "DOWN": 
                self.setPositionBy(trackFrequence); 
                break; 
        } 
    } 
    var trackarea_click = function(evt){ 
        evt = window.event || evt; 
        var mPos = JPos.getMousePos(evt); 
        var pos_ = JPos.getAbsPos(oTrackArea); 
        if(trackBarType == "H"){ 
            var w_ = parseInt(getRunStyle(oBtnPointer,"width"));         
            self.setPosition(parseInt((mPos.x - pos_.x) / preFrequenceWidth)); 
        }else{ 
            var h_ = parseInt(getRunStyle(oBtnPointer,"height")); 
            self.setPosition(parseInt((mPos.y - pos_.y) / preFrequenceHeight)); 
        } 
    } 
    var createHTrackArea = function(){ 
        var w_ = parseInt(getRunStyle(oArrBtnLeft,"width")); 
        if(isNaN(w_)) w_ = defaultArrowW; 
        trackAreaWidth = outlineWidth - 2 * w_; 
        preFrequenceWidth = trackAreaWidth / (maxPosition - minPosition); 
        oTrackArea = $c("DIV"); 
        oOutline.appendChild(oTrackArea); 
        oTrackArea.onclick = trackarea_click; 
        oTrackArea.className = "trackAreaH"; 
        oTrackArea.style.width = trackAreaWidth + "px"; 
        oTrackArea.style.styleFloat = "left"; 
        oTrackArea.style.cssFloat    = "left"; 
    } 
    var createVTrackArea = function(){ 
        var h_ = parseInt(getRunStyle(oArrBtnUp,"height"));     
        if(isNaN(h_)) h_ = defaultArrowH; 
        trackAreaHeight = outlineHeight - 2 * h_; 
        preFrequenceHeight = trackAreaHeight / (maxPosition - minPosition); 
        oTrackArea = $c("DIV");         
        oOutline.appendChild(oTrackArea); 
        oTrackArea.onclick = trackarea_click; 
        oTrackArea.className = "trackAreaV"; 
        oTrackArea.style.height = trackAreaHeight + "px"; 
    } 
    var recalcTrackArea = function(){ 
        if(trackBarType == "H"){ 
            var w_ = parseInt(getRunStyle(oArrBtnLeft,"width")); 
            if(isNaN(w_)) w_ = defaultArrowW; 
            trackAreaWidth = outlineWidth - 2 * w_;     
            preFrequenceWidth = trackAreaWidth / maxPosition; 
            oTrackArea.style.width = trackAreaWidth + "px"; 
        }else{ 
            var h_ = parseInt(getRunStyle(oArrBtnUp,"height")); 
            if(isNaN(h_)) h_ = defaultArrowH; 
            trackAreaHeight = outlineHeight - 2 * h_; 
            preFrequenceHeight = trackAreaHeight / maxPosition; 
            oTrackArea.style.height = trackAreaHeight + "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;         
        var mPos = JPos.getMousePos(evt); 
        var pos_ = JPos.getAbsPos(oTrackArea); 
        if(trackBarType == "H") 
            self.setPosition(parseInt((mPos.x - pos_.x) / preFrequenceWidth)); 
        else 
            self.setPosition(parseInt((mPos.y - pos_.y) / preFrequenceHeight)); 
    } 
    var pointer_mouseup = function(){ 
        inDrag = false; 
    } 
    var pointer_mouseout = function(){ 
        //inDrag = false; 
    } 
    var createHPointer = function(){ 
        oBtnPointer = $c("DIV"); 
        oOutline.appendChild(oBtnPointer); 
        oBtnPointer.onmousedown = pointer_mousedown; 
        oBtnPointer.className = "btnPointerH"; 
        oBtnPointer.style.position = "absolute"; 
        var w_ = parseInt(getRunStyle(oBtnPointer,"width")); 
        if(isNaN(w_)) w_ = defaultArrowW; 
        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;"; 
    } 
    var createVPointer = function(){ 
        oBtnPointer = $c("DIV");     
        oOutline.appendChild(oBtnPointer); 
        oBtnPointer.onmousedown = pointer_mousedown; 
        oBtnPointer.className = "btnPointerV"; 
        oBtnPointer.style.position = "absolute"; 
        var h_ = parseInt(getRunStyle(oBtnPointer,"height")); 
        if(isNaN(h_)) h_ = defaultArrowH; 
        var pos_ = JPos.getAbsPos(oTrackArea); 
        oBtnPointer.style.top = pos_.y - h_/2 + "px"; 
        oBtnPointer.style.left = pos_.x + "px"; 
        oBtnPointer.style.cssText += "left:" + pos_.x + "px;top:" + (pos_.y - h_/2) + "px"; 
    } 
    /*-----------------------------------------------------*/ 
    this.createHTrackBar = function(pWidth){ 
        trackBarType = "H"; 
        outlineWidth = pWidth; 
        createOutline(pWidth); 
        oArrBtnLeft = createArrBtn("LEFT"); 
        oOutline.appendChild(oArrBtnLeft); 
        createHTrackArea(); 
        oArrBtnRight = createArrBtn("RIGHT"); 
        oOutline.appendChild(oArrBtnRight); 
        createHPointer(); 
    } 
    /*-----------------------------------------------------*/ 
    this.createVTrackBar = function(pHeight){ 
        trackBarType = "V"; 
        outlineHeight = pHeight; 
        createOutline(pHeight); 
        oArrBtnUp = createArrBtn("UP"); 
        oOutline.appendChild(oArrBtnUp); 
        createVTrackArea(); 
        oArrBtnDown = createArrBtn("DOWN"); 
        oOutline.appendChild(oArrBtnDown); 
        createVPointer(); 
    }     
    /*-----------------------------------------------------*/     
    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); 
        if(trackBarType == "H"){ 
            var w_ = parseInt(getRunStyle(oBtnPointer,"width")); 
            if(isNaN(w_)) w_ = defaultArrowW; 
            oBtnPointer.style.left = pos_.x - w_/2 + preFrequenceWidth * position  + "px";  
        }else if(trackBarType == "V"){ 
            var h_ = parseInt(getRunStyle(oBtnPointer,"height")); 
            if(isNaN(h_)) h_ = defaultArrowH; 
            oBtnPointer.style.top = pos_.y - h_/2 + preFrequenceHeight * position  + "px";  
        } 
        doChange(); 
    } 
    var doChange = function(){ 
        self.onChange(position + base); 
    } 
    this.getPosition = function(){ 
        return position; 
    } 
    this.setSkin = function(pSkin){ 
        oOutline.className = pSkin; 
        recalcTrackArea(); 
        self.setPosition(minPosition) 
    } 
} 

function JScroll(pWidth,pHeight,pBody){ 
    var self        = this; 
    var oOutline    = null; 
    var oContentArea = null; 
    var oTrackBarArea = null; 
    this.trackBar = null; 
    var w        = JObj.isRate(pWidth) ? pWidth : (!isNaN(pWidth) ? pWidth + "px" : "100%"); 
    var h        = JObj.isRate(pHeight) ? pHeight : (!isNaN(pHeight) ? pHeight + "px" : "100%"); 
    var db_ = JObj.$(pBody) || document.body; 
    var createOutline = function(){ 
        oOutline = JObj.$c("DIV"); 
        oOutline.className = "oOutline"; 
        db_.appendChild(oOutline); 
        with(oOutline.style){ 
            width     =    w; 
            height    =    h; 
            overflow = "hidden"; 
        } 
        oContentArea = JObj.$c("DIV"); 
        oOutline.appendChild(oContentArea); 
        oContentArea.className = "oContentArea"; 
        with(oContentArea.style){ 
            width = oOutline.clientWidth - 25 + "px"; 
            height = oOutline.clientHeight + "px"; 
            styleFloat = "left"; 
            cssFloat = "left"; 
        } 
    } 
    this.create = function(){ 
        createOutline(); 
    } 
    var createTrackBar = function(){ 
        oTrackBarArea = JObj.$c("DIV"); 
        oOutline.appendChild(oTrackBarArea); 
        with(oTrackBarArea.style){ 
            width = 20 + "px"; 
            height = oContentArea.style.height; 
            stylefloat = "left"; 
            cssFloat    = "left"; 
            overflow     = "hidden"; 
        } 
        self.trackBar = new JTrackBar(oTrackBarArea); 
        self.trackBar.onChange = function(pTrackPosition){ 
            oContentArea.scrollTop = pTrackPosition; 
        }                 
        self.trackBar.setRange(0,oContentArea.scrollHeight); 
        self.trackBar.createVTrackBar(oTrackBarArea.clientHeight); 
        self.trackBar.setSkin("JTrackBarSky"); 
    }     
    this.addContextArea = function(pId){ 
        oContentArea.appendChild(JObj.$(pId)); 
        oContentArea.style.overflow = "hidden"; 
        createTrackBar(); 
    } 
    this.setSkin = function(pSkin){ 
        self.trackBar.setSkin(pSkin) 
    } 
}

打包文件下载
Javascript 相关文章推荐
jQuery图片特效插件Revealing实现拉伸放大
Apr 22 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
详细探究ES6之Proxy代理
Jul 22 Javascript
HTML的select控件美化
Mar 27 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 Javascript
vue的状态管理模式vuex
Nov 30 Javascript
基于JavaScript中标识符的命名规则介绍
Jan 06 Javascript
JS设计模式之访问者模式定义与用法分析
Feb 05 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
Sep 26 Javascript
js作用域及作用域链工作引擎
Jul 07 Javascript
随机显示经典句子或诗歌的javascript脚本
Aug 04 #Javascript
比较详细的关于javascript中void(0)的具体含义解释
Aug 02 #Javascript
可实现多表单提交的javascript函数
Aug 01 #Javascript
用倒置滤镜把div倒置,再把table倒置。
Jul 31 #Javascript
取键盘键位ASCII码的网页
Jul 30 #Javascript
服务器安全设置的几个注册表设置
Jul 28 #Javascript
javascript实现的动态文字变换
Jul 28 #Javascript
You might like
发布一个用PHP fsockopen写的HTTP下载的类
2007/02/22 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
浅析Python基础-流程控制
2016/03/18 Python
Java分治归并排序算法实例详解
2017/12/12 Python
详解django自定义中间件处理
2018/11/21 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
纽约市的奢华内衣目的地:Anya Lust
2019/08/02 全球购物
ORACLE第二个十问
2013/12/14 面试题
50道外企软件测试面试题
2014/08/18 面试题
教师实习自我鉴定
2013/12/18 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
企业消防安全责任书
2014/07/23 职场文书
小学教师个人总结
2015/02/05 职场文书
我的生日感言
2015/08/03 职场文书
初中班主任工作随笔
2015/08/15 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Rust中的Struct使用示例详解
2022/08/14 Javascript