{"id":6879,"date":"2019-09-08T12:00:58","date_gmt":"2019-09-08T10:00:58","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog?p=6879"},"modified":"2019-09-08T14:51:46","modified_gmt":"2019-09-08T12:51:46","slug":"saviez-vous-scrollintoview-js-pour-defiler-vers-element","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/saviez-vous-scrollintoview-js-pour-defiler-vers-element","title":{"rendered":"Le saviez-vous \u2013 scrollIntoView() en JS pour d\u00e9filer vers un \u00e9l\u00e9ment."},"content":{"rendered":"<p>Il n&rsquo;y a pas si longtemps j&rsquo;ai vu un des d\u00e9veloppeurs avec lesquels je travaille \u00e9crire une fonction tr\u00e8s complexe pour permettre un d\u00e9filement fluide vers un \u00e9l\u00e9ment plus bas dans la page. J&rsquo;ai \u00e9t\u00e9 assez surpris qu&rsquo;il n&rsquo;utilise pas <code>scrollIntoView()<\/code> et son param\u00e8tre <code>behavior<\/code> de valeur <code>smooth<\/code>. \u00c7a vous parle ?<\/p>\n<p><!--more--><\/p>\n<p>Quand on a l&rsquo;habitude de faire d&rsquo;une certaine mani\u00e8re, difficile de se remettre en question notamment lorsque les projets sont un peu tendus en terme de timing. Souvent, m\u00eame, en tant que d\u00e9veloppeurs, vous avez tendance \u00e0 vous cr\u00e9er un petit fichier d&rsquo;<span lang=\"en\"><em>utilities<\/em><\/span> ou de <span lang=\"en\"><em>helpers<\/em><\/span> pour \u00e9viter d&rsquo;avoir \u00e0 r\u00e9\u00e9crire les petites fonctions utiles que vous avez l&rsquo;habitude de r\u00e9utiliser.<\/p>\n<p>J&rsquo;avais moi-m\u00eame \u00e9crit une petit fonction il y a un moment en utilisant jQuery (eh oui \u00e7a date :p).<br \/>\n<a href=\"https:\/\/www.creativejuiz.fr\/blog\/tutoriels\/jquery-effet-smooth-scroll-defilement-fluide\">Smoothscroll en jQuery<\/a>.<\/p>\n<h2>Smooth-scroll au clic avec <code>scrollIntoView()<\/code><\/h2>\n<p>Imaginez une ancre interne dans une page, lorsque l&rsquo;utilisateur clic sur le lien vous souhaitez proposer un d\u00e9filement fluide jusqu&rsquo;au d\u00e9but de cet \u00e9l\u00e9ment (ici la cible est <code>#part-3<\/code>). C&rsquo;est possible rapidement avec ce petit bout de code JavaScript.<\/p>\n<div class=\"code-embed-wrapper\"> <pre class=\"language-javascript code-embed-pre line-numbers\"  data-line=\"6\" data-start=\"1\" data-line-offset=\"0\"><code class=\"language-javascript code-embed-code\">const target = document.getElementById(&#039;part-3&#039;),<br\/>      button = document.getElementById(&#039;goto&#039;);<br\/><br\/>button.addEventListener(&#039;click&#039;, function(){<br\/>\t<br\/>\ttarget.scrollIntoView({<br\/>\t\tblock: &#039;start&#039;,<br\/>\t\tbehavior: &#039;smooth&#039;,<br\/>\t\tinline: &#039;nearest&#039;<br\/>\t});<br\/>\t<br\/>});<\/code><\/pre> <div class=\"code-embed-infos\"> <\/div> <\/div>\n<p>Comme vous pouvez le voir, rien de bien sorcier. Les param\u00e8tres sont les suivants, ils sont tous optionnels :<\/p>\n<ul>\n<li><code>block<\/code> : quelle partie du bloc vous souhaitez atteindre parmi <code>start<\/code>, <code>center<\/code>, <code>end<\/code> ou <code>nearest<\/code> (par d\u00e9fault <code>start<\/code>).<\/li>\n<li><code>behavior<\/code> : comment rejoindre ce bloc, parmi les options <code>auto<\/code> ou <code>smooth<\/code>, (par d\u00e9faut <code>auto<\/code>).<\/li>\n<li><code>inline<\/code> : o\u00f9 rejoindre l&rsquo;\u00e9l\u00e9ment si c&rsquo;est un scroll horizontal, parmi <code>start<\/code>, <code>center<\/code>, <code>end<\/code> ou <code>nearest<\/code> (par d\u00e9fault <code>nearest<\/code>)<\/li>\n<\/ul>\n<p>Une petite d\u00e9monstration sur CodePen pour illustrer mon propos.<\/p>\n<p class='codepen'  data-height='402' data-theme-id='0' data-slug-hash='rNBJVqJ' data-default-tab='result' data-animations='run' data-editable='' data-embed-version='2'>\nVoir la d\u00e9mo sur CodePen <\/p>\n\n<h2>SmoothScroll \u00e0 l&rsquo;ajout d&rsquo;un \u00e9l\u00e9ment dans la page<\/h2>\n<p>Un des cas d&rsquo;usage qui se pr\u00e9sente assez r\u00e9guli\u00e8rement, c&rsquo;est le cas d&rsquo;un ajout de section dans une page apr\u00e8s une action de l&rsquo;utilisateur, ou d&rsquo;un nouvel \u00e9l\u00e9ment dans une liste par exemple. C&rsquo;est une bonne mani\u00e8re de permettre \u00e0 l&rsquo;utilisateur de mieux comprendre ce qu&rsquo;il vient de se passer \u00e0 l&rsquo;\u00e9cran en le guidant vers l&rsquo;\u00e9l\u00e9ment qu&rsquo;il a lui m\u00eame demand\u00e9 d&rsquo;ajouter.<\/p>\n<div style=\"width: 402px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-6879-1\" width=\"402\" height=\"608\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2019\/09\/scroll-into-view-demo.mp4?_=1\" \/><source type=\"video\/webm\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2019\/09\/scroll-into-view-demo.webm?_=1\" \/><a href=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2019\/09\/scroll-into-view-demo.mp4\">https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2019\/09\/scroll-into-view-demo.mp4<\/a><\/video><\/div>\n<p>Voici une d\u00e9mo de Todo List utilisant localStorage pour enregistrer votre liste et scrollIntoView() pour vous mener aux nouveaux item cr\u00e9\u00e9s.<\/p>\n<p><a class=\"demo\" href=\"https:\/\/www.creativejuiz.fr\/blog\/doc\/todo-list-javascript-scrollintoview.html\" target=\"_blank\" rel=\"noopener noreferrer\">Voir la d\u00e9monstration<\/a><\/p>\n<p>J&rsquo;avais commenc\u00e9 une <a href=\"https:\/\/codepen.io\/GeoffreyCrofte\/pen\/RwbQrjQ?editors=0010\">d\u00e9mo sur CodePen<\/a> mais ce dernier est bugg\u00e9 lorsqu&rsquo;il s&rsquo;agit de r\u00e9cup\u00e9rer des donn\u00e9es <code>localStorage<\/code>. Mais vous pouvez toujours l&rsquo;utiliser et le forker.<\/p>\n<p class='codepen'  data-height='250' data-theme-id='0' data-slug-hash='RwbQrjQ' data-default-tab='result' data-animations='run' data-editable='' data-embed-version='2'>\nVoir la d\u00e9mo sur CodePen <\/p>\n\n<p>Un coup d&rsquo;oeil sur le support :<\/p>\n<div class=\"ciu_embed\" data-feature=\"scrollintoview\" data-periods=\"future_1,current,past_1,past_2\"><a href=\"http:\/\/caniuse.com\/#feat=scrollintoview\">Can I Use scrollintoview?<\/a><\/div>\n\t\t<script src=\"\/\/cdn.jsdelivr.net\/caniuse-embed\/1.0.1\/caniuse-embed.min.js\"><\/script>\n<h2>Allons plus loin ?<\/h2>\n<p>CSS utilise le m\u00eame principe pour modifier le comportement de scroll dans un \u00e9l\u00e9ment d\u00e9filable. Apprenez-en plus gr\u00e2ce \u00e0 cet article : <a href=\"https:\/\/www.creativejuiz.fr\/blog\/css-css3\/css-smooth-scrolling-behavior\">CSS Smooth-Scrolling avec Scroll-Behavior<\/a>.<\/p>\n<div class=\"ciu_embed\" data-feature=\"css-scroll-behavior\" data-periods=\"future_1,current,past_1,past_2\"><a href=\"http:\/\/caniuse.com\/#feat=css-scroll-behavior\">Can I Use css-scroll-behavior?<\/a><\/div>\n\t\t<script src=\"\/\/cdn.jsdelivr.net\/caniuse-embed\/1.0.1\/caniuse-embed.min.js\"><\/script>\n<p>N&rsquo;h\u00e9sitez pas si vous avez des cas d&rsquo;usage \u00e0 pr\u00e9senter, les commentaires sont ouverts pour \u00e7a. \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il n&rsquo;y a pas si longtemps j&rsquo;ai vu un des d\u00e9veloppeurs avec lesquels je travaille \u00e9crire une fonction tr\u00e8s complexe pour permettre un d\u00e9filement fluide vers un \u00e9l\u00e9ment plus bas dans la page. J&rsquo;ai \u00e9t\u00e9 assez surpris qu&rsquo;il n&rsquo;utilise pas scrollIntoView() et son param\u00e8tre behavior de valeur smooth. \u00c7a vous parle ?<\/p>\n","protected":false},"author":4,"featured_media":6886,"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],"tags":[789,809,376],"coauthors":[597],"class_list":["post-6879","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","category-tutoriels","tag-le-saviez-vous","tag-scrollintoview","tag-smoothscroll"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/6879","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=6879"}],"version-history":[{"count":3,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/6879\/revisions"}],"predecessor-version":[{"id":6901,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/6879\/revisions\/6901"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/6886"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=6879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=6879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=6879"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=6879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}