En ce moment, j'utilise ceci:
$('#go-to-top').each(function(){
$(this).click(function(){
$('html').animate({ scrollTop: 0 }, 'slow'); return true;
});
});
qui ne fonctionne pas dans Chrome et dans Opera, un petit scintillement se produit: le navigateur défile instantanément vers le haut, puis de nouveau vers le bas, puis commence à défiler lentement, comme il se doit.
Y a-t-il une meilleure manière de faire cela?
Vous retournez true
à partir de la fonction click. Cela n'empêchera donc pas le comportement du navigateur par défaut (c'est-à-dire naviguer jusqu'à l'ancrego-to-top
. Comme Mark l'a dit, utilisez:
$('html,body').animate({ scrollTop: 0 }, 'slow');
Donc, votre code devrait maintenant ressembler à:
$('#go-to-top').each(function(){
$(this).click(function(){
$('html,body').animate({ scrollTop: 0 }, 'slow');
return false;
});
});
Pour que cela fonctionne à l'opéra, cette réponse s'est avérée utile.
Mettre cela avec votre click()
$(this).click(function() {
$(window.opera ? 'html' : 'html, body').animate({
scrollTop: 0
}, 'slow');
});
Exemple de code sur jsfiddle .
Note latérale _ si vous ne faites qu'utiliser .each()
, vous affectez un gestionnaire de clics qu'il n'est pas nécessaire de parcourir sur la collection.
$('#go-to-top').click(function(){
$(window.opera ? 'html' : 'html, body').animate({
scrollTop: 0
}, 'slow');
});
De plus, s'il y a plus d'un élément avec l'ID #go-to-top
votre balise sera invalide, essayez de le changer en classe .go-to-top
$(window).animate({ scrollTop: 0 }, 'slow');
Cela fonctionne multi-navigateur
peut-être quelque chose comme
$('body').animate({scrollTop:0}, 'slow');
ainsi que celui en html.
modifier>
$('#go-to-top').each(function(){
$(this).click(function(){
$('html').animate({ scrollTop: 0 }, 'slow'); return true;
$('body').animate({ scrollTop: 0 }, 'slow'); return true;
$('document').animate({ scrollTop: 0 }, 'slow'); return true;
$('window').animate({ scrollTop: 0 }, 'slow'); return true;
});
});
devrait couvrir tous les navigateurs!
Hm ... étrange, avec jsFiddle, je peux le faire fonctionner correctement dans Opera (version 11.01), mais dans Chrome, il saute juste au sommet et ne l’anime pas comme vous le souhaitez.
Vous pouvez voir le jsFiddle ici si vous voulez: http://jsfiddle.net/H7RFU/
J'espère que cela aide un peu, même si ce n'est pas vraiment une réponse.
Si ce que j'ai créé ne correspond pas à votre code HTML, etc., veuillez le mettre à jour et l'ajouter.
Meilleures salutations,
Christian
Avertissement: je n'avais pas utilisé la fonction de sauvegarde de jsFiddle auparavant, donc je ne sais pas pour combien de temps il l'a sauvegardé.
J'utilise ceci, c'est aussi simple
$(document).ready(function(e) {
var a = 400,
t = 1200,
l = 700,
s = e(".scrool-top");
e(window).scroll(function() {
e(this).scrollTop() > a ? s.addClass("scrool-is-visible") : s.removeClass("scrool-is-visible scrool-fade-out"), e(this).scrollTop() > t && s.addClass("scrool-fade-out")
}), s.on("click", function(a) {
a.preventDefault(), e("body,html").animate({
scrollTop: 0
}, l)
})
})
Cela fonctionnera dans tous les navigateurs. Cela évite la balise de hachage sur l'URL, le défilement est terminé!
$('#back-top a[href*=#]:not([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) {
$('html,body').animate({
scrollTop: target.offset().top
}, 1000);
return false;
}
}
});
J'ai une solution fluide de deux manières: un défilement régulier et un bouton lisse.
Avec JavaScript désactivé, il s’agit simplement d’un lien en bas de la page vers l’ancre top
.
(#
comme href peut être assez instable.)
Avec JavaScript activé:
href
et ajoutez le gestionnaire click
pour un défilement régulier . (Garde l'URL et l'historique du navigateur ordonnés et je n'ai besoin d'aucun return
ou preventDefault
dans la fonction de défilement)HTML
<body>
<a name="top"></a>
...
<div id="scrolltotop" style="display:block;text-align:right">
<a href="#top" title="scroll to top"><img src="scrolltotop.png" alt="scroll to top"></a>
</div>
</body>
jQuery
function scrolltotop_display()
{
var el=$('#scrolltotop');
if((window.pageYOffset||document.documentElement.scrollTop)>window.innerHeight)
{ if(!el.is(':visible')) { el.stop(true, true).fadeIn(); } }
else { if(!el.is(':animated')) { el.stop(true, true).fadeOut(); }}
}
function scrolltotop_position()
{
var el=$('#scrolltotop');
el.css('top', window.innerHeight-100);
el.css('left', window.innerWidth-100);
scrolltotop_display();
}
$(window).on('load', function(){
$('#scrolltotop').css('display', 'none');
$('#scrollToTop').css('position', 'fixed');
scrolltotop_position();
$('#scrollToTop a').removeAttr('href');
$('#scrollToTop a').on('click', function(){$('html, body').animate({scrollTop:0}, 500);});
});
$(window).on('scroll', scrolltotop_display);
$(window).on('resize', scrolltotop_position);