Cette fonction fonctionne très bien. Il fait défiler le corps jusqu'au décalage du conteneur souhaité
function scrolear(destino){
var stop = $(destino).offset().top;
var delay = 1000;
$('body').animate({scrollTop: stop}, delay);
return false;
}
Mais pas dans Firefox. Pourquoi?
-ÉDITER-
Pour gérer le double déclenchement dans la réponse acceptée, je suggère d'arrêter l'élément avant l'animation:
$('body,html').stop(true,true).animate({scrollTop: stop}, delay);
Réponses:
Firefox place le débordement au
html
niveau, sauf s'il est spécifiquement conçu pour se comporter différemment.Pour le faire fonctionner dans Firefox, utilisez
Exemple de travail
La solution CSS serait de définir les styles suivants:
Je suppose que la solution JS serait la moins invasive.
Mettre à jour
Une grande partie de la discussion ci-dessous se concentre sur le fait que l'animation
scrollTop
de deux éléments entraînerait l'appel du rappel à deux reprises. Des fonctionnalités de détection de navigateur ont été suggérées puis obsolètes, et certaines sont sans doute plutôt exagérées.Si le rappel est idempotent et ne nécessite pas beaucoup de puissance de calcul, le déclencher deux fois peut être un non-problème complet. Si plusieurs appels du rappel sont vraiment un problème et si vous souhaitez éviter la détection de fonctionnalité, il peut être plus simple de faire en sorte que le rappel ne soit exécuté qu'une seule fois à partir du rappel:
la source
$(jQuery.browser.webkit ? "body": "html").animate(...);
$(jQuery.browser.mozilla ? "html" : "body").animate(...);
. Ce serait bien de ne pas utiliser le sniffing de navigation, mais la détection de fonctionnalités. Je ne sais pas comment faire la détection de fonctionnalités sur le CSSjQuery.browser
est obsolète et manquant dans la dernière version de jQuerywindow.scroll
qu'il n'anime pas. Vous pouvez bien sûr rouler votre propre truc avec des intervalles etscrollBy
. Si vous souhaitez ajouter de la facilité à cela, vous avez soudainement beaucoup de code à écrire pour un aspect plutôt mineur de votre produit.La détection des fonctionnalités, puis l'animation sur un seul objet pris en charge serait bien, mais il n'y a pas de solution en une seule ligne. En attendant, voici un moyen d'utiliser une promesse pour faire un seul rappel par exécution.
MISE À JOUR: Voici comment vous pouvez utiliser la détection des fonctionnalités à la place. Ce morceau de code doit être évalué avant votre appel d'animation:
Maintenant, utilisez le var que nous venons de définir comme sélecteur pour l'animation de défilement de page, et utilisez la syntaxe normale:
la source
html
et parfois revenirbody
. Voici mon code après avoir déclaré la fonctionvar scrollTopElement; setTimeout( function() { scrollTopElement = getScrollTopElement(); console.log(scrollTopElement); }, 1000);
Merci pour cela, cela a résolu mon problème.html
au lieu debody
ce qu'il est supposé. Ce n'est que si vous faites défiler tout le long de la page Web et que vous rechargez, sinon cela fonctionne.J'ai passé des années à essayer de comprendre pourquoi mon code ne fonctionnait pas -
Le problème était dans mon css -
Je l'ai réglé à la
auto
place (et je me suis demandé pourquoi il avait été réglé100%
en premier lieu). Cela a réglé le problème pour moi.la source
Vous voudrez peut-être éviter le problème en utilisant un plugin - plus précisément, mon plugin :)
Sérieusement, même si le problème de base a été résolu depuis longtemps (différents navigateurs utilisent différents éléments pour le défilement de la fenêtre), il y a pas mal de problèmes non triviaux sur la ligne qui peuvent vous trébucher:
body
ethtml
a ses problèmes ,Je suis évidemment partial, mais jQuery.scrollable est en fait un bon choix pour résoudre ces problèmes. (En fait, je ne connais aucun autre plugin qui les gère tous.)
De plus, vous pouvez calculer la position cible - celle vers laquelle vous faites défiler - de manière à toute épreuve avec la
getScrollTargetPosition()
fonction dans cet essentiel .Tout cela vous laisserait avec
la source
Méfiez-vous de cela. J'ai eu le même problème, ni Firefox ni Explorer ne faisant défiler avec
Alors j'ai utilisé comme David l'a dit
Super cela a fonctionné, mais nouveau problème, car il y a deux éléments, le corps et le html, la fonction est exécutée deux fois, c'est-à-dire, X exécute deux fois.
essayé uniquement avec «html», et Firefox et Explorer fonctionnent, mais maintenant Chrome ne le prend pas en charge.
Il faut donc du corps pour Chrome et du html pour Firefox et Explorer. Est-ce un bogue jQuery? ne sais pas.
Méfiez-vous simplement de votre fonction, car elle fonctionnera deux fois.
la source
Je recommanderais de ne pas compter sur
body
nihtml
comme solution plus portable. Ajoutez simplement un div dans le corps qui vise à contenir les éléments défilés et le stylisez comme pour activer le défilement en taille réelle:(en supposant que
display:block;
et quetop:0;left:0;
les valeurs par défaut correspondent à votre objectif), utilisez-les$('#my-scroll')
pour vos animations.la source
C'est la vraie affaire. Cela fonctionne parfaitement sur Chrome et Firefox. Il est même triste que certains ignorants me votent contre. Ce code fonctionne littéralement parfaitement tel quel sur tous les navigateurs. Il vous suffit d'ajouter un lien et de mettre l'id de l'élément que vous souhaitez faire défiler dans le href et cela fonctionne sans rien spécifier. Code purement réutilisable et fiable.
la source
J'ai rencontré le même problème récemment et je l'ai résolu en faisant ceci:
Et youpi !!! cela fonctionne sur tous les navigateurs.
au cas où le positionnement n'est pas correct, vous pouvez soustraire une valeur de offset () .top en faisant ceci
la source
Pour moi, le problème était que Firefox sautait automatiquement à l'ancre avec le nom-attribut identique au nom de hachage que j'ai mis dans l'URL. Même si j'ai mis .preventDefault () pour éviter cela. Ainsi, après avoir modifié les attributs de nom, Firefox n'a pas automatiquement accédé aux ancres, mais a exécuté correctement l'animation.
@Toni Désolé si ce n'était pas compréhensible. La chose est que j'ai changé les hachages dans l'URL comme www.someurl.com/#hashname. Ensuite, j'ai eu par exemple une ancre comme
<a name="hashname" ...></a>
vers laquelle jQuery devrait défiler automatiquement. Mais ce n'est pas le cas, car il est passé directement à l'ancre avec l'attribut de nom correspondant dans Firefox sans aucune animation de défilement. Une fois que j'ai changé l'attribut de nom en quelque chose de différent du nom de hachage, par exemplename="hashname-anchor"
, le défilement a fonctionné.la source
Pour moi, cela évitait d'ajouter l'ID au point d'animation:
Éviter:
Préparer l'id au préalable et faire ceci à la place:
Corrigé dans FF. (Les ajouts css n'ont pas fait de différence pour moi)
la source
J'espère que cela fonctionne.
la source