用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)
    }
}

打包文件下载

(0)

相关推荐

  • 用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.s

  • jQuery实现的超酷苹果风格图标滑出菜单效果代码

    本文实例讲述了jQuery实现的超酷苹果风格图标滑出菜单效果代码.分享给大家供大家参考.具体如下: 这是一款超酷苹果风格图标滑出菜单,调用了jquery1.3.2的库文件,整个菜单动感十足,用在网站上增色不少. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-apple-style-ico-show-menu-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0

  • 基于JQuery的模拟苹果桌面Dock效果(稳定版)

    已经迫不及待的想要将我的最新成果分享给大家了,其实代码和之前的版本很相似. 首相是HTML页面代码: 复制代码 代码如下: <!DOCTYPE html> <html lang="zh-cmn-Hans-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>jQuery

  • 最新28个很棒的jQuery 教程

    学习使用 jQuery 创建一个确认对话框 学习如何制作一个自动变换的幻灯片 如何制作带缩略图的全屏图片画廊 学习使用 jQuery 制作立体效果的滑动相册 学习使用 jQuery 制作谷歌圣诞涂鸦 学习使用 jQuery 制作缩略图预览滑块 学习如何制作可爱的预览图库 学习使用 jQuery 制作带动画切换的表单 学习使用 jQuery 制作作品缩放滑块 学习使用 jQuery 制作气泡形的图片画廊 学习使用 jQuery 制作有吸引力的照片效果 学习使用 jQuery 制作遮罩效果的菜单 学

  • Three.js+React实现3D文字悬浮效果

    目录 背景 效果 实现 资源引入 DOM结构 设置状态 网格背景 场景初始化 创建材质 创建文字模型 创建几何体模型 鼠标事件监听 背景色切换 后期渲染 动画 缩放适配 双击全屏 总结 背景 在 Three.js Journey 课程示例中,提供了一个使用 Three.js 内置方法实现的 3D 文字悬浮效果的例子,本文使用 React + Three.js 技术栈,参照示例实现类似的效果.本文中涉及到的知识点主要包括:CSS 网格背景.MeshNormalMaterial 法向材质.FontL

  • Android Flutter实现点赞效果的示例代码

    目录 前言 绘制小手 完整源码 前言 点赞这个动作不得不说在社交.短视频等App中实在是太常见了,当用户手指按下去的那一刻,给用户一个好的反馈效果也是非常重要的,这样用户点起赞来才会有一种强烈的我点了赞的效果,那么今天我们就用Flutter实现一个掘金App上的点赞效果. 首先我们看下掘金App的点赞组成部分,有一个小手,点赞数字.点赞气泡效果,还有一个震动反馈,接下来我们一步一步实现. 知识点:绘制.动画.震动反馈 绘制小手 这里我们使用Flutter的Icon图标中的点赞小手,Icons图标

  • Flutter实现单选,复选和开关组件的示例代码

    目录 1.开关 Switch 2.单选 Radio 3.复选多选 Checkbox 小结 1.开关 Switch 构造方法: const Switch({ Key? key, required this.value,//当前开关状态 required this.onChanged,// 改变状态回调 this.activeColor,// 开启全部颜色 this.activeTrackColor,// 开启轨道的颜色 this.inactiveThumbColor,//关闭滑块颜色 this.i

  • 基于Flutter实现转场动效的示例代码

    目录 前言 CupertinoFullscreenDialogTransition CupertinoPageTransition DecoratedBoxTransition FadeTransition PositionedTransition RotationTransition ScaleTransition SizeTransition SlideTransition 前言 动画经常会用于场景切换,比如滑动,缩放,尺寸变化,为应对这样的场景转换需要,Flutter 提供了 Transi

  • Android利用Hero实现列表与详情页无缝切换动画

    目录 前言 思路 列表元素 详情页面 源码 总结 前言 介绍了几篇 Hero 动画,我们来一个 Hero 动画应用案例.在一些应用中,列表的元素和详情的内容是一致的,这个时候利用 Hero 动画切换到详情会感觉无缝过渡,用户体验会更好.例如本篇我们要实现下面的效果: Hero 应用:列表与详情切换 思路 上面的效果是列表和详情共用了头像和头像的背景色.二者的组合是一个 Stack 组件,因此可以使用 Hero 组件完成.然后是 Hero 组件的移动,我们先做了水平移动,再做垂直方向移动,这样过渡

  • 基于jquery的跟随屏幕滚动代码

    那么这是怎么实现的呢?本文将引用乌徒帮的跟随屏幕滚动代码,对此效果做详解. 一.原始代码 下面是乌徒帮的跟随屏幕滚动代码,它的作用域为乌徒帮网页两侧的边栏,以及双击屏幕后的右侧隐藏栏. 复制代码 代码如下: var $catalogueOffsetTop = $('aside#catalogue').offset().top; var $archiveOffestTop = $('aside#archive').offset().top; var $archiveOffestLeft = $('

随机推荐