106 votes

Faire défiler en douceur vers le haut

J'ai cherché cela pendant quelques heures maintenant et je n'ai pas de solution. Je veux un défilement fluide vers le haut de la page. J'ai déjà un défilement fluide vers des ancres séparées dans la page avec un fichier .js attaché à mon site mais je ne peux pas utiliser une ancre pour le haut, car j'utilise un modèle d'un site d'hébergement gratuit avec des outils de construction de page intégrés qui ne me permettent pas de modifier au-dessus de la zone du corps.

Ici est où j'ai trouvé le défilement fluide. J'ai essayé de configurer "défilement en douceur vers un élément sans plugin jQuery" mais je n'ai aucune idée de comment l'organiser évidemment après d'innombrables tentatives. J'ai aussi utilisé window.scrollTo(0, 0); mais il défile instantanément. Merci !

En plus : http://jsfiddle.net/WFd3V/ - le code serait probablement la balise class="smoothScroll" puisque mon autre élément utilise cela, mais je ne sais pas comment le mixer avec le href="javascript:window.scrollTo(0,0);", ou tout autre chose qui pourrait ramener la page en haut sans ancre.

6voto

BitDEVil2K16 Points 139

Hmm fonction de commentaire désactivée pour moi,

essayer ceci

$(document).ready(function(){
    $("#top").hide();
    $(function toTop() {
        $(window).scroll(function () {
            if ($(this).scrollTop() > 100) {
                $('#top').fadeIn();
            } else {
                $('#top').fadeOut();
            }
        });

        $('#top').click(function () {
            $('body,html').animate({
                scrollTop: 0
            }, 800);
            return false;
        });
    });         

    });

#top {
  float:right;
  width:39px;
  margin-top:-35px; 
}
#top {
    transition: all 0.5s ease 0s;
    -moz-transition: all 0.5s ease 0s;
    -webkit-transition: all 0.5s ease 0s;
    -o-transition: all 0.5s ease 0s;
    opacity: 0.5;
    display:none;
    cursor: pointer;
}
#top:hover {
    opacity: 1;
}

 cliquez pour revenir en haut

5voto

Vous devriez commencer à utiliser jQuery ou une autre librairie js. C'est beaucoup plus facile que le js, et vous pouvez l'utiliser comme un raccourci pour la plupart des js au lieu d'utiliser effectivement du js long et fastidieux.

Il suffit de mettre (ou le dernier cdn google https://developers.google.com/speed/libraries/devguide#jquery) dans votre .

Ensuite, à l'intérieur de votre code d'event (beaucoup plus facile si vous utilisez jQuery : $.click() pour les boutons, $.change() pour les cases à cocher, les sélections, radios...), mettez le code de votre deuxième lien ressemblant davantage à

$('#theIDofTheButtonThatTriggersThisAnimation').click(function(){
    $('#theIDofTheElementYouWantToSmoothlyScroll').animate({
        scrollTop: 0
    }, 2000);
});

Cependant, si vous essayez de faire des animations, je vous recommande de vous renseigner sur certaines propriétés css de base comme position:absolute et position:relative pour ne pas devenir fou.


Je ne suis toujours pas tout à fait sûr de ce qui se passe dans votre code car il est très non-standard par rapport à la façon dont les choses se font actuellement avec css & jQuery. Je le décomposerait en quelque chose de simple pour comprendre le concept général.

Pour votre exemple, vous devriez vous baser sur mon exemple d'animation, comment j'ai appris : https://stackoverflow.com/a/12906254/1382306

Je pense que vous essayez de déplacer votre texte vers le haut et vers le bas en fonction d'un $.click(). Dans le fiddle de ma réponse, il glisse de gauche à droite. Vous pouvez facilement le reformater vers le haut et vers le bas en utilisant la propriété css top au lieu de left.

Une fois que vous aurez compris comment déplacer l'ensemble du div vers le haut et vers le bas, vous pourrez créer un conteneur relative pour contenir tous les div absolute du contenu et manipuler tous les div de contenu avec une boucle en définissant leurs top. Voici un bref rappel sur l'absolu dans le relatif : http://css-tricks.com/absolute-positioning-inside-relative-positioning/

Toutes mes animations ont des conteneurs relative et du contenu absolute. C'est ainsi que j'ai créé un plugin de grille personnalisé qui peut parcourir instantanément toute une base de données.

De plus, il n'y a vraiment pas d'abus de div lorsqu'il s'agit d'animation. Essayer de faire en sorte qu'1 div fasse tout est un cauchemar.

Essayez de voir si vous pouvez reformater mon fiddle en une sortie verticale. Une fois que vous l'aurez fait, renseignez-vous un peu sur l'absolu dans le relatif. Si vous avez d'autres problèmes, posez simplement une autre question.

Changez votre façon de penser à ces philosophies, et vous commencerez à voler à travers ce type de codage.

5voto

Waruna Manjula Points 868

Vous pouvez simplement utiliser

// Quand l'utilisateur fait défiler 20px à partir du haut du document, affichez le bouton
window.onscroll = function() {scrollFunction()};

function scrollFunction() {
    if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
        document.getElementById("gotoTop").style.display = "block";
    } else {
        document.getElementById("gotoTop").style.display = "none";
    }

}

