{"id":1404,"date":"2011-09-05T12:09:02","date_gmt":"2011-09-05T10:09:02","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=1404"},"modified":"2018-01-05T19:32:49","modified_gmt":"2018-01-05T18:32:49","slug":"jquery-effet-smooth-scroll-defilement-fluide","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/jquery-effet-smooth-scroll-defilement-fluide","title":{"rendered":"jQuery &#8211; Effet smooth scroll (d\u00e9filement fluide)"},"content":{"rendered":"<p>L&rsquo;effet de <em lang=\"en\">scroll<\/em> fluide est d\u00e9j\u00e0 int\u00e9gr\u00e9, en fonction de vos param\u00e8tres utilisateur, sur certains navigateurs. Il se manifeste par un d\u00e9filement fluide de la page web lorsque vous descendez ou montez gr\u00e2ce \u00e0 la molette de votre souris, ou les touches de votre clavier. Il est possible de g\u00e9n\u00e9rer cet effet au clic sur une ancre gr\u00e2ce \u00e0 JavaScript.<!--more--><\/p>\n<p>Il y a quelques temps de cela (peut-\u00eatre trois ans maintenant) j&rsquo;avais trouv\u00e9 un script JS pour ajouter cet effet, mais celui-ci ne prenait en compte que les ancres dot\u00e9es de l&rsquo;attribut <code>name<\/code>, sous cette forme :<\/p>\n<pre class=\"code\"><code class=\"language-markup\">&lt;a href=\"#cible\"&gt;Aller \u00e0 \"cible\"&lt;\/a&gt;\r\n&lt;!-- plus loin dans la page --&gt;\r\n&lt;a name=\"cible\"&gt;&lt;\/a&gt;<\/code><\/pre>\n<p>Or la cr\u00e9ation d&rsquo;un \u00e9l\u00e9ment <em lang=\"en\">anchor<\/em> dans le seul but de cr\u00e9er une ancre ne me semblait pas la m\u00e9thode la plus propre, mais comme j&rsquo;\u00e9tais une quiche en JavaScript (\u00e7a n&rsquo;a pas trop chang\u00e9 d&rsquo;ailleurs, puisque j&rsquo;utilise principalement jQuery pour me faciliter l&rsquo;existence), j&rsquo;ai fait avec ce code jusqu&rsquo;\u00e0 ce que je d\u00e9couvre jQuery et le <a lang=\"en\" href=\"http:\/\/plugins.jquery.com\/project\/ScrollTo\" hreflang=\"en\">plugin jQuery.scrollTo()<\/a>.<br \/>\nPlugin plut\u00f4t efficace, mais tr\u00e8s lourd pour la petite utilisation que j&rsquo;en faisais.<\/p>\n<p>C&rsquo;est pourquoi aujourd&rsquo;hui je vous propose de cr\u00e9er votre propre script jQuery de <em lang=\"en\">smoothscroll<\/em>.<br \/>\nVoici une petite d\u00e9monstration sommaire :<br \/>\n<a class=\"demonstration\" href=\"\/blog\/doc\/demo-smoothscroll.html\">Effet smoothscroll<\/a>.<\/p>\n<p class=\"center\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1468\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/09\/smoothscroll.jpg\" alt=\"\" width=\"550\" height=\"207\" srcset=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/09\/smoothscroll.jpg 550w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/09\/smoothscroll-300x112.jpg 300w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/p>\n<h2>Solution de base<\/h2>\n<p><abbr title=\"Nota Bene\">NB<\/abbr> : les codes JavaScript qui vont suivre sont \u00e0 placer apr\u00e8s l&rsquo;appel \u00e0 la biblioth\u00e8que jQuery, fait sous cette forme, par exemple :<\/p>\n<pre class=\"code\"><code class=\"language-markup\">&lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.6.2\/jquery.min.js\" type=\"text\/javascript\"&gt;&lt;\/script&gt;\r\n&lt;script type=\"text\/javascript\"&gt;\r\n&lt;!-- votre script ici --&gt;\r\n&lt;\/script&gt;<\/code><\/pre>\n<p>Dans le cadre d&rsquo;une utilisation simple des ancres, votre code HTML doit ressembler \u00e0 peu pr\u00e8s \u00e0 cela :<\/p>\n<pre class=\"code\"><code class=\"language-markup\">&lt;a href=\"#contact\"&gt;Contact&lt;\/a&gt;\r\n&lt;!-- plus loin dans la page --&gt;\r\n&lt;h2 id=\"contact\"&gt;Contact&lt;\/h2&gt;<\/code><\/pre>\n<p>On a donc simplement un <code>href<\/code> portant une # (di\u00e8se) suivie de la valeur de l&rsquo;<code>id<\/code> (unique, mais inutile de le rappeler&#8230; hein ?) cibl\u00e9.<\/p>\n<p>On aurait donc un script jQuery dans ce go\u00fbt l\u00e0 :<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">$('a[href^=\"#\"]').click(function(){\r\n\tvar the_id = $(this).attr(\"href\");\r\n\tif (the_id === '#') {\r\n\t\treturn;\r\n\t}\r\n\t$('html, body').animate({\r\n\t\tscrollTop:$(the_id).offset().top\r\n\t}, 'slow');\r\n\treturn false;\r\n});\r\n<\/code><\/pre>\n<p>Au <code>click<\/code> sur un lien dont l&rsquo;attribut <code>href<\/code> commence (<code>^=<\/code>) par <code>#<\/code>, j&rsquo;enregistre la valeur de son attribut <code>href<\/code> (<code>$(this).attr(\"href\")<\/code>) dans la variable <code>the_id<\/code>.<br \/>\nLes lignes juste apr\u00e8s v\u00e9rifient que le lien ne soit pas juste un hash vide qui m\u00e8nerait nulle part.(merci Rodolphe pour le compl\u00e9ment)<br \/>\nPuis je fais une animation (<code>animate()<\/code>) qui consiste \u00e0 scroller (<code>scrollTop<\/code>) vers le haut de l&rsquo;\u00e9l\u00e9ment cibl\u00e9 (<code>$(the_id).offset().top<\/code>), lentement (<code>slow<\/code>).<br \/>\n<code>return false;<\/code> permet d&rsquo;\u00e9viter le comportement normal lors de l&rsquo;\u00e9v\u00e8nement de clic sur le lien (\u00e0 savoir le saut vers l&rsquo;ancre et son affichage dans l&rsquo;url).<\/p>\n<p>La pr\u00e9sence du s\u00e9lecteur <code>$('html, body')<\/code> permet de corriger un bogue sur Webkit (Chrome et Safari) qui ne semble comprendre qu&rsquo;une animation sur l&rsquo;\u00e9l\u00e9ment <code>body<\/code><\/p>\n<h2>Pr\u00e9voir les autres cas de figure, et cr\u00e9er une fonction<\/h2>\n<p><img decoding=\"async\" class=\"alignleft size-full wp-image-1473\" style=\"border: 0;\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/09\/link.png\" alt=\"\" width=\"125\" height=\"125\" \/>Voil\u00e0 mais\u2026, peut-\u00eatre que vous allez vouloir cr\u00e9er une fonction identique pour un syst\u00e8me qui m\u00e9lange <code>id<\/code> et <code>name<\/code>, ou que vous avez l&rsquo;intention de distribuer g\u00e9n\u00e9reusement un script passe-partout \u00e0 vos visiteurs.<\/p>\n<p>Pour cela il faut pr\u00e9voir l&rsquo;exception que nous connaissons, le code va donc \u00eatre plus long.<br \/>\nJe vous le pr\u00e9sente, nous allons le d\u00e9tailler apr\u00e8s :<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">function juizScrollTo(element){\t\t\t\r\n\t$(element).click(function(){\r\n\t\tvar goscroll = false;\r\n\t\tvar the_hash = $(this).attr(\"href\");\r\n\t\tvar regex = new RegExp(\"\\#(.*)\",\"gi\");\r\n\t\tvar the_element = '';\r\n\u00a0\r\n\t\tif(the_hash.match(\"\\#(.+)\")) {\r\n\t\t\tthe_hash = the_hash.replace(regex,\"$1\");\r\n\u00a0\r\n\t\t\tif($(\"#\"+the_hash).length&gt;0) {\r\n\t\t\t\tthe_element = \"#\" + the_hash;\r\n\t\t\t\tgoscroll = true;\r\n\t\t\t}\r\n\t\t\telse if($(\"a[name=\" + the_hash + \"]\").length&gt;0) {\r\n\t\t\t\tthe_element = \"a[name=\" + the_hash + \"]\";\r\n\t\t\t\tgoscroll = true;\r\n\t\t\t}\r\n\u00a0\r\n\t\t\tif(goscroll) {\r\n\t\t\t\t$('html, body').animate({\r\n\t\t\t\t\tscrollTop:$(the_element).offset().top\r\n\t\t\t\t}, 'slow');\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t});\t\t\t\t\t\r\n};\r\njuizScrollTo('a[href^=\"#\"]');<\/code><\/pre>\n<p>Pour r\u00e9sumer simplement, nous allons ex\u00e9cuter notre animation de tout \u00e0 l&rsquo;heure (ici lignes 22 \u00e0 25) dans la seule condition que notre variable <code>goscroll<\/code> soit ok (<code>true<\/code>).<br \/>\nNotre probl\u00e9matique est la suivante : nous savons que l&rsquo;utilisateur va cliquer sur un lien ayant un attribut <code>href<\/code> commen\u00e7ant par <code>#<\/code>, mais nous ne savons pas s&rsquo;il faut le mener vers l&rsquo;\u00e9l\u00e9ment porteur de l&rsquo;attribut correspondant <code>name<\/code> ou <code>id<\/code>.<\/p>\n<p>On va donc dans un premier temps faire un simple contr\u00f4le en cherchant une di\u00e8se dans l&rsquo;attribut <code>href<\/code> (<abbr title=\"ligne\">l.<\/abbr>8), si on trouve la di\u00e8se on r\u00e9cup\u00e8re la valeur se trouvant juste apr\u00e8s (<abbr>l.<\/abbr>9) gr\u00e2ce \u00e0 la <abbr lang=\"en\" title=\"Regular Expression\">RegExp<\/abbr> pr\u00e9par\u00e9e <abbr>l.<\/abbr>6. Une fois qu&rsquo;on a la cha\u00eene en question, on va pouvoir chercher un \u00e9l\u00e9ment porteur de l&rsquo;<code>id<\/code> ou du <code>name<\/code> correspondant \u00e0 cette cha\u00eene.<\/p>\n<p>Il faut bien commencer par l&rsquo;un ou par l&rsquo;autre, j&rsquo;ai choisi de commencer par l&rsquo;<code>id<\/code> (lignes 13 \u00e0 14). Il suffit de compter le nombre de \u00ab\u00a0#notre_chaine\u00a0\u00bb, si on en a au moins 1 (on ne devrait en avoir qu&rsquo;un !) alors on est bien en recherche d&rsquo;un <code>id<\/code>, si on en a pas, alors on compte le nombre de <code>a<\/code> porteur de l&rsquo;attribut <code>name<\/code> de valeur \u00ab\u00a0notre_chaine\u00a0\u00bb. (lignes 15 \u00e0 18)<\/p>\n<p>Dans cette \u00e9tape, nous sommes cens\u00e9s valider l&rsquo;une ou l&rsquo;autre des situations, nous r\u00e9cup\u00e8rerons donc forc\u00e9ment une valeur de la variable <code>hash<\/code>, et nous passerons notre variable <code>goscroll<\/code> \u00e0 <code>true<\/code> pour effectuer l&rsquo;animation.<br \/>\nS&rsquo;il nous arrivait de ne v\u00e9rifier ni l&rsquo;une ni l&rsquo;autre des conditions (ni <code>id<\/code>, ni <code>name<\/code>), alors le visiteur verra la page sauter vers le haut, puisque votre lien semble renvoyer vers une ancre inexistante.<\/p>\n<p>Pour rendre effectif le fonctionnement de la fonction, il ne reste plus qu&rsquo;\u00e0 en faire l&rsquo;appel en pr\u00e9cisant les <code>a<\/code> concern\u00e9s. (ligne 29)<\/p>\n<p>Personnellement, j&rsquo;ai encore un peu de mal avec notre s\u00e9lecteur sur <code>html<\/code> et <code>body<\/code>, l&rsquo;animation ne s&rsquo;ex\u00e9cute-t-elle pas deux fois simultan\u00e9ment ?<br \/>\nM\u00eame si \u00e7a marche, ce n&rsquo;est pas tr\u00e8s propre.<br \/>\nDans l&rsquo;\u00e9tape d&rsquo;apr\u00e8s, nous allons ajouter un contr\u00f4le, puisque nous savons que la sp\u00e9cificit\u00e9 se trouve sur webkit.<\/p>\n<h2 id=\"part3\">Cr\u00e9ation d&rsquo;une extension de jQuery<\/h2>\n<p><img decoding=\"async\" class=\"alignleft size-full wp-image-1471\" style=\"border: 0;\" title=\"\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/09\/puzzle.png\" alt=\"\" width=\"105\" height=\"104\" \/>Cette partie du tutoriel est un peu plus complexe, mais vous permettra de cr\u00e9er une fonction d&rsquo;extension \u00e0 la biblioth\u00e8que jQuery.<br \/>\nCette fonction vous permettra d&rsquo;ajouter des param\u00e8tres et de cha\u00eener avec d&rsquo;autres fonctions jQuery.<\/p>\n<p>Voyons le code de plus pr\u00e8s :<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">(function($){\r\n\t$.fn.juizScrollTo = function(speed){\r\n\t\tif(!speed) var speed = 'slow';\r\n\u00a0\t\t\t\r\n\t\treturn this.each(function(){\r\n\t\t\t$(this).click(function(){\r\n\t\t\t\tvar goscroll = false;\r\n\t\t\t\tvar the_hash = $(this).attr(\"href\");\r\n\t\t\t\tvar regex = new RegExp(\"(.*)\\#(.*)\",\"gi\");\r\n\t\t\t\tvar the_element = '';\r\n\u00a0\r\n\t\t\t\tif(the_hash.match(\"\\#(.+)\")) {\r\n\u00a0\r\n\t\t\t\t\tthe_hash = the_hash.replace(regex,\"$2\");\r\n\u00a0\r\n\t\t\t\t\tif($(\"#\"+the_hash).length&gt;0) {\r\n\t\t\t\t\t\tthe_element = \"#\" + the_hash;\r\n\t\t\t\t\t\tgoscroll = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if($(\"a[name=\" + the_hash + \"]\").length&gt;0) {\r\n\t\t\t\t\t\tthe_element = \"a[name=\" + the_hash + \"]\";\r\n\t\t\t\t\t\tgoscroll = true;\r\n\t\t\t\t\t}\r\n\u00a0\t\t\t\t\t\t\r\n\t\t\t\t\tif(goscroll) {\r\n\t\t\t\t\t\tvar container = 'html';\r\n\t\t\t\t\t\tif ($.browser.webkit) container = 'body';\r\n\u00a0\r\n\t\t\t\t\t\t$(container).animate({\r\n\t\t\t\t\t\t\tscrollTop:$(the_element).offset().top\r\n\t\t\t\t\t\t}, speed);\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n})(jQuery)\r\n\u00a0\t\r\n$('a[href^=\"#\"]').juizScrollTo('fast').css('color','red');<\/code><\/pre>\n<p>Comme vous pouvez le voir en derni\u00e8re ligne de ce code, l&rsquo;appel \u00e0 la fonction se fait diff\u00e9remment et propose une possibilit\u00e9 de cha\u00eenage et de param\u00e9trage.<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">\t$.fn.juizScrollTo = function(speed){<\/code><\/pre>\n<pre class=\"code\"><code class=\"language-javascript\">\t};<\/code><\/pre>\n<p>Pour obtenir ce r\u00e9sultat, nous cr\u00e9ons l&rsquo;extension gr\u00e2ce \u00e0 la ligne 2 o\u00f9 les informations importantes figurent (le nom de la fonction et les param\u00e8tres) sous cette forme :<br \/>\n<code>$.fn.nom_de_fonction = function(parametre1,parametre2)<\/code>.<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">\t\tif(!speed) var speed = 'slow';<\/code><\/pre>\n<p>La ligne d&rsquo;apr\u00e8s nous permet de v\u00e9rifier si le param\u00e8tre <code>speed<\/code> a \u00e9t\u00e9 renseign\u00e9, s&rsquo;il ne la pas \u00e9t\u00e9 nous attribuons une valeur par d\u00e9faut.<br \/>\nIl est possible d&rsquo;utiliser la fonction <a href=\"http:\/\/api.jquery.com\/jQuery.extend\/\" hreflang=\"en\"><code>extend()<\/code><\/a> pour attribuer un plus grand nombre de param\u00e8tres par d\u00e9faut, cette m\u00e9thode est plus lisible, mais pour l&rsquo;exemple nous en resterons \u00e0 cette mani\u00e8re de proc\u00e9der.<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">\t\treturn this.each(function(){<\/code><\/pre>\n<pre class=\"code\"><code class=\"language-javascript\">\t\t});<\/code><\/pre>\n<p>Nous en sommes \u00e0 la ligne 5, qui poss\u00e8de une particularit\u00e9 : toutes les occurrences (<code>each()<\/code>) de <code>this<\/code> sont retourn\u00e9es. C&rsquo;est cette partie qui nous permet de cha\u00eener (<abbr>l.<\/abbr>36). En retournant <code>this<\/code> (l&rsquo;\u00e9l\u00e9ment sur lequel influe notre fonction) nous pouvons le r\u00e9cup\u00e9rer et le tripatouiller avec une autre fonction \ud83d\ude42<br \/>\nSi notre fonction avait pour but de retourner une valeur autre que l&rsquo;\u00e9l\u00e9ment cibl\u00e9, le cha\u00eenage ne serait plus possible.<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">\t\t$(this).click(function(){<\/code><\/pre>\n<pre class=\"code\"><code class=\"language-javascript\">\t\t});<\/code><\/pre>\n<p>Nous entrons ici dans le gestionnaire d&rsquo;\u00e9v\u00e9nement dont nous avons vu dans les \u00e9tapes pr\u00e9c\u00e9dentes.<br \/>\nLe script reste donc quasiment identique, c&rsquo;est pourquoi je vais m&rsquo;attarder sur les quelques changements uniquement.<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">var container = 'html';  \r\nif ($.browser.webkit) container = 'body'; <\/code><\/pre>\n<p>Nous cr\u00e9ons la variable <code>container<\/code> qui aura pour valeur <code>html<\/code> par d\u00e9faut, ou <code>body<\/code> si jamais on d\u00e9tecte une navigation sous Webkit.<br \/>\nJe vous en avais parl\u00e9 avant, \u00e7a nous permet d&rsquo;effectuer une animation en ne ciblant que l&rsquo;un des deux \u00e9l\u00e9ments.<br \/>\nIl suffit ensuite de remplacer notre ancien s\u00e9lecteur par la variable (ligne 30).<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">}, speed);<\/code><\/pre>\n<p>Sur cette ligne 31 du code, nous avons renseign\u00e9 notre variable <code>speed<\/code>, qui correspond anciennement \u00e0 la valeur <code>\"slow\"<\/code>.<br \/>\nL&rsquo;utilisateur de la fonction peut donc ais\u00e9ment y renseigner <a title=\"Documentation jQuery\" href=\"http:\/\/api.jquery.com\/animate\/#duration\" hreflang=\"en\">une valeur<\/a> de son choix.<\/p>\n<h2>Pitite conclusion<\/h2>\n<p>Pour ceux qui sont arriv\u00e9s au bout de ce tutoriel, je vous dis bravo !<br \/>\nEn esp\u00e9rant que votre fonction fonctionne \u00e0 merveille, n&rsquo;h\u00e9sitez pas \u00e0 compl\u00e9ter, corriger ou critiquer ce tutoriel via les commentaires, ou mon <a href=\"\/blog\/formulaire-de-contact\">formulaire de contact<\/a> pour les timides.<\/p>\n<p>Il est possible d&rsquo;aller encore plus loin pour les fondus de jQuery. Par exemple, la fonction <code><a href=\"http:\/\/api.jquery.com\/animate\/\" hreflang=\"en\">animate()<\/a><\/code> peut accueillir une fonction de <em lang=\"en\">callback<\/em>. C&rsquo;est une fonction qui est appel\u00e9e une fois l&rsquo;animation termin\u00e9e. Vous pouvez donc ajouter en param\u00e8tre de la fonction que nous venons de cr\u00e9er, une possibilit\u00e9 de personnaliser la fonction de <em lang=\"en\">callback<\/em>.<\/p>\n<p>Je vous laisse y r\u00e9fl\u00e9chir\u2026<\/p>\n<p>Allez, enjoy ! \ud83d\ude09<\/p>\n<h2>Bonux<\/h2>\n<p>Apr\u00e8s publication de cet article (il y a 20 minutes), je me suis rendu compte que la navigation au clavier n&rsquo;\u00e9tait pas ais\u00e9e. En effet, une fois la touche <kbd>Entr\u00e9e<\/kbd> press\u00e9e sur un des liens, l&rsquo;effet de scroll s&rsquo;effectue, mais le focus n&rsquo;est pas donn\u00e9 \u00e0 l&rsquo;\u00e9l\u00e9ment cibl\u00e9, et pour cause : il ne poss\u00e8de pas de <code>tabindex<\/code> (dans mon cas, c&rsquo;est une <code>div<\/code>).<br \/>\nLa solution consiste \u00e0 passer en fonction de <em lang=\"en\">callback<\/em> de la fonction <code>animate()<\/code> la fonction suivante :<\/p>\n<pre class=\"code\"><code class=\"language-javascript\">function(){\r\n$(the_hash).attr('tabindex','0').focus().removeAttr('tabindex');\r\n}<\/code><\/pre>\n<p>Elle permet d&rsquo;ajouter un <code>tabindex<\/code> de valeur <code>0<\/code> (permet d&rsquo;offrir la possibilit\u00e9 de porter le focus \u00e0 un \u00e9l\u00e9ment sans casser l&rsquo;ordre de tabulation), attribuer le focus, puis retirer le <code>tabindex<\/code> aussit\u00f4t pour ne pas nous retrouver avec des effets de bord.<br \/>\nJe ne sais pas ce que \u00e7a vaut en terme d&rsquo;accessibilit\u00e9, mais \u00e7a semble rendre bien plus ais\u00e9e la navigation au clavier.<br \/>\nA vous de voir sur la <a href=\"\/blog\/doc\/demo-smoothscroll.html\">page de d\u00e9monstration<\/a>.<\/p>\n<p class=\"message note\">Cet article a \u00e9t\u00e9 \u00e9tendu sur <a href=\"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/mise-jour-jquery-effet-smoothscroll-au-chargement-page\">cette mise \u00e0 jour<\/a>. Allez y jeter un \u0153il \ud83d\ude09<\/p>\n<div class=\"tdm\">\n<h2>Il existe une mise \u00e0 jour<\/h2>\n<ol>\n<li><span class=\"current\">jQuery &#8211; Effet smooth scroll (d\u00e9filement fluide)<\/span><\/li>\n<li><a href=\"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/mise-jour-jquery-effet-smoothscroll-au-chargement-page\" rel=\"next\">[Mise \u00e0 jour] jQuery &#8211; Effet smoothscroll au chargement de la page<\/a><\/li>\n<\/ol>\n<\/div>\n<div class=\"sources\">\n<h2>Liens utiles<\/h2>\n<ul>\n<li><a href=\"\/blog\/doc\/demo-smoothscroll.html\">La d\u00e9monstration du tutoriel<\/a><\/li>\n<li><a href=\"http:\/\/api.jquery.com\/animate\/\" hreflang=\"en\">La documentation sur <code>animate()<\/code><\/a><\/li>\n<li><a lang=\"en\" href=\"http:\/\/www.kirkas.ch\/ascensor\/\" hreflang=\"en\">Plugin jQuery Ascensor<\/a><\/li>\n<li><a lang=\"en\" href=\"http:\/\/plugins.jquery.com\/project\/ScrollTo\" hreflang=\"en\">Plugin jQuery scrollTo<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;effet de scroll fluide est d\u00e9j\u00e0 int\u00e9gr\u00e9, en fonction de vos param\u00e8tres utilisateur, sur certains navigateurs. Il se manifeste par un d\u00e9filement fluide de la page web lorsque vous descendez ou montez gr\u00e2ce \u00e0 la molette de votre souris, ou les touches de votre clavier. Il est possible de g\u00e9n\u00e9rer cet effet au clic sur [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1467,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[610,9,12],"tags":[120,377,375,342,52,165,376],"coauthors":[597],"class_list":["post-1404","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-tutoriels","category-veille-technologique","tag-animation","tag-extension","tag-fluide","tag-fonction","tag-jquery","tag-scroll","tag-smoothscroll"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=1404"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1404\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/1467"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=1404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=1404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=1404"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=1404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}