{"id":1580,"date":"2011-11-21T08:47:34","date_gmt":"2011-11-21T07:47:34","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=1580"},"modified":"2015-01-18T16:20:50","modified_gmt":"2015-01-18T15:20:50","slug":"mise-jour-jquery-effet-smoothscroll-au-chargement-page","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/mise-jour-jquery-effet-smoothscroll-au-chargement-page","title":{"rendered":"[Mise \u00e0 jour] jQuery &#8211; Effet smoothscroll au chargement de la page"},"content":{"rendered":"<p>Apr\u00e8s une demande re\u00e7ue par e-mail, je me suis dit que la fonctionnalit\u00e9 serait peut-\u00eatre utile \u00e0 d&rsquo;autres que moi.<br \/>\nLors de la r\u00e9daction de ce tutoriel : <a href=\"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/jquery-effet-smooth-scroll-defilement-fluide\">jQuery &#8211; Effet Smooth Scroll (d\u00e9filement fluide)<\/a>, la complexit\u00e9 du contenu m&rsquo;a fait retirer une extension int\u00e9ressante \u00e0 la derni\u00e8re fonction\/plugin propos\u00e9e.<!--more--><\/p>\n<div class=\"tdm\">\n<h2>Il s&rsquo;agit d&rsquo;une mise \u00e0 jour<\/h2>\n<ol>\n<li><a rel=\"prev\" href=\"\/blog\/tutoriels\/jquery-effet-smooth-scroll-defilement-fluide\">jQuery &#8211; Effet smooth scroll (d\u00e9filement fluide)<\/a><\/li>\n<li><span class=\"current\">[Mise \u00e0 jour] jQuery &#8211; Effet smoothscroll au chargement de la page<\/span><\/li>\n<\/ol>\n<\/div>\n<h2>Avant propos<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/11\/kiss.png\" alt=\"\" title=\"Keep It Simple and Short\" width=\"135\" height=\"135\" class=\"noborder alignright size-full wp-image-1639\" \/>C&rsquo;est toujours dans une optique de simplicit\u00e9 que j&rsquo;essaye de pr\u00e9senter mes tutoriels. Il est clair qu&rsquo;il y a des points parfois difficiles \u00e0 faire comprendre au plus grand nombre, c&rsquo;est aussi pour cela que je vous invite toujours \u00e0 me signaler toute incompr\u00e9hension sur un tutoriel que vous liriez.<\/p>\n<p>C&rsquo;est aussi pour cela qu&rsquo;il m&rsquo;arrive d&rsquo;avoir des tutoriels complexes, et de les \u00e9purer en retirant des \u00e9l\u00e9ments que je juge inutiles &#8211; au moins dans un premier temps.<\/p>\n<h2>Mise \u00e0 jour<\/h2>\n<p>Le tutoriel \u00ab\u00a0<a href=\"https:\/\/www.creativejuiz.fr\/blog\/les-tutoriels\/jquery-effet-smooth-scroll-defilement-fluide\">jQuery &#8211; Effet Smooth Scroll (d\u00e9filement fluide)<\/a>\u00a0\u00bb  a \u00e9t\u00e9 mis \u00e0 jour aujourd&rsquo;hui m\u00eame afin de faire b\u00e9n\u00e9ficier \u00e0 sa <a href=\"https:\/\/www.creativejuiz.fr\/blog\/les-tutoriels\/jquery-effet-smooth-scroll-defilement-fluide#part3\">troisi\u00e8me partie<\/a> d&rsquo;une meilleure prise en charge des URL absolues fournies d&rsquo;un hash (exemple : <code>http:\/\/creativejuiz.fr\/blog#kiwi<\/code>).<\/p>\n<p class=\"message note\">Ce tutoriel utilise l&rsquo;objet <a href=\"http:\/\/api.jquery.com\/jQuery.browser\/\">$.browser<\/a> retir\u00e9 depuis la version 1.9 de jQuery. Pour plus d&rsquo;information : <a href=\"http:\/\/jquery.com\/upgrade-guide\/1.9\/\">Note de version 1.9 de jQuery<\/a>.<br \/>\nVous pouvez cependant utiliser le script compl\u00e9mentaire pr\u00e9sent sur <a href=\"http:\/\/chez-syl.fr\/2013\/02\/jquery-1-9-et-browser\/\">Chez-Syl.fr<\/a>. Merci \u00e0 Xeroc pour l&rsquo;info.<\/p>\n<p>Pour les utilisateurs de jQuery 1.9 et sup\u00e9rieures, il faudra penser \u00e0 remplacer dans le code ci-dessous :<br \/>\nLive() : <code>$(this).live('click', function()<\/code> par: <code>$(this).on('click', function()<\/code><\/p>\n<h2>Effet de d\u00e9filement au chargement de la page<\/h2>\n<p>Pour effectuer un effet de d\u00e9filement, voil\u00e0 comment expliciter la chose en fran\u00e7ais :<br \/>\n\u00ab\u00a0On cherche \u00e0 obtenir le m\u00eame r\u00e9sultat qu&rsquo;au clic sur l&rsquo;ancre porteuse du lien vers la cible pr\u00e9sente dans la barre d&rsquo;adresse.\u00a0\u00bb<\/p>\n<p><a href=\"\/blog\/doc\/ultimate-smoothscroll.html\" class=\"demonstration\">Voir la d\u00e9monstration<\/a><\/p>\n<p>Il nous faut prendre la phrase \u00e0 l&rsquo;envers et la transformer en jQuery.<br \/>\nDonc en plusieurs \u00e9tapes il nous faut :<\/p>\n<ol>\n<li>R\u00e9cup\u00e9rer le contenu de la barre d&rsquo;adresse<\/li>\n<li>R\u00e9cup\u00e9rer uniquement le <em>hash<\/em><\/li>\n<li>Chercher dans notre document quel \u00e9l\u00e9ment pour l&rsquo;attribut href=&quot;#<em>hash<\/em>&quot;<\/li>\n<li>Simuler un clic sur cette \u00e9l\u00e9ment pour d\u00e9clencher le d\u00e9filement<\/li>\n<\/ol>\n<p>Ok, voici un code qui fait \u00e7a :<\/p>\n<pre class=\"code\"><code class=\"js\">function trigger_click_for_slide() {\r\n      var the_hash = document.location.hash;\r\n      if(the_hash)\r\n          $('a[href~=\"'+the_hash+'\"]').trigger('click');\r\n}\r\ntrigger_click_for_slide();<\/code><\/pre>\n<p>La ligne 2 nous permet de stocker directement le hash (fin de l&rsquo;URL) dans une variable.<br \/>\nLa ligne 3 permet de v\u00e9rifier l&rsquo;existence d&rsquo;un hash en bout d&rsquo;URL.<br \/>\nLa ligne 4, primordiale, permet de simuler (<code>trigger<\/code>) l&rsquo;\u00e9v\u00e8nement <code>click<\/code> sur l&rsquo;\u00e9l\u00e9ment porteur d&rsquo;un <code>href<\/code> ciblant le hash trouv\u00e9 dans l&rsquo;URL.<\/p>\n<p>Pourquoi imiter le clic sur un lien plut\u00f4t que d&rsquo;effectuer directement une animation ?<br \/>\nPour \u00e9viter de r\u00e9\u00e9crire une portion du code, et aussi pour limiter les animations vers les ancres pr\u00e9vues par notre syst\u00e8me de navigation.<\/p>\n<p>Ce morceau de code peut \u00eatre plac\u00e9 apr\u00e8s la cr\u00e9ation d&rsquo;une des mini fonctions vues dans l&rsquo;article <a href=\"https:\/\/www.creativejuiz.fr\/blog\/les-tutoriels\/jquery-effet-smooth-scroll-defilement-fluide\">jQuery &#8211; Effet Smooth Scroll (d\u00e9filement fluide)<\/a>.<\/p>\n<p>Note : Petite astuce donn\u00e9e par notre ami <a href=\"#comment-17092\">Brice<\/a> pour optimiser cette partie du code. Merci \u00e0 lui \ud83d\ude09<\/p>\n<h2>\u00c9criture du hash dans l&rsquo;URL<\/h2>\n<p><a href=\"http:\/\/sshg.spreadshirt.com\/hashtag-ninja-A7495554\" target=\"_blank\" title=\"Voir l'origine de l'image sur une boutique Spread Shirt (en)\" hreflang=\"en\"><img decoding=\"async\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2011\/11\/hastag-super-hero.jpg\" alt=\"Ninja portant des hastags-shuriken\" title=\"\" width=\"150\" height=\"150\" class=\"alignleft size-full wp-image-1642\" \/><\/a>C&rsquo;est bien sympa de proposer un d\u00e9filement au chargement, mais puisque le hash ne s&rsquo;\u00e9crit plus dans la barre d&rsquo;adresse, comment allez vous faire pour partager une URL fournie d&rsquo;un hash ?<\/p>\n<p>Il faut le r\u00e9\u00e9crire&hellip; oui d&rsquo;accord, mais comment ?<br \/>\nSi on enl\u00e8ve le <code>return false;<\/code> en fin de fonction, le d\u00e9filement va sauter, puis d\u00e9filer de mani\u00e8re fluide, ou inversement.<\/p>\n<p>Il faut donc le faire une fois l&rsquo;animation termin\u00e9e !<br \/>\nJe vous l&rsquo;avez dit dans le pr\u00e9c\u00e9dent tutoriel \u00e0 ce sujet, la fonction <code><a href=\"http:\/\/api.jquery.com\/animate\">animate()<\/a><\/code> permet l&rsquo;accueil d&rsquo;une fonction de <em lang=\"en\">callback<\/em>.<\/p>\n<p>Nous allons donc cr\u00e9er une fonction au sein du mini plugin vu dans l&rsquo;ancien article, qui va nous permettre de r\u00e9\u00e9crire le hash dans la barre d&rsquo;adresse.<br \/>\nLa voici :<\/p>\n<pre class=\"code\"><code class=\"js\">function write_hash(the_hash) {\r\n\t    document.location.hash = the_hash;\r\n}\r\n<\/code><\/pre>\n<p>Ensuite il faut faire appel \u00e0 cette fonction dans notre plugin dans la partie qui g\u00e8re l&rsquo;animation :<\/p>\n<pre class=\"code\"><code class=\"js\">$('html, body').animate({  \r\n        scrollTop:$(the_element).offset().top  \r\n}, speed, function() {\r\n        write_hash(the_hash);\r\n}); <\/code><\/pre>\n<p>Au final, nous avons un code complet qui nous donne :<\/p>\n<pre class=\"code\"><code class=\"js\">(function($) {  \r\n\t$.fn.juizScrollTo = function( speed ) { \r\n\t\tif ( !speed ) var speed = 'slow';  \r\n&nbsp;\t\t\t\r\n\t\t\/\/ coeur du plugin\r\n\t\treturn this.each( function() {  \r\n\t\t\t$(this).live('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&nbsp;\r\n\t\t\t\tif ( the_hash.match(\"\\#(.+)\") ) {  \r\n\t\t\t\t\tthe_hash = the_hash.replace(regex,\"$2\");  \r\n\t\t\t\t\tif($(\"#\"+the_hash).length>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>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\t\t\t\t\tif ( goscroll ) {  \r\n\t\t\t\t\t\t$('html,body').animate( {  \r\n\t\t\t\t\t\t\tscrollTop: $(the_element).offset().top  \r\n\t\t\t\t\t\t}, speed, function() {\r\n\t\t\t\t\t\t\ttab_n_focus(the_hash)\r\n\t\t\t\t\t\t\twrite_hash(the_hash);\r\n\t\t\t\t\t\t});  \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&nbsp;\t\t\t\r\n\t\t\/\/ fonctions\r\n&nbsp;\t\t\t\r\n\t\t\/\/ \u00e9criture du hash\r\n\t\tfunction write_hash( the_hash ) {\r\n\t\t\tdocument.location.hash =  the_hash;\r\n\t\t}\r\n&nbsp;\t\t\t\r\n\t\t\/\/ accessibilit\u00e9 au clavier\r\n\t\tfunction tab_n_focus( the_hash ) {  \r\n\t\t\t$(the_hash).attr('tabindex','0').focus().removeAttr('tabindex');  \r\n\t\t}\r\n&nbsp;\r\n\t};  \r\n&nbsp;\t\t\r\n\t\/\/ appel de la fonction sur toutes les ancres !\r\n\t$('a').juizScrollTo('slow');\r\n&nbsp;\t\t\r\n\t\/\/ fonction de slide au chargement\r\n\tfunction trigger_click_for_slide() {\r\n\t\tvar the_hash = document.location.hash;\r\n\t\tif ( the_hash )\r\n\t\t\t$('a[href~=\"'+the_hash+'\"]').trigger('click');\r\n\t}\r\n\ttrigger_click_for_slide();\r\n&nbsp;\r\n})(jQuery)<\/code><\/pre>\n<p>Avec les versions de jQuery sup\u00e9rieure \u00e0 1.7.0, favorisez l&rsquo;utilisation de <code><a href=\"http:\/\/api.jquery.com\/on\/\">on()<\/a><\/code> en lieu et place de <code><a href=\"http:\/\/api.jquery.com\/live\/\">live()<\/a><\/code>. Regardez bien la documentation pour effectuer les petits changements ad\u00e9quats.<\/p>\n<p>Voil\u00e0&hellip; je crois que nous avons un code plut\u00f4t complet pour ce type d&rsquo;effet :<\/p>\n<ul>\n<li>Gestion des URLs relatives et absolutes<\/li>\n<li>Navigation au clavier<\/li>\n<li>R\u00e9\u00e9criture du hash dans l&rsquo;URL (pratique pour le partage d&rsquo;une info pr\u00e9cise)<\/li>\n<li>Effet smoothscroll au chargement de la page (si on cible quelque chose sur la page via l&rsquo;URL)<\/li>\n<\/ul>\n<p class=\"message\"><strong>Note :<\/strong> pour ceux qui ex\u00e9cuteraient le JavaScript en tout d\u00e9but de document, n&rsquo;oublier pas d&rsquo;utiliser <code><a href=\"http:\/\/api.jquery.com\/ready\/\">$(document).ready(function(){ \/*contenu de la fonction*\/ });<\/a><\/code> pour n&rsquo;ex\u00e9cuter le code qu&rsquo;une fois le document HTML charg\u00e9.<\/p>\n<p>N&rsquo;h\u00e9sitez pas \u00e0 laisser un commentaire pour toute remarque sur ce code, probl\u00e8me rencontr\u00e9, etc&hellip;<\/p>\n<p>Merci pour votre lecture et \u00e0 la prochaine.<\/p>\n<div class=\"sources\">\n<h2>Liens utiles<\/h2>\n<ul>\n<li><a href=\"\/blog\/tutoriels\/jquery-effet-smooth-scroll-defilement-fluide\" title=\"jQuery \u2013 Effet smooth scroll (d\u00e9filement fluide)\">Premi\u00e8re partie du tutoriel<\/a><\/li>\n<li><a href=\"\/blog\/doc\/test-smoothscroll-bystep.html\">D\u00e9monstration d&rsquo;un scroll \u00e9tape par \u00e9tape<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Apr\u00e8s une demande re\u00e7ue par e-mail, je me suis dit que la fonctionnalit\u00e9 serait peut-\u00eatre utile \u00e0 d&rsquo;autres que moi. Lors de la r\u00e9daction de ce tutoriel : jQuery &#8211; Effet Smooth Scroll (d\u00e9filement fluide), la complexit\u00e9 du contenu m&rsquo;a fait retirer une extension int\u00e9ressante \u00e0 la derni\u00e8re fonction\/plugin propos\u00e9e.<\/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,50,9],"tags":[120,401,375,52,163,376],"coauthors":[597],"class_list":["post-1580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-ressources-telechargements","category-tutoriels","tag-animation","tag-chargement","tag-fluide","tag-jquery","tag-lien","tag-smoothscroll"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1580","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=1580"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/1580\/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=1580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=1580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=1580"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=1580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}