Ok, first a little background. In the early days of the web, browsers had these things called anchors, or as you now know them, a
tags:
<a name="foo">
Anchors let you "bookmark" a part of a page, so that you could then link to that part specifically:
<a href="#foo">
Eventually, browsers added ID attributes as anchors also.
Then modern JS and Backbone came along, and that's where the trouble started, because the Backbone router hijacks that system. This means that if you want to use Backbone's router, you lose the ability to have normal anchors.
However, all is not lost. One option is to make Backbone not use the URL hash for it's router, and instead rely on the browser's "push state". You can do this by passing an extra option when you start the router:
Backbone.history.start({pushState: true})
You can read more about the limitations of that approach here:
http://backbonejs.org/#History
but the short version is that it will only work for the browsers marked in green here:
http://caniuse.com/#search=pushstate
Another approach would be to re-create your own anchor system, using jQuery. Basically you can create a fallthrough for when none of your routes match:
if (!Backbone.history.start() {
and then in that fallthrough you can use jQuery to manually scroll to the desired point:
$('html, body').animate({
scrollTop: $('#' + window.location.hash).offset().top
}, 1000);
You could also get fancy and define custom routes instead of using a fallthrough, but I'll leave that up to you.
In addition to these options @Pramod linked to a question with answers containing still other options you could also consider (like modifying the Backbone router to build scrolling functionality in).