Puede configurar su href en #!lugar de#
Por ejemplo,
<a href="#!">Link</a>
no hará ningún desplazamiento al hacer clic.
¡Tener cuidado! Esto aún agregará una entrada al historial del navegador cuando se haga clic, lo que significa que después de hacer clic en su enlace, el botón de retroceso del usuario no los llevará a la página en la que estaban anteriormente. Por esta razón, probablemente sea mejor usar el .preventDefault()enfoque, o usar ambos en combinación.
Aquí hay un Fiddle que ilustra esto (simplemente mueva el navegador hacia abajo hasta que obtenga una barra de desplazamiento):
http://jsfiddle.net/9dEG7/
Para los nerds específicos, por qué esto funciona:
Este comportamiento se especifica en la especificación HTML5 en la sección Navegar a un identificador de fragmento . La razón por la que un enlace con un href de "#"hace que el documento se desplace hacia arriba es que este comportamiento se especifica explícitamente como la forma de manejar un identificador de fragmento vacío:
2. Si fragides la cadena vacía, entonces la parte indicada del documento es la parte superior del documento
Usar un href de en su "#!"lugar funciona simplemente porque evita esta regla. No hay nada de mágico en el signo de exclamación: solo hace un identificador de fragmento conveniente porque es notablemente diferente a un típico frágil y es poco probable que coincida con el ido namede un elemento en su página. De hecho, podríamos poner casi cualquier cosa después del hash; los únicos frágiles que no serán suficientes son la cadena vacía, la palabra 'top' o cadenas que coinciden nameo idatributos de elementos en la página.
Más exactamente, solo necesitamos un identificador de fragmento que nos hará pasar al paso 8 en el siguiente algoritmo para determinar la parte indicada del documento a partir del fragmento:
Aplique el algoritmo del analizador de URL a la URL y deje que fragid sea el componente de fragmento de la URL analizada resultante.
Si fragides la cadena vacía, entonces la parte indicada del documento es la parte superior del documento; Detenga el algoritmo aquí.
Sea fragid bytesel resultado de la decodificación porcentual fragid.
Sea decoded fragidel resultado de aplicar el algoritmo de decodificador UTF-8 a fragid bytes. Si el decodificador UTF-8 emite un error de decodificador, aborte el decodificador y, en su lugar, salte al paso etiquetado no decoded fragid.
Si hay un elemento en el DOM que tiene una ID exactamente igual a decoded fragid, entonces el primer elemento en orden de árbol es la parte indicada del documento; Detenga el algoritmo aquí.
Fragmento sin decodificar : si hay un elemento en el DOM que tiene un atributo de nombre cuyo valor es exactamente igual a fragid( nodecoded fragid ), entonces el primer elemento en orden de árbol es la parte indicada del documento; Detenga el algoritmo aquí.
Si fragid es una coincidencia entre mayúsculas y minúsculas ASCII para la cadena top, entonces la parte indicada del documento es la parte superior del documento; Detenga el algoritmo aquí.
De lo contrario, no hay parte indicada del documento.
Mientras lleguemos al paso 8 y no haya una parte indicada del documento , la siguiente regla entra en juego:
Si no hay una parte indicada ... entonces el agente de usuario no debe hacer nada.
Por eso el navegador no se desplaza.