侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

苹果(mac/ios)  /  管理员 发布于 6年前   278

 
复制代码 代码如下:
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    = "lef


  • 上一条:
    命令行实现MAC与IP地址绑定 ip mac绑定 如何绑定mac地址
    下一条:
    升级到mac 10.10之后使用pod出现问题的解决方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 苹果将在iOS 18中启用“苹果账户”名称,“Apple ID”将成历史(0个评论)
    • 2023年国内最新注册苹果开发者账号之申请邓白氏编码流程步骤(0个评论)
    • 2023年国内最新注册苹果个人开发者账号及支付会员年费流程步骤(0个评论)
    • 2022年3月2号最新免费的苹果美国id账号分享-美区Apple ID共享(0个评论)
    • Objective-C的%s和%@(1个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-11
    • 2018-11
    • 2022-01
    • 2023-02
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客