I don’t think you can go around the loop through a function or twitch and tremble if you animate more than one pixel at a time.
But I tried a little to clear my code, because you can use +=1px or -=1px with the animation function: ( Refresh ): removed animations, but you can use +=1px or -=1px for future reference)
$(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; }; })
Since I have OCD and don’t like slow scrollers, I made a demo with mouse functionality and drag and drop. Here is the additional code:
Update . In fact, I think if you do not use the jQuery animation function, you will get a smoother scroll. I updated the code above and the demo .
$('#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' });
Mottie
source share