How can I make a scrollbar only scroll at fixed intervals?
css, html, jquery
Solution
Not a perfect solution.
But something like this should work (NB : need to refine)
$("#container").scroll(function() {
this.scrollTop = parseInt(this.scrollTop / 84) * 84; // 84 = height + top and bottom margin
});
Fiddle here http://jsfiddle.net/R7tAK/1/
Update
Some what refined code than the above, without any other plugins or libs. (flicker removed)
var scrollTimerHandle = "";
$("#container").scroll(function() {
var newScrollPosition = parseInt(this.scrollTop / 84) * 84,
_this = this;
clearInterval(scrollTimerHandle);
scrollTimerHandle = setTimeout(function() {
_this.scrollTop = newScrollPosition ;
}, 1000);
});
Play here http://jsfiddle.net/R7tAK/4/
Problem
I have a container div with fixed size and overflow: scroll, it's filled with smaller divs making a sort of list. here is a fiddle example: http://jsfiddle.net/etYSC/2/ what I want is that the scrolling never cuts a box, making always 3 full boxes showing (in this example), so it will scroll always a fixed number of pixels. How do I do this? I'm using jquery library. Google has been a harsh mistress on this question because of the misleading keywords. -- solution I was able to refine kiranvj code a bit more and I am very pleased with the final result. snapping the the previous div: ``` var scrollTimerHandle = ""; var positionTimerHandle = ""; $("#container").scroll(function() { var boxSize = 84; var newScrollPosition = parseInt(this.scrollTop / boxSize) * boxSize, _this = this; clearInterval(scrollTimerHandle); scrollTimerHandle = setTimeout(function() { positionTimerHandle = setInterval(function(){ if (_this.scrollTop == newScrollPosition){ clearInterval(positionTimerHandle); } else { _this.scrollTop--; } }, 5); }, 600); }); ``` http://jsfiddle.net/etYSC/7/ snapping to the closest div ``` var scrollTimerHandle = ""; var positionTimerHandle = ""; $("#container").scroll(function() { var boxSize = 84; var preScrollPosition = parseInt(this.scrollTop / boxSize) * boxSize; var newScrollPosition = this.scrollTop - preScrollPosition < boxSize /2 ? preScrollPosition : preScrollPosition + boxSize; _this = this; clearInterval(scrollTimerHandle); scrollTimerHandle = setTimeout(function() { positionTimerHandle = setInterval(function(){ if (_this.scrollTop == newScrollPosition){ clearInterval(positionTimerHandle); } else { if (_this.scrollTop > newScrollPosition){ _this.scrollTop--; } else { _this.scrollTop++; } } }, 5); }, 700); }); ``` http://jsfiddle.net/etYSC/8/ Thanks for all the help, I was lost on how to aproach this and learned a good deal today.