// Quand l'utilisateur clique sur le bouton, défiler vers le haut du document
function topFunction() {

     $('html, body').animate({scrollTop:0}, 'slow');
}

body {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 20px;
}

#gotoTop {
  display: none;
  position: fixed;
  bottom: 20px;
  right: 30px;
  z-index: 99;
  font-size: 18px;
  border: none;
  outline: none;
  background-color: red;
  color: white;
  cursor: pointer;
  padding: 15px;
  border-radius: 4px;
}

#gotoTop:hover {
  background-color: #555;
}

Haut

Défiler vers le bas
Cet exemple montre comment créer un bouton "aller en haut" qui devient visible lorsque l'utilisateur commence à faire défiler la page.

4voto

Ron16 Points 115

Élégante solution facile en utilisant jQuery.

    function call() {
        var body = $("html, body");
        body.stop().animate({scrollTop:0}, 500, 'swing', function() {
        });
    }

et dans votre html :

![](../img/arrow-up@2x.png)

3voto

hev1 Points 6033

Pour une liste plus complète des méthodes pour un défilement fluide, consultez ma réponse ici.


Pour faire défiler jusqu'à une certaine position en un temps exact, window.requestAnimationFrame peut être utilisé, calculant la position actuelle appropriée à chaque fois. setTimeout peut être utilisé pour un effet similaire lorsque requestAnimationFrame n'est pas supporté. Pour faire défiler jusqu'en haut de la page, la fonction suivante peut être appelée avec la position comme 0.

/*
   @param pos: la position y où faire défiler jusqu'à (en pixels)
   @param time: la durée exacte du défilement (en millisecondes)
*/
function scrollToSmoothly(pos, time) {
    var currentPos = window.pageYOffset;
    var start = null;
    if(time == null) time = 500;
    pos = +pos, time = +time;
    window.requestAnimationFrame(function step(currentTime) {
        start = !start ? currentTime : start;
        var progress = currentTime - start;
        if (currentPos < pos) {
            window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos);
        } else {
            window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time));
        }
        if (progress < time) {
            window.requestAnimationFrame(step);
        } else {
            window.scrollTo(0, pos);
        }
    });
}

function scrollToSmoothly(pos, time) {
    var currentPos = window.pageYOffset;
    var start = null;
    if(time == null) time = 500;
    pos = +pos, time = +time;
    window.requestAnimationFrame(function step(currentTime) {
        start = !start ? currentTime : start;
        var progress = currentTime - start;
        if (currentPos < pos) {
            window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos);
        } else {
            window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time));
        }
        if (progress < time) {
            window.requestAnimationFrame(step);
        } else {
            window.scrollTo(0, pos);
        }
    });
}

window.scrollTo(0, 2000);
document.querySelector('button').addEventListener('click', function(e){
  scrollToSmoothly(0, 700);
});

Défilement fluide vers le haut

La bibliothèque SmoothScroll.js peut également être utilisée, qui gère des cas plus complexes tels que le défilement fluide à la fois verticalement et horizontalement, le défilement à l'intérieur d'autres éléments conteneurs, différents comportements de facilité, le défilement de manière relative à la position actuelle, et plus encore.

smoothScroll({yPos: 'start', duration: 700});
// ou
smoothScroll({yPos: 0, duration: 700});

window.scrollTo(0, 2000);
document.querySelector('button').addEventListener('click', function(e){
  smoothScroll({yPos: 'start', duration: 700});
});

Défilement fluide vers le haut

Alternativement, vous pouvez passer un objet d'options à window.scroll avec le comportement défini sur smooth, qui défile jusqu'à une position x et y spécifique, ou window.scrollBy qui fait défiler une certaine quantité depuis la position actuelle :

// Faire défiler jusqu'à des valeurs spécifiques
// scrollTo est similaire
window.scroll({
  top: 2500, 
  left: 0, 
  behavior: 'smooth' 
});

// Faire défiler certaines quantités depuis la position actuelle
window.scrollBy({ 
  top: 100, // pourrait être une valeur négative
  left: 0, 
  behavior: 'smooth' 
});

window.scrollTo(0, 2000);
document.querySelector('button').addEventListener('click', function(e){
  window.scroll({top: 0, left: 0, behavior: 'smooth'});
});

Défilement fluide vers le haut

Les navigateurs modernes prennent en charge la propriété CSS scroll-behavior, qui peut être utilisée pour rendre le défilement dans le document fluide (sans besoin de JavaScript).

window.scrollTo(0, 2000);
document.querySelector('button').addEventListener('click', function(e){
  window.scrollTo(0, 0);
});

html, body {
  scroll-behavior: smooth;
}

Défilement vers le haut (JavaScript) 
Lien pour défiler en douceur vers le haut de la page (sans JavaScript)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X