<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Capsule Tech & Code]]></title><description><![CDATA[Dédiée aux passionnés de Tech &amp; Code informatique ! Nous sommes là pour vous accompagner au quotidien dans votre veille technologique en vous offrant des ar]]></description><link>https://capsule-tech-and-code.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1748049457429/42d3dc94-61a5-47d6-b18c-40cf27da2e4a.jpeg</url><title>Capsule Tech &amp; Code</title><link>https://capsule-tech-and-code.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 01 Nov 2026 18:30:39 GMT</lastBuildDate><atom:link href="https://capsule-tech-and-code.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Le Scroll Infini : Gardez vos utilisateurs accrochés sans fin !]]></title><description><![CDATA[Aujourd'hui toutes les réseaux sociaux utilisent tous du scroll infini, et vous vous êtes déjà retrouvé sans doute à faire défiler sans fin votre fil…]]></description><link>https://capsule-tech-and-code.hashnode.dev/scroll-infini-gardez-vos-utilisateurs-accroches-sans-fin</link><guid isPermaLink="true">https://capsule-tech-and-code.hashnode.dev/scroll-infini-gardez-vos-utilisateurs-accroches-sans-fin</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Mak VieSAinte]]></dc:creator><pubDate>Tue, 30 Sep 2025 14:58:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759240064047/a7e11eb8-7a0b-486f-bfc3-2d7fe6802f79.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Aujourd'hui toutes les réseaux sociaux utilisent tous du scroll infini, et vous vous êtes déjà retrouvé sans doute à faire défiler sans fin votre fil d'actualité sur LinkedIn, Instagram ou Pinterest. Spoiler : vous n’allez jamais atteindre le fond. Je ne sais pas pour vous, moi je n’ai jamais atteint le fond.</p>
<p>Cette petite magie qui donne l'impression que le contenu ne s'arrête jamais, c'est ce qu'on appelle le scroll infini (ou infinite scroll).</p>
<p>C'est une technique étonnamment accessible. Elle améliore considérablement l'expérience utilisateur en supprimant le besoin de cliquer sur des pages "Suivant" et en rendant la navigation plus fluide et intuitive (surtout pour les réseaux sociaux).</p>
<p>Dans cet article, je vais vous expliquer pas à pas comment créer un effet de scroll infini avec du HTML, du CSS et du JavaScript pur et simple (sans Intersection Observer API). C'est parti !</p>
<h2 id="heading-etape-1-la-structure-de-base-en-html">Étape 1 : La structure de base en HTML</h2>
<p>Il nous faut d'abord une structure HTML très simple. Nous avons besoin juste d'un conteneur qui accueillera nos éléments.</p>
<p>Créez un fichier <code>index.html</code> et copiez-y ce code :</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<p>Rien de sorcier ici :</p>
<ul>
<li><p>Une <code>&lt;div&gt;</code> avec la classe <code>container</code> : qui est notre boîte principale.</p>
</li>
<li><p>Quelques <code>&lt;div&gt;</code> avec la classe <code>item</code> à l'intérieur pour commencer.</p>
</li>
</ul>
<blockquote>
<p>On n'oublie pas de lier notre feuille de style <code>style.css</code> et notre fichier JavaScript <code>app.js</code> dans le projet.</p>
</blockquote>
<h2 id="heading-etape-2-un-peu-de-style-avec-le-css">Étape 2 : Un peu de style avec le CSS</h2>
<p>Sur le CSS pas grand-chose, on veut simplement mettre un système de grille pour nos éléments. Pour ça, on va utiliser Flexbox.</p>
<p>Créez un fichier <code>style.css</code> et ajoutez-y ce qui suit :</p>
<pre><code class="lang-css"><span class="hljs-selector-class">.container</span> {
   <span class="hljs-attribute">display</span>: flex;
   <span class="hljs-attribute">flex-wrap</span>: wrap; 
   <span class="hljs-attribute">justify-content</span>: center;
   <span class="hljs-attribute">padding</span>: <span class="hljs-number">10px</span>;
   <span class="hljs-attribute">max-width</span>: <span class="hljs-number">1200px</span>;
   <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span> auto;
}

