Animer scrollTop ne fonctionne pas sous firefox
Cette fonction fonctionne très bien. Il permet de faire défiler le corps d'un contenant souhaité décalage
function scrolear(destino){
var stop = $(destino).offset().top;
var delay = 1000;
$('body').animate({scrollTop: stop}, delay);
return false;
}
Mais pas dans Firefox. Pourquoi?
-EDIT-
De poignée de gâchette double dans la accepté de répondre, je vous suggère de stopper l'élément avant de l'animation:
$('body,html').stop(true,true).animate({scrollTop: stop}, delay);
- Votre code final est la plus élégante de toutes les choses ici.
Vous devez vous connecter pour publier un commentaire.
Firefox lieux le déborder à l'
html
niveau, à moins d'être spécifiquement conçu pour se comporter différemment.Pour qu'il fonctionne dans Firefox, utilisez
Exemple de travail
Le CSS solution serait de définir les styles suivants:
Je suppose que le JS solution serait moins invasive.
Mise à jour
Beaucoup de la discussion ci-dessous met l'accent sur le fait que l'animation de la
scrollTop
de deux éléments serait la cause de la fonction de rappel pour être invoqué à deux reprises. Le navigateur des fonctions de détection ont été proposées et par la suite obsolète, et certains sont sans doute plutôt farfelue.Si le rappel est idempotent et ne nécessite pas beaucoup de puissance de calcul, le tirant deux fois peut être un non-problème. Si de multiples appels de la fonction de rappel sont vraiment un problème, et si vous voulez éviter la fonctionnalité de détection, il peut être plus simple à appliquer que le rappel est exécuté qu'une fois de l'intérieur de la fonction de rappel:
$(jQuery.browser.webkit ? "body": "html").animate(...);
$(jQuery.browser.mozilla ? "html" : "body").animate(...);
. Il serait bon de ne pas utiliser de parcourir le sniffing, mais la détection de fonctionnalité. Pas sûr de la façon de faire de la détection de fonctionnalité sur le CSS sijQuery.browser
est obsolète et manquant de la dernière version jQueryoverflow
auto|hidden
ne le fait pas, il suffit d'utiliservisible
et il va l'obliger (juste une note pour toute autre personne ayant des problèmes avec elle)visible
résout le problème dans firefox. Mais ensuite, le défilement ne fonctionne PAS !$(referencia).offset().top
. Au lieu de cela, utiliser:$(referencia).offset().top + $('body').get(0).scrollTop + $('html').get(0).scrollTop
. Mais, à n'utiliser que dans Firefox, qui est, l'utilisation d'une condition de typeif (typeof InstallTrigger! == 'undefined')
window.scroll
ne pas les animer. Vous pouvez bien sûr rouler votre propre chose avec des intervalles etscrollBy
. Si vous souhaitez ajouter d'assouplissement pour que, soudain, vous avez beaucoup de code à écrire pour plutôt un aspect mineur de votre produit.La détection de fonctionnalité et puis l'animation sur un seul objet pris en charge serait bien, mais il n'y a pas une solution en ligne. En attendant, voici une façon d'utiliser une promesse de faire un simple rappel à chaque exécution.
Mise à JOUR:
Voici comment vous pouvez utiliser la fonctionnalité de détection de la place. Ce morceau de code doit évaluée avant votre animation appel:
Maintenant utiliser le var que nous venons de définir comme le sélecteur de page, le défilement de l'animation, et l'utilisation de la syntaxe normale:
html
et parfois retourbody
. Voici mon code après la déclaration de la fonctionvar scrollTopElement; setTimeout( function() { scrollTopElement = getScrollTopElement(); console.log(scrollTopElement); }, 1000);
Merci pour ce bien, il a résolu mon problème.html
au lieu debody
comme il est censé. C'est seulement si vous faites défiler tout le chemin en bas de la page et vous recharger, sinon, il fonctionne.J'ai passé du temps à essayer de comprendre pourquoi mon code ne fonctionne pas -
Le problème était dans mon css -
Je l'ai mis à
auto
à la place (et a gauche se soucier pourquoi il a été mis à100%
en premier lieu). Qu'il fixe pour moi.Vous pourriez vouloir esquiver le problème en utilisant un plugin – plus précisément, mon plugin 🙂
Au sérieux, même si le problème de base a depuis longtemps été abordées (les différents navigateurs utiliser différents éléments de la fenêtre de défilement), il existe assez peu de non-trivial questions en bas de la ligne qui peut vous passionner:
body
ethtml
a ses problèmes,Je suis évidemment partial, mais jQuery.défilement est en fait un bon choix pour répondre à ces questions. (En fait, je ne connais pas d'autre plugin qui gère tout.)
En outre, vous pouvez calculer la position de la cible, celui qui vous faites défiler jusqu'à une épreuve des balles de manière à le
getScrollTargetPosition()
de la fonction dans ce gist.Tous qui vous quitterait avec
Méfiez-vous de cela.
J'ai eu le même problème, ni Firefox ou Explorer le défilement avec la
J'ai donc utilisé comme le dit David
Grand, il a travaillé, mais nouveau problème, puisqu'il y a deux éléments, le corps et l'html, la fonction est exécutée deux fois, c'est, faire X s'exécute deux fois.
essayé seulement avec "html", et Firefox et Explorer de travail, mais maintenant, google Chrome ne prend pas en charge cette.
Il est donc nécessaire de corps pour Chrome, et html pour les navigateurs Firefox et Explorer. Est-ce un bug jQuery? ne sais pas.
Méfiez-vous cependant de votre fonction, car il sera exécuté deux fois.
Je recommanderais pas en s'appuyant sur
body
nihtml
comme une solution portable. Il suffit d'ajouter une div dans le corps, qui vise à contenir l'défiler les éléments et le style de permettre la pleine taille de défilement:(en supposant que
display:block;
ettop:0;left:0;
sont les valeurs par défaut qui correspond à votre objectif), puis utilisez$('#my-scroll')
pour vos animations.C'est la vraie affaire. Il fonctionne sur Chrome et Firefox parfaitement.
Il est même triste que certains ignorants vote moi vers le bas. Ce code littéralement fonctionne parfaitement sur tous les navigateurs. Vous avez seulement besoin d'ajouter un lien et de mettre l'id de l'élément que vous souhaitez faire défiler dans le href et il fonctionne sans préciser quoi que ce soit. Pure réutilisables et fiable des codes.
J'ai rencontré le même problème récemment et je l'ai résolu en faisant ceci:
Et youpi !!! il fonctionne sur tous les navigateurs.
dans le cas où le positionnement n'est pas correct, vous pouvez soustraire une valeur de l'offset () .haut en faisant cela,
Pour moi le problème était que firefox automatiquement sauté à l'ancre avec le nom-attribut le même que le nom de hachage je l'ai mis dans l'URL. Même si je l'ai mis .preventDefault() pour l'en empêcher. Donc après avoir changé le nom des attributs, firefox n'a pas automatiquement pour les ancres, mais l'exécution de l'animation à droite.
@Toni Désolé si ce n'était pas compréhensible. Le truc, c'est que j'ai changé les valeurs de hachage dans l'URL, par exemple http://www.someurl.com/#hashname. Ensuite, j'ai eu par exemple un point d'ancrage comme
<a name="hashname" ...></a>
pour jQuery qui devrait faire défiler automatiquement. Mais ce n'est pas parce qu'il a sauté à droite à l'ancre avec le même nom d'attribut dans Firefox sans défilement de l'animation. Une fois j'ai changé le nom de l'attribut à quelque chose de différent à partir du nom de hachage, par exemple àname="hashname-anchor"
, le défilement travaillé.Pour moi, c'était d'éviter l'ajout de la carte d'identité à la pointe de l'animation:
Éviter:
La préparation de l'id de l'avance et de faire ceci à la place:
Fixe dans FF. (Le css ajouts de ne pas faire une différence pour moi)
Espère que cela fonctionne.