jScrollPane在元素拖动时滚动

时间:2012-03-14 15:56:45

标签: javascript jquery jscrollpane highlighting jquery-jscrollpane

我正在尝试通过突出显示文字并向下拖动来滚动。现在,正如您可能已经知道的那样,这是标准overflow: auto元素的标准默认行为,但是我试图通过Kelvin Luck的jQuery jScrollPane提供一些花哨的滚动条。

我在这里创造了一个小提琴:DEMO

基本上你可以看到,突出显示和滚动工作在顶部框(默认的overflow: auto框),但在第二个它没有,并且,复合事项,一旦你到达底部它改变您的选择!

所以,我的问题是这些(这些):有没有办法解决这个问题?如果是这样,怎么样?

更新

我一直在努力解决这个问题,并使用setTimeout()

找到了一个小问题

然而,它没有按预期工作,如果有人愿意帮助我把它分成一个新的小提琴:jsFiddle

代码本身是:

pane = $('#scrolldiv2');
pane.jScrollPane({animateEase: 'linear'});
api = pane.data('jsp');

$('#scrolldiv2').on('mousedown', function() {
    $(this).off().on('mousemove', function(e) {
        rel = $(this).relativePosition();
        py = e.pageY - rel.y;
        $t = $(this);
        if (py >= $(this).height() - 20) {
            scroll = setTimeout(scrollBy, 400, 20);
        }
        else if (py < 20) {
            scroll = setTimeout(scrollBy, 400, -20);
        }
        else {
            clearTimeout(scroll);
        }
    })
}).on('mouseup', function() {
    $(this).off('mousemove');
    clearTimeout(scroll);
})

var scrollBy = function(v) {
    if (api.getContentPositionY < 20 & v == -20) {
        api.scrollByY(v + api.getContentPositionY);
        clearTimeout(scroll);
    } else if (((api.getContentHeight - $t.height()) - api.getContentPositionY) < 20 & v == 20) {
        api.scrollByY((api.getContentHeight - $t.height()) - api.getContentPositionY);
        clearTimeout(scroll);
    } else {
        api.scrollByY(v, true)
        scroll = setTimeout(scrollBy, 400, v)
    }
}

$.fn.extend({
    relativePosition: function() {
        var t = this.get(0),
            x, y;
        if (t.offsetParent) {
            x = t.offsetLeft;
            y = t.offsetTop;
            while ((t = t.offsetParent)) {
                x += t.offsetLeft;
                y += t.offsetTop;
            }
        }
        return {
            x: x,
            y: y
        }
    },
})​

2 个答案:

答案 0 :(得分:3)

您只需向下/向上滚动,具体取决于鼠标与div末端的距离;不如原生解决方案好,但它完成了工作(http://jsfiddle.net/PWYpu/25/

$('#scrolldiv2').jScrollPane();

var topScroll = $('#scrolldiv2').offset().top,
    endScroll = topScroll + $('#scrolldiv2').height(),
    f = ($('#scrolldiv2').height() / $('#scrolldiv2 .jspPane').height())*5 ,
    selection = false,
    _prevY;

$(document).mousemove(function(e){
    var mY;
    var delta = _prevY - e.pageY;
    if((e.pageY < endScroll && (mY = ((e.pageY - endScroll + 80)/f)) > 0) || 
       (e.pageY > topScroll && (mY = (e.pageY - (topScroll + 80))/f) < 0)){
          if(selection && (delta > 10 || delta < -10) )
          $('#scrolldiv2').data('jsp').scrollByY(mY, false) ;
    } 
})   

$('#scrolldiv2').mousedown(function(e){_prevY = e.pageY; selection = true ;})
$(window).mouseup(function(){selection = false ;})​

BTW,它反转选择的原因是因为它到达了文档的末尾,只是在那里放了一些空格并且问题解决了。

答案 1 :(得分:0)

我真的不愿意这么说,我知道这是一个问题,即使我遇到了这个插件的更新,但在旧的插件(seen here)中它可以正常使用基本调用。所以我只是还原了我的副本。