5

テキストを強調表示して下にドラッグしてスクロールしようとしています。ご存知かもしれませんが、これは標準overflow: auto要素の標準のデフォルトの動作ですが、KelvinLuckによるjQueryjScrollPaneの好意により、いくつかの凝ったスクロールバーを使用してこれを実行しようとしています。

ここでフィドルを作成しました:DEMO

基本的にご覧のとおり、ハイライトとスクロールは上部のボックス(デフォルトのoverflow: autoボックス)で機能しますが、2番目のボックスでは機能しません。さらに複雑なことに、下部に到達すると、選択内容が反転します。

だから、私の質問はこれ(これら)です:これを修正する方法はありますか?もしそうなら、どのように?

アップデート

私はこれにかなり取り組んでおり、を使用してわずかな解決策を見つけました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
        }
    },
})​
4

2 に答える 2

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 ;})​

ところで、選択が反転する理由は、ドキュメントの最後に到達したためです。そこに空白を入れるだけで、問題が解決します。

于 2012-03-28T17:49:51.157 に答える
0

私は本当にそれを言うのが嫌いです、私はこのプラグインへのアップデートで遭遇したとしてもそれが問題であることを知っています、しかし古いプラグイン(ここに見られます)ではそれは基本的な呼び出しでうまく動作します。だから私は自分のコピーを元に戻しました。

于 2012-03-22T15:19:39.763 に答える