Ao contrário do que a maioria das pessoas aqui estão sugerindo, eu recomendo que você faça usar um plugin se você quiser animar o movimento. Apenas animar o scrollTop não é suficiente para uma experiência suave do usuário. Veja minha resposta aqui para o raciocínio.
Eu tentei vários plugins ao longo dos anos, mas acabei escrevendo um. Você pode querer dar uma olhada : jQuery.scrollable . Usando isso, a ação de rolagem se torna
$container.scrollTo( targetPosition );
Mas isso não é tudo. Também precisamos fixar a posição alvo. O cálculo que você vê em outras respostas,
$target.offset().top - $container.offset().top + $container.scrollTop()
funciona principalmente, mas não está totalmente correto. Ele não manipula a borda do contêiner de rolagem corretamente. O elemento de destino é rolado para cima demais, pelo tamanho da borda. Aqui está uma demonstração.
Portanto, uma maneira melhor de calcular a posição alvo é
var target = $target[0],
container = $container[0];
targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;
Mais uma vez, dê uma olhada na demonstração para vê-la em ação.
Para uma função que retorna a posição de destino e funciona para contêineres de rolagem de janela e não de janela, fique à vontade para usar essa essência . Os comentários aqui explicam como a posição é calculada.
No começo, eu disse que seria melhor usar um plugin para rolagem animada . Você não precisa de um plug-in, no entanto, se quiser pular para o destino sem uma transição. Veja a resposta de @James para isso, mas certifique-se de calcular a posição de destino corretamente se houver uma borda ao redor do contêiner.