window.addEventListener("hashchange", function () {
window.scrollTo(window.scrollX, window.scrollY - 100);
});
Cela permettra au navigateur de faire le travail de saut vers l'ancre pour nous et nous utiliserons ensuite cette position pour nous décaler.
EDIT 1 :
Comme l'a fait remarquer @erb, cela ne fonctionne que si vous êtes sur la page lorsque le hachage est modifié. Entrer dans la page avec un #something
déjà dans l'URL ne fonctionne pas avec le code ci-dessus. Voici une autre version pour gérer cela :
// The function actually applying the offset
function offsetAnchor() {
if(location.hash.length !== 0) {
window.scrollTo(window.scrollX, window.scrollY - 100);
}
}
// This will capture hash changes while on the page
window.addEventListener("hashchange", offsetAnchor);
// This is here so that when you enter the page with a hash,
// it can provide the offset in that case too. Having a timeout
// seems necessary to allow the browser to jump to the anchor first.
window.setTimeout(offsetAnchor, 1); // The delay of 1 is arbitrary and may not always work right (although it did in my testing).
NOTE : Pour utiliser jQuery, vous pouvez simplement remplacer window.addEventListener
avec $(window).on
dans les exemples. Merci @Neon.
EDIT 2 :
Comme l'ont fait remarquer quelques personnes, la méthode ci-dessus échouera si vous cliquez sur le même lien d'ancrage deux ou plusieurs fois de suite, car il n'y a pas d'effet de levier. hashchange
pour forcer le décalage.
Cette solution est une version très légèrement modifiée de la suggestion de @Mave et utilise des sélecteurs jQuery pour plus de simplicité.
// The function actually applying the offset
function offsetAnchor() {
if (location.hash.length !== 0) {
window.scrollTo(window.scrollX, window.scrollY - 100);
}
}
// Captures click events of all <a> elements with href starting with #
$(document).on('click', 'a[href^="#"]', function(event) {
// Click events are captured before hashchanges. Timeout
// causes offsetAnchor to be called after the page jump.
window.setTimeout(function() {
offsetAnchor();
}, 0);
});
// Set the offset when entering page with hash present in the url
window.setTimeout(offsetAnchor, 0);
JSFiddle pour cet exemple est aquí