Я не думаю, что вы можете обойти циклическую функцию или дергаться и дрожать, если вы анимируете более одного пикселя за раз.
Но я попытался немного очистить ваш код, , потому что вы можете использовать +=1px
или -=1px
с функцией анимации: ( Обновление : удалена функция анимации , но вы можете использовать +=1px
или -=1px
для дальнейшего использования)
$(document).ready(function(){
var animateTime = 1,
offsetStep = 5,
scrollWrapper = $('#wrap');
//event handling for buttons "left", "right"
$('.bttR, .bttL')
.mousedown(function() {
scrollWrapper.data('loop', true);
loopingAnimation($(this), $(this).is('.bttR') );
})
.bind("mouseup mouseout", function(){
scrollWrapper.data('loop', false).stop();
$(this).data('scrollLeft', this.scrollLeft);
});
loopingAnimation = function(el, dir){
if(scrollWrapper.data('loop')){
var sign = (dir) ? offsetStep : -offsetStep;
scrollWrapper[0].scrollLeft += sign;
setTimeout( function(){ loopingAnimation(el,dir) }, animateTime );
}
return false;
};
})
Поскольку у меня OCD и я не люблю медленные скроллеры, я сделал демо с функциональностью колесика мыши и функцией перетаскивания мышью. Вот дополнительный код:
Обновление : На самом деле, я думаю, что если вы не используете функцию анимации jQuery, вы получите более плавную прокрутку. Я обновил код выше и демо .
$('#wrap') // wrap around content
.mousedown(function(event) {
$(this)
.data('down', true)
.data('x', event.clientX)
.data('scrollLeft', this.scrollLeft);
return false;
})
.mouseup(function (event) {
$(this).data('down', false);
})
.mousemove(function (event) {
if ($(this).data('down') == true) {
this.scrollLeft = $(this).data('scrollLeft') + $(this).data('x') - event.clientX;
}
})
.mousewheel(function (event, delta) {
this.scrollLeft -= (delta * 30);
})
.css({
'overflow' : 'hidden',
'cursor' : '-moz-grab'
});