Prise en compte d'un en-tête fixe avec animate.scrolltop et (target) .offset (). Top;
Cela devrait être une jolie question de base, mais j'ai jeté la plupart de mes matin à elle, et à ce point, je suis près de jeter l'éponge. Je n'ai même pas un peu de js foo -- mais j'ai trouvé un bien commenté morceau de code que j'espère utiliser pour animer des liens d'ancrage c'est:
$(document).ready(function() {
$('a[href*=#]').bind('click', function(e) {
e.preventDefault(); //prevent the "normal" behaviour which would be a "hard" jump
var target = $(this).attr("href"); //Get the target
var scrollToPosition = $(target).offset().top;
//perform animated scrolling by getting top-position of target-element and set it as scroll target
$('html, body').stop().animate({ scrollTop: scrollToPosition}, 600, function() {
location.hash = target; //attach the hash (#jumptarget) to the pageurl
});
return false;
});
});
J'essaye de mettre à la terre 30px au-dessus de l'offset().top, j'ai essayé
$('html, body').stop().animate({ scrollTop: scrollToPosition -30}, 600,
Qui fonctionne presque -- il va à la bonne place, mais puis rebondit.
J'ai aussi essayé de
scrollTop: $(target).offset().top - 20 },
J'ai aussi essayé de
scrollTop: $(hash).offset().top + $('#access').outerHeight()
Qui ne semble pas changer quoi que ce soit.
Il semble que la réponse pourrait être ici: JQuery page de défilement problème avec l'en-tête fixe mais j'ai juste ne peux pas sembler obtenir assez.
Je sais que c'est similaire à d'autres questions, mais je suis passé par ce que j'ai pu trouver et je suis analphabète assez que je n'ai pas été en mesure de copier/coller de tout ce qui résout le problème.
Je serais très reconnaissant pour trouver une solution.
Merci beaucoup,
Martin
PS
Cet autre morceau de code que j'ai trouvé ne fonctionne pas mais c'est le décapage, le hashtag, ce qui en fait le plus souvent inutiles.
$(function(){
$('a[href*=#]').click(function() {
if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'')
&& location.hostname == this.hostname) {
var $target = $(this.hash);
$target = $target.length && $target || $('[name=' + this.hash.slice(1) +']');
if ($target.length) {
var targetOffset = $target.offset().top;
$('html,body').animate({scrollTop: targetOffset - 30}, 1000);
return false;
}
}
});
});
source d'informationauteur Martin
Vous devez vous connecter pour publier un commentaire.
ÉDITÉ:
Vous avez juste besoin de détecter la hauteur de l'en-tête fixe et la déduire de la
scrollToPosition
qui vous ont été fait correctement. La question est lawindow.location.hash = "" + target;
sauts de page au dessus de l'élément avec l'id. Donc, si vous animez il y a comme vous le faisiez et puis changer pour la que de hachage, il va "rebondir" comme vous l'avez décrit. Voici la première façon dont nous pouvons lutter contre cela:Voici un nouveau jsfiddle pour cette première méthode: http://jsfiddle.net/yjcRv/1/
PLUS EDIT:
Une bien meilleure façon de contrôle de hachage événements de changement est d'utiliser un plugin comme jQuery Adresse. Avec cela, vous pouvez utiliser votre hashchange événements beaucoup plus. Voici un exemple d'utilisation:
Live exemple ici: http://www.vdotgood.com/stack/user3444.html
REMARQUE: Vous n'avez pas besoin d'ajouter de la valeur de hachage pour vos liens attribut href maintenant. Voici un lien qui pourrait vous cible avec un sélecteur jQuery:
De cible de ce lien, il vous suffit d'utiliser un sélecteur comme:
jQuery Adresse, dans les faits, rechercher les liens qui ont l'attribut suivant:
La
rel
attribut contientaddress:
suivie par une url relative définie par vous dans ce cas/target
. Si vous utilisez cette, jQuery Adresse de détecter le lien et le feu la table de hachage événement de changement automatiquement.Je sais que c'est une vieille question (un peu), mais j'ai rencontré un problème similaire avec un fixe déroulant de navigation sur un site web. Notons que c'est un défilement fluide extrait de code, mais on pouvait facilement le faire automatiquement en changeant la vitesse de l'animation.
jQuery:
J'ai utilisé ce bout de code pour une longue période de temps sans aucun problème. La seule chose que je n'aime pas ce sujet, c'est qu'il va saisir TOUT # tag. Ainsi, dans un plugin comme Flexslider plugin où la navigation utilise #'s I manuellement les dépouiller du plugin.
J'ai modifié le script d'origine http://www.paulund.co.uk/smooth-scroll-to-internal-links-with-jquery. Il fonctionne des merveilles, mais vous ne pouvez pas définir un retard tel qu'il est.
Oui, je suis un peu en retard, mais ce problème vient de se passer pour moi...
Cheers!