<span class="hljs-selector-class">.item</span> {
   <span class="hljs-attribute">width</span>: <span class="hljs-number">350px</span>;
   <span class="hljs-attribute">height</span>: <span class="hljs-number">300px</span>;
   <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#444</span>;
   <span class="hljs-attribute">margin</span>: <span class="hljs-number">15px</span>;
   <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">12px</span>;
   <span class="hljs-attribute">display</span>: flex;
   <span class="hljs-attribute">justify-content</span>: center;
   <span class="hljs-attribute">align-items</span>: center;
}
</code></pre>
<p>Avec ce petit CSS, notre page a déjà meilleure allure. Le container centre les éléments et les items sont des cartes prêtes à être remplies de contenu. Ils peuvent par exemple faire un appel à une API (avec <code>fetch</code>) pour charger des articles, des photos ou des produits.</p>
<h2 id="heading-etape-3-la-magie-du-javascript">Étape 3 : La magie du JavaScript</h2>
<p>C'est ici que du sérieux opère ! C'est le JavaScript qui va détecter quand l'utilisateur arrive en bas de la page pour charger de nouveaux éléments.</p>
<p>Créez votre fichier <code>app.js</code> et suivez ce guide.</p>
<h3 id="heading-a-detecter-le-scroll-de-lutilisateur">A. Détecter le scroll de l'utilisateur</h3>
<p>La première chose à faire sera d'écouter l'événement <code>scroll</code> sur la fenêtre. En gros, on demande au navigateur de nous prévenir chaque fois que l'utilisateur fait défiler sur sa page.</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">window</span>.addEventListener(<span class="hljs-string">'scroll'</span>, <span class="hljs-function">() =&gt;</span> {});
</code></pre>
<h3 id="heading-b-savoir-quand-on-est-en-bas">B. Savoir quand on est "en bas"</h3>
<p>Pour savoir si on a atteint le bas de la page, il nous faut trois éléments :</p>
<ul>
<li><p><code>scrollTop</code> : C'est la distance en pixels en partant du haut de la page jusqu'à la partie visible à l'écran (donc uniquement le viewport de l’écran).</p>
</li>
<li><p><code>clientHeight</code> : Il va nous permettre de récupérer la hauteur de la partie visible de notre page (hauteur de la fenêtre du navigateur).</p>
</li>
<li><p><code>scrollHeight</code> : Lui, il englobe tout, c'est-à-dire la hauteur totale de la page, y compris la partie non visible.</p>
</li>
</ul>
<p>Vous vous demandez sûrement : pourquoi toutes ces valeurs ? C'est pour comprendre que lorsque la somme de <code>scrollTop</code> et <code>clientHeight</code> est égale (ou presque) à <code>scrollHeight</code>, cela signifie que l'on a atteint le fond de la page !</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">window</span>.addEventListener(<span class="hljs-string">'scroll'</span>, <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">const</span> { scrollTop, scrollHeight, clientHeight } = <span class="hljs-built_in">document</span>.documentElement;
    <span class="hljs-comment">// Le +5 est une marge de sécurité pour d'autres navigateurs</span>
    <span class="hljs-keyword">if</span> (clientHeight + scrollTop &gt;= scrollHeight - <span class="hljs-number">5</span>) {
        addArticles(<span class="hljs-number">6</span>);
    }
});
</code></pre>
<p>Ici, on utilise une déstructuration <code>{ scrollTop, scrollHeight, clientHeight }</code> pour récupérer ces trois valeurs d'un coup. C'est beaucoup plus propre, et c'est la meilleure manière de faire.</p>
<h3 id="heading-c-la-fonction-pour-ajouter-du-contenu">C. La fonction pour ajouter du contenu</h3>
<p>C'est cette fonction qui sera chargée de créer et d’ajouter les nouveaux éléments dans notre container principale. Si on prend par exemple le cas d'un réseau social, ça peut être chaque post ou image qui sera chargé. Ici nous l'avons appelée <code>addArticles</code>.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">'.container'</span>);

<span class="hljs-keyword">const</span> addArticles = <span class="hljs-function">(<span class="hljs-params">nombre</span>) =&gt;</span> {
   <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; nombre; i++) {
      <span class="hljs-keyword">const</span> newItem = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'div'</span>);
      newItem.classList.add(<span class="hljs-string">'item'</span>);
      container.appendChild(newItem);
   }
};
</code></pre>
<p>Cette fonction, elle prend un nombre en argument. Ce qu'elle va faire, c'est boucler autant de fois et, à chaque tour :</p>
<ul>
<li><p>Créer une nouvelle <code>&lt;div&gt;</code>.</p>
</li>
<li><p>Lui donner la classe <code>item</code>.</p>
</li>
<li><p>L'ajouter comme enfant de notre container (qui englobe toutes les items).</p>
</li>
</ul>
<h3 id="heading-le-code-javascript-final">Le code JavaScript final</h3>
<p>Voici à quoi ressemblera notre fichier <code>app.js</code> :</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">'.container'</span>);

<span class="hljs-keyword">const</span> addArticles = <span class="hljs-function">(<span class="hljs-params">nombre</span>) =&gt;</span> {
   <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; nombre; i++) {
      <span class="hljs-keyword">const</span> newItem = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'div'</span>);
      newItem.classList.add(<span class="hljs-string">'item'</span>);
      container.appendChild(newItem);
   }
};

<span class="hljs-comment">// On écoute l'événement de scroll</span>
<span class="hljs-built_in">window</span>.addEventListener(<span class="hljs-string">'scroll'</span>, <span class="hljs-function">() =&gt;</span> {
   <span class="hljs-keyword">const</span> { scrollTop, scrollHeight, clientHeight } = <span class="hljs-built_in">document</span>.documentElement;
   <span class="hljs-keyword">if</span> (clientHeight + scrollTop &gt;= scrollHeight - <span class="hljs-number">5</span>) {
      addArticles(<span class="hljs-number">6</span>); <span class="hljs-comment">// On charge 6 nouveaux articles</span>
   }
});
</code></pre>
<p>En quelques lignes seulement, nous avons créé cet effet de scroll infini. C'est la base parfaite pour aller plus loin, même si à la place vous pouvez utiliser aussi <code>Intersection Observer API</code> pour refaire la même chose.</p>
]]></content:encoded></item><item><title><![CDATA[Comprendre une URL comme un(e) dev]]></title><description><![CDATA[Salut !Si tu codes depuis peu, ou si tu as déjà cliqué sur un lien ou tapé une adresse dans ton navigateur, tu as utilisé une URL. Tu sais, ce truc qu’on…]]></description><link>https://capsule-tech-and-code.hashnode.dev/comprendre-une-url-comme-une-dev</link><guid isPermaLink="true">https://capsule-tech-and-code.hashnode.dev/comprendre-une-url-comme-une-dev</guid><category><![CDATA[webdev javascript html frontend beginners networking urls http https routing]]></category><dc:creator><![CDATA[Mak VieSAinte]]></dc:creator><pubDate>Sat, 24 May 2025 01:37:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748049686865/a9095777-21c6-449c-9523-90c16cac6bfd.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Salut !</strong><br />Si tu codes depuis peu, ou si tu as déjà cliqué sur un lien ou tapé une adresse dans ton navigateur, tu as utilisé une URL. Tu sais, ce truc qu’on copie-colle 50 fois par jour sans trop y penser ? 😅</p>
<p>Eh bien aujourd’hui, on va parler d’<strong>URL</strong>, et je vais te décortiquer ça à la sauce dev : clair, imagé, et sans prise de tête. 😁</p>
<hr />
<h2 id="heading-cest-quoi-une-url">C’est quoi une URL ?</h2>
<p>Une <strong>URL</strong> (Uniform Resource Locator), c’est l’adresse complète d’une ressource sur Internet.<br />Un peu comme le chemin vers un fichier… sauf qu’au lieu de pointer vers ton disque dur, ça vise des trucs sur des serveurs.</p>
<h2 id="heading-structure-dune-url">Structure d’une URL</h2>
<p>Prenons cet exemple :</p>
<pre><code class="lang-plaintext">https://example.com:80/blog?search=test&amp;sort_by=created_at#header
</code></pre>
<h3 id="heading-1-https-le-protocole">1. <code>https://</code> — Le protocole</h3>
<p>C’est la première partie de l’URL. Elle indique <strong>comment</strong> ton navigateur va communiquer avec le serveur.<br />Un peu comme choisir entre téléphoner 📞 ou envoyer un SMS 💬.</p>
<p>Quelques exemples :</p>
<ul>
<li><p><code>http</code> : HyperText Transfer Protocol (le plus classique)</p>
</li>
<li><p><code>https</code> : version <strong>sécurisée</strong> avec chiffrement TLS 🔒</p>
</li>
</ul>
<blockquote>
<p>Depuis les années 2010, Google pousse au HTTPS : les sites non sécurisés sont moins bien référencés.</p>
</blockquote>
<p>En bref : c’est le <strong>langage</strong> utilisé pour envoyer une requête et recevoir une réponse.<br />Un genre de <code>fetch()</code> universel.</p>
<hr />
<h3 id="heading-2-examplecomhttpexamplecom-le-domaine">2. <a target="_blank" href="http://example.com"><code>example.com</code></a> — Le domaine</h3>
<p>C’est le <strong>nom du serveur</strong> qui héberge la ressource.<br />Comparable à un <strong>numéro de rue</strong>, mais version Internet.</p>
<p>Ce nom est traduit en adresse IP grâce au <strong>DNS</strong> (Domain Name System), le bottin du web.</p>
<p>Structure typique :</p>
<ul>
<li><p><strong>Sous-domaine</strong> : <code>www</code>, <code>blog</code>, <code>api</code></p>
</li>
<li><p><strong>Domaine principal</strong> : <code>example</code>, <code>openai</code>, <code>google</code></p>
</li>
<li><p><strong>Extension (TLD)</strong> : <code>.com</code>, <code>.fr</code>, <code>.io</code>, <code>.dev</code></p>
</li>
</ul>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> domaine = {
  <span class="hljs-attr">sousDomaine</span>: <span class="hljs-string">"www"</span>,
  <span class="hljs-attr">nom</span>: <span class="hljs-string">"example"</span>,
  <span class="hljs-attr">extension</span>: <span class="hljs-string">".com"</span>
};
</code></pre>
<hr />
<h3 id="heading-3-80-le-port">3. <code>:80</code> — Le port</h3>
<p>Le <strong>port</strong>, c’est la <strong>porte d’entrée</strong> de la requête vers le serveur.</p>
<ul>
<li><p><code>80</code> : par défaut pour <code>http</code></p>
</li>
<li><p><code>443</code> : pour <code>https</code></p>
</li>
</ul>
<p>Souvent invisible, car les navigateurs les ajoutent automatiquement selon le protocole.</p>
<p>Mais si tu codes en Node.js ou Express, tu connais sûrement :</p>
<pre><code class="lang-javascript">app.listen(<span class="hljs-number">3000</span>);
</code></pre>
<hr />
<h3 id="heading-4-blog-le-chemin">4. <code>/blog</code> — Le chemin</h3>
<p>Le <strong>chemin</strong>, c’est la <strong>route vers la ressource</strong> sur le serveur.<br />Comme les dossiers dans ton projet, mais côté serveur.</p>
<blockquote>
<p>Plus il y a de <code>/</code>, plus tu descends dans l’arborescence.</p>
</blockquote>
<p>Dans les frameworks modernes (Vue, React, Angular…), ce chemin est souvent géré par le <strong>router</strong> côté client.</p>
<hr />
<h3 id="heading-5-searchtestampsortbycreatedat-les-parametres-de-requete">5. <code>?search=test&amp;sort_by=created_at</code> — Les paramètres de requête</h3>
<p>Après le <code>?</code>, on trouve les <strong>informations envoyées au serveur</strong> via la méthode GET.</p>
<p>Structure : <code>clé=valeur</code><br />Chaque paire est séparée par <code>&amp;</code>.</p>
<p>Exemple :<br /><code>?q=vuejs&amp;page=2</code></p>
<p>En backend :</p>
<ul>
<li><p>Express.js : <code>req.query</code></p>
</li>
<li><p>PHP : <code>$request-&gt;query()</code></p>
</li>
</ul>
<hr />
<h3 id="heading-6-header-le-fragment-ou-ancre">6. <code>#header</code> — Le fragment (ou ancre)</h3>
<p>Le <strong>fragment</strong>, c’est le petit <code>#</code> qui te <strong>téléporte</strong> dans la page.</p>
<p>Tu connais sûrement :</p>
<pre><code class="lang-xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#section-3"</span>&gt;</span>Aller à la section 3<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
</code></pre>
<p>Ça dit au navigateur : “scroll direct là-bas”.</p>
<hr />
<h2 id="heading-url-absolue-vs-relative">URL absolue vs relative</h2>
<p>Les URL, ce sont des <strong>chemins</strong>. Et il y a deux types :</p>
<h3 id="heading-url-absolue">URL absolue</h3>
<p>Elle contient <strong>tout</strong> : protocole, domaine, chemin complet.</p>
<pre><code class="lang-abap">https://site.com/blog/article
</code></pre>
<h3 id="heading-url-relative">URL relative</h3>
<p>Elle dépend du <strong>contexte actuel</strong> (la page en cours, le niveau du dossier, etc.).</p>
<pre><code class="lang-plaintext">/blog/article           // relatif à la racine
../images/pic.jpg       // monte d’un dossier
</code></pre>
<hr />
<h2 id="heading-en-resume">En résumé</h2>
<ul>
<li><p><strong>Lire une URL</strong> → comprendre ce que fait ton navigateur</p>
</li>
<li><p><strong>Écrire une URL propre</strong> → améliorer la navigation, le SEO, l’accessibilité</p>
</li>
</ul>
<p>Maîtriser les URL, c’est poser la <strong>première pierre</strong> d’un web solide.</p>
<hr />
<p>Si tu as aimé ce genre de décryptage, n’hésite pas à me le dire ou à poser tes questions en commentaire ! 🚀</p>
]]></content:encoded></item></channel></rss>