jScrollPane прокрутка при перетаскивании элемента
Я пытаюсь прокрутить, выделив текст и перетащив вниз. Теперь, как вы, наверное, знаете, это стандартное поведение по умолчанию для стандартного overflow: auto
элемент, однако я пытаюсь сделать это с помощью некоторых причудливых полос прокрутки, любезно предоставленных 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 ответа
Вам просто нужно прокрутить вниз / вверх в зависимости от того, насколько близко мышь находится к концу 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 ;})
Кстати, причина, по которой он инвертирует выбор, состоит в том, что он достиг конца документа, просто оставил там некоторое пустое пространство и проблема решена.
Мне очень неприятно это говорить, я знаю, что это проблема, даже когда я столкнулся с обновлением этого плагина, но в старом плагине (как показано здесь) он прекрасно работает с базовым вызовом. Так что я просто отменил свою копию.