Supongo que el problema vendrá más por la parte de JavaScript. ¿Por qué tanto lío con el cálculo de hacia donde mover el scroll? ¿No te vale con tomar la posición real y a eso restarle la altura del menú? No me he parado a mirar cómo lo calculas, pero veo mucha operación ahí, y se me hace,
a priori, innecesariamente complejo.