<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gravisto</title>
    <description>The latest articles on Forem by Gravisto (@gravisto).</description>
    <link>https://forem.com/gravisto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1317840%2Fa5a063ab-cfbd-4da2-aeb4-1af45eaba404.jpg</url>
      <title>Forem: Gravisto</title>
      <link>https://forem.com/gravisto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gravisto"/>
    <language>en</language>
    <item>
      <title>🇫🇷 Angular + Bootstrap 5: Getting started</title>
      <dc:creator>Gravisto</dc:creator>
      <pubDate>Tue, 02 Apr 2024 08:09:02 +0000</pubDate>
      <link>https://forem.com/gravisto/angular-bootstrap-5-getting-started-1eo5</link>
      <guid>https://forem.com/gravisto/angular-bootstrap-5-getting-started-1eo5</guid>
      <description>&lt;h1&gt;
  
  
  Les bases pour survivre avec bootstrap &amp;amp; Angular
&lt;/h1&gt;

&lt;p&gt;Sur un projet de grande envergure, avec une armée de développeurs de tous horizons, réussir à maintenir une base de code homogène n’est pas chose aisée ! Encore plus quand on parle d’interface graphique avec du CSS. C'est donc pour cette raison que Bootstrap arrive afin d'organiser toute cette anarchie !&lt;/p&gt;

&lt;p&gt;Au fil de cet article, nous verrons quelles sont les règles de base pour organiser son équipe au mieux avec cet outil !&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment personnaliser le thème de Bootstrap dans votre application Angular (SCSS)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Comprendre comment Bootstrap est organisé
&lt;/h3&gt;

&lt;p&gt;Lors de l’installation de Bootstrap, il va charger tous ces fichiers SCSS au chemin suivant :&lt;br&gt;
&lt;code&gt;your-project/node_modules/bootstrap/scss/**/*.scss&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;C’est donc à cet endroit que l’on peut retrouver l’ensemble du style fournit par Bootstrap. On peut donc lire comment est construit l’ensemble des classes de Bootstrap. En voici un extrait.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy63l5dv2sjlz0c5dnpz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdy63l5dv2sjlz0c5dnpz.png" alt="Fichier bootstrap.scss"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3xkxw0ivd3nzfl20u8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc3xkxw0ivd3nzfl20u8d.png" alt="Fichier bootstrap variable.scss"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le premier screen présente le fichier SCSS regroupant l’entièreté de ce que propose Bootstrap. On y apprend plein d’informations sur leur organisation. Et oui, il sépare les variables “classiques”, des variables “dark” (quand je vous dis que lire la doc c’est intéressant !).&lt;/p&gt;

&lt;p&gt;Le deuxième quant à lui, présente le contenu des différentes variables que l’on peut personnaliser. C'est à cet endroit là que Bootstrap va appliquer son thème de couleurs par exemple !&lt;/p&gt;

&lt;p&gt;On y comprend un concept vital sur Bootstrap, il utilise des variables par défaut ! Cela implique qu’il est possible de les surcharger en SCSS. Attention, ceci ne fonctionne qu’en créant une variable avec le MÊME nom ! Oui cela parait assez logique, mais j’anticipe les questions. Alors on oublie l’originalité du $my-primary ou encore $amazing-success. On ne créer pas de nom personnalisés et on peut continuer notre aventure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 2 : Personnaliser son thème Bootstrap
&lt;/h3&gt;

&lt;p&gt;Maintenant que l’on connait un peu mieux Bootstrap, essayons de créer notre propre thème !&lt;/p&gt;

&lt;p&gt;Pour notre exemple, nous allons surcharger les couleurs primaires, secondaires et de success de Bootstrap ainsi que la taille de la police.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1lov70ogampl1c27kst.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1lov70ogampl1c27kst.png" alt="Fichier variable.scss surchargé"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une fois cela fait, on pourra utiliser l’ensemble des classes définies par Bootstrap avec notre thème.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tx2edwit7venz4u2gci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tx2edwit7venz4u2gci.png" alt="Une page customisé"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Surcharger les composants Bootstrap
&lt;/h4&gt;

&lt;p&gt;Pour suivre le travail de ton designer, il se peut que tu veuilles modifier le style de tous les boutons de ton application. Pour cela, tu vas devoir surcharger la classe btn de Bootstrap. C’est elle que tu appliques sur tous les boutons de ton application (enfin si personne n’oublie de la mettre dans ton équipe 😜).&lt;/p&gt;

&lt;p&gt;Pour surcharger cette classe rien de plus simple, après l’import de Bootstrap, ajoute le sélecteur de la classe btn et voila ! Tu peux y écrire le style à ajouter.&lt;/p&gt;

&lt;p&gt;Dans notre exemple, on souhaite ajouter une bordure à l’extérieur du bouton en gris foncé. Cela donne le code suivant :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3m5b8h21ha49r8icq4iw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3m5b8h21ha49r8icq4iw.png" alt="composant button surchargé"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintenant que tu sais surcharger, un des designers t’a demandé de modifier la bordure de tous les boutons principaux pour qu’elle soit de 2px avec des petits tirets.&lt;/p&gt;

&lt;p&gt;Pas de problème, c’est dans tes cordes alors tu t’élances et produis ça :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dg7r1s1pedmqhn7qe6h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dg7r1s1pedmqhn7qe6h.png" alt="button primary class"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tips&lt;/strong&gt; : Depuis la version 5.2, Bootstrap a mis en place de nombreuses variables CSS afin de personnaliser ces composants. Cela permet à Bootstrap d’utiliser la valeur de la variable plus facilement et que celle-ci soit modifiable non plus seulement à la compilation du SCSS mais aussi au runtime. On verra un résultat de ces variables plus tard lors de la personnalisation de la couleur des boutons (et oui, c’est du teasing ça 😊).&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s a trap!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmxdh921dz1ktmwjbq58.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmxdh921dz1ktmwjbq58.gif" alt="gif star wars"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bootstrap est de toute bonté et va automatiquement trouver pour nous la couleur la plus adaptée pour notre thème. Il calcule automatiquement la couleur du texte en fonction de la couleur de fond. N’est ce pas sublime d’avoir une tache noire sur notre magnifique rose saumon ?&lt;/p&gt;

&lt;p&gt;Spoiler, les designers ne le pensent pas ! Donc va falloir vite changer ça et lui mettre du blanc pour la couleur du texte.&lt;/p&gt;

&lt;p&gt;Ce que Bootstrap génère :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm20p3cix3rucj6vul26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjm20p3cix3rucj6vul26.png" alt="logo maison noir sur fond saumon"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ce que les designers veulent :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0ss1rs3hnzzte9j3s75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq0ss1rs3hnzzte9j3s75.png" alt="logo maison blanc sur fond saumon"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le contenu de l’icône est noir. Cela est dû au fait que Bootstrap va automatiquement calculer la couleur avec &lt;strong&gt;le meilleur contraste&lt;/strong&gt; en fonction de la couleur de fond.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj496pdqz6piuha21zv4b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj496pdqz6piuha21zv4b.png" alt="Phrase avec des mots de différentes couleurs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notre problème c’est qu’il n’y a aucune variable SCSS pour décrire la couleur du texte d’un bouton. Il va donc falloir appliquer un sélecteur pour notre bouton primaire pour surcharger ce dernier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff30wmbqeqj4qhcfkvt0t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff30wmbqeqj4qhcfkvt0t.png" alt="class btn-primary"&gt;&lt;/a&gt;&lt;br&gt;
Ici, Bootstrap a mis en place des variables CSS pour personnaliser la couleur de notre bouton, alors on l’utilise !&lt;/p&gt;

&lt;p&gt;Maintenant, tous les éléments ayant les classes btn ainsi que btn-primary auront leur couleur de texte blanche pour les différents états de ce dernier. Problème réglé, il faut simplement espérer ne pas avoir à faire ceci trop souvent…&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Limites à Bootstrap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Devoir surcharger un bon nombre de règles de Bootstrap
&lt;/h3&gt;

&lt;p&gt;Comme on a pu le voir avec les couleurs du texte, Bootstrap gère certaines parties du CSS en calculant automatiquement certaines valeurs. Si vous avez un thème complet, l’utilisation de Bootstrap peut vous compliquer la vie avec de nombreuses règles à surcharger !&lt;/p&gt;

&lt;h3&gt;
  
  
  Le manque de certaines classes
&lt;/h3&gt;

&lt;p&gt;Bootstrap c’est bien, suivre leurs conventions c’est mieux. Mais quand il n’y a pas la propriété CSS que l’on souhaite, on se retrouve à devoir nous-même écrire une classe CSS d’utilities et ça c’est une des parties ennuyantes de Bootstrap.&lt;/p&gt;

&lt;p&gt;Par exemple, voici une liste non exhaustive des propriétés m’ayant manqué récemment :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Style des bordures (dashed, dotted, …)&lt;/li&gt;
&lt;li&gt;Plus de niveaux de zIndex&lt;/li&gt;
&lt;li&gt;Type du cursor (pointer, move, …)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pas de nettoyage du CSS inutile
&lt;/h3&gt;

&lt;p&gt;Bootstrap n’inclue aucun système de suppression des classes non utilisées dans l’application. Cela implique que notre application va devoir charger toutes les classes de Bootstrap. Et ça, c’est toujours une perte de temps que ce soit sur le réseau ou pour le navigateur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio34hx0xq8tzy5jv84d4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fio34hx0xq8tzy5jv84d4.jpg" alt="playmobile bootstrap qui ramasse des miettes"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Image non contractuelle&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Avant d’utiliser Bootstrap, j’avais un gros à priori sur les librairies qui permettent de styliser notre application. J’avais l’impression que mon application allait ressembler à toutes les autres et que je n’aurais pas assez de contrôle sur mes composants. Ce n’est finalement pas entièrement le cas, dans 80% du temps, Bootstrap me simplifie la vie. Je peux personnaliser le thème et surcharger les règles des composants génériques afin de créer mon design system.&lt;/p&gt;

&lt;p&gt;Là où j’hésite encore sur l’utilité de Bootstrap, c’est pour l’élaboration de mise en page et surtout lorsque je souhaite faire des grilles ! A ce moment là, je vous conseille de rester sur votre CSS standard, cela ne sera que plus simple.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>bootstrap</category>
      <category>french</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇫🇷 [CSS] Pourquoi les unités relatives sont un enfer</title>
      <dc:creator>Gravisto</dc:creator>
      <pubDate>Fri, 29 Mar 2024 11:41:43 +0000</pubDate>
      <link>https://forem.com/gravisto/css-pourquoi-les-unites-relatives-sont-un-enfer-1ana</link>
      <guid>https://forem.com/gravisto/css-pourquoi-les-unites-relatives-sont-un-enfer-1ana</guid>
      <description>&lt;p&gt;Lorsque l'on parle de responsivité, on entend souvent dire que les &lt;code&gt;px&lt;/code&gt; sont à bannir, et qu'il faudrait privilégier les &lt;code&gt;em&lt;/code&gt; et les &lt;code&gt;rem&lt;/code&gt;.&lt;br&gt;
Pour vérifier, j’ai demandé à &lt;strong&gt;Bard&lt;/strong&gt; (concurrent de chatGpt ) et voilà le résultat&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En général, les unités relatives sont préférables aux unités absolues pour le responsive design, car elles permettent de garantir que le design d'un site web s'adapte à différents écrans et résolutions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bon,  on vas voir pourquoi bard se trompe et pourquoi cette question et si importante pour la DX de votre projet. Surtout qu’il y a une tendance à sous-estimer l'importance du CSS dans les projets et tout particulièrement la questions des unités. Alors qu'elles sont comme le train d'atterrissage d'un avion : ce n'est pas ce qui te permet de voler, mais si c'est mal pensé, tu vas vite avoir un problème.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9uppmcvb7e56y5wryjd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9uppmcvb7e56y5wryjd.jpg" alt="accident avion" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Le bordel des unités en css
&lt;/h2&gt;

&lt;p&gt;C'est là que tout commence, car il existe vraiment beaucoup d'unités. En effet, il y a même toute une histoire liée à l'évolution du CSS à travers les technologies et les besoins des utilisateurs.&lt;/p&gt;

&lt;p&gt;Aujourd'hui, il est encore possible d'utiliser des unités comme le pt (point) ou le pc (pica), qui proviennent de leur utilisation par les imprimantes il y a 20 ans. Il est important de noter cependant que le px est la seule unité créée et conçue pour le CSS. Cependant, le px est aussi une relique du passé :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour avoir une idée de l'apparence du &lt;code&gt;px&lt;/code&gt;, prenez un écran cathodique des années 90 : le plus petit point qu'il peut afficher mesure environ 1/100e de pouce (0.25mm) ou un peu plus. L'unité &lt;code&gt;px&lt;/code&gt; tire son nom de ces pixels d'écrans.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et au fil des années, de nouvelles unités ont été ajoutées pour répondre à de nouveaux besoins. C'est ainsi que les unités &lt;code&gt;em&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;vh&lt;/code&gt; et &lt;code&gt;vw&lt;/code&gt; ont rejoint la collection. Il est évident que les personnes qui les ont créées avaient une problématique spécifique en tête. Par exemple, sont arrivé très récemment les &lt;code&gt;dvh&lt;/code&gt; et les &lt;code&gt;dvw&lt;/code&gt; qui répondent aux nouveaux besoins des smartphones. Donc si dans un projet uniquement sur PC vous trouvez des unités &lt;code&gt;dvh&lt;/code&gt; ou &lt;code&gt;dvw&lt;/code&gt; vous savez que c'est un abus. Ce genre de comportement est plus présent qu'on ne le croit car les raisons d'êtres des polices sont souvent méconnu ou oubliées avec le temps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl87ll63ltfjmadw6qhap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl87ll63ltfjmadw6qhap.png" alt="homer simpson dur de choisir" width="553" height="416"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  L’Intox de l’accessibilité
&lt;/h2&gt;

&lt;p&gt;Avant d'aller plus loin dans le détail du choix des unités, je tiens à remettre en question une légende. Les unités &lt;code&gt;rem&lt;/code&gt; et &lt;code&gt;em&lt;/code&gt; sont souvent présentées comme étant plus intéressantes pour l'accessibilité. Cet argument était vrai dans le passé ! Ce n'est plus le cas aujourd'hui. En effet, dans les années 2000-2005, la plupart des navigateurs ne s'adaptaient pas aux textes utilisant des unités absolues comme le &lt;code&gt;px&lt;/code&gt;. Cependant, les navigateurs modernes s'adaptent désormais à tous les types d'unités, qu'elles soient absolues ou relatives.&lt;br&gt;
Par conséquent, il n'est &lt;strong&gt;plus nécessaire d'utiliser des unités responsives pour faciliter l'accessibilité&lt;/strong&gt; de vos sites.&lt;/p&gt;
&lt;h2&gt;
  
  
  Les unités responsives
&lt;/h2&gt;

&lt;p&gt;Simplement pour vous rappeler de quoi on parle, et cité les plus courantes. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;em&lt;/th&gt;
&lt;th&gt;rem&lt;/th&gt;
&lt;th&gt;%&lt;/th&gt;
&lt;th&gt;vh&amp;amp;vw&lt;/th&gt;
&lt;th&gt;ch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;La valeur dépend de la taille de la police du parent&lt;/td&gt;
&lt;td&gt;La valeur dépend de la taille de la police de l’élément html&lt;/td&gt;
&lt;td&gt;L'unité de pourcentage (%) redimensionne un élément en fonction de la taille de son parent.&lt;/td&gt;
&lt;td&gt;1% de la hauteur/largeur de la zone d'affichage (viewport)&lt;/td&gt;
&lt;td&gt;Relatif a la largeur du caractère ‘0’ de la font-size utilisé dans votre projet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Le problème des em
&lt;/h2&gt;

&lt;p&gt;Cette unité relative à une forte tendance à devenir très vite autre chose que ce que vous aviez prévu. Si je définis une taille de police de 20 &lt;code&gt;px&lt;/code&gt; dans mon parent, puis que j'ajoute un enfant avec un autre enfant en dessous, et que chacun d'eux utilise des &lt;code&gt;em&lt;/code&gt;, on se retrouve rapidement avec des tailles complètement aléatoires.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forn4iwlsmtx148uh9mh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forn4iwlsmtx148uh9mh9.png" alt="schema 1" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien que l'utilisation des &lt;code&gt;em&lt;/code&gt; pour définir une taille de police en fonction d'une autre taille de police soit acceptable, il est plus problématique de l'utiliser pour définir la taille maximale du container.&lt;/p&gt;

&lt;p&gt;Cas d’utilisation des &lt;code&gt;em&lt;/code&gt;, vous pouvez les utiliser pour définir la typographie à travers votre projet de manière simplifiée, exemple : “Un titre 1 fait 4 fois la taille d’un paragraphe” ⇒&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h1 {
font-size : 4em;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cependant, cela signifie que vous devez avoir les informations de la maquette qui vous indiquent : "tel élément doit être exprimé en fonction de la taille de la police de tel autre élément". Si vous ne disposez pas de ces informations, n'utilisez pas les &lt;code&gt;em&lt;/code&gt; !&lt;/p&gt;

&lt;p&gt;En effet, nous ne souhaitons pas induire de comportement qui ne soit pas requis par le business. Si le designer ne vous a pas donné de relation proportionnelle à la taille de la police du parent, alors n'utilisez pas les &lt;code&gt;em&lt;/code&gt; !&lt;/p&gt;

&lt;p&gt;Surtout les cas où les designers ont le temps et les moyens de calculer tout cela à l'échelle d'une application entière sont très rares. Il vaut donc mieux oublier l'utilisation quotidienne des &lt;code&gt;em&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Autre problème, si vous ne changez pas la taille de votre police au niveau de votre parent, alors vous serez simplement en train d’utiliser un multiple de 16px. A ce moment là, pourquoi conserver les &lt;code&gt;em&lt;/code&gt; ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Le risque des rem
&lt;/h2&gt;

&lt;p&gt;La solution pour contrer cette histoire de cascade est d’utiliser les &lt;code&gt;rem&lt;/code&gt;. Puisque au lieu d’utiliser la taille de la police du parent, on utilise la taille de la police de l’élément html.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ia2vy28fzqtsv7ar7ky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ia2vy28fzqtsv7ar7ky.png" alt="schema 2" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais alors du coup, si rien ne change la taille de la police de l'élément HTML, que se passe-t-il ?&lt;/p&gt;

&lt;p&gt;En fait, rien. Tous vos développeurs utiliseront un multiple de 16 &lt;code&gt;px&lt;/code&gt;, car la taille de police par défaut de l'élément racine est de 16 &lt;code&gt;px&lt;/code&gt;. C’est tout, sans forcément qu’ils ne comprennent pourquoi. Cependant, tout le monde aura l'impression de faire du “design responsive”. En soit, nous n’introduisons pas d'erreurs dans le code, mais nous amenons la grande majorité des développeurs à ne pas pouvoir comprendre leur design. C'est comme ajouter une couche de flou supplémentaire au fichier CSS.&lt;br&gt;
En bref, les &lt;code&gt;rem&lt;/code&gt; ne doivent être utilisés que si votre designer vous a &lt;strong&gt;fourni les règles&lt;/strong&gt; sur les tailles de police. D'autant plus lorsqu'il s'agit d'exprimer autre chose que la taille de la police avec un multiple d'une taille de police.&lt;/p&gt;

&lt;h2&gt;
  
  
  La sauce magique em + rem
&lt;/h2&gt;

&lt;p&gt;Bien sûr, le vrai enfer apparaît lorsque l'on mélange les deux. En effet, on ajoute une couche de flou sur des comportements non souhaités. De ce fait, les valeurs n'ont plus aucun sens et les effets de bord sont à leur comble.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5bmp104bamhwg9gq3ni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5bmp104bamhwg9gq3ni.png" alt="schema 3" width="716" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans cet exemple, personne n'a jamais demandé 9,6 &lt;code&gt;px&lt;/code&gt; de marge ou de gap. Pour utiliser correctement les &lt;code&gt;rem&lt;/code&gt; et les &lt;code&gt;em&lt;/code&gt; ensemble, il faut une maîtrise totale de votre CSS et de votre design. Dans le cas contraire, préparez-vous à devoir ajouter des breakpoints et des &lt;code&gt;!important&lt;/code&gt; partout dans votre code pour contrôler les valeurs.&lt;br&gt;
Notez que dans mes exemples, l'effet de cascade n'a que 2 niveaux de profondeur. Cependant, dans une application moderne, on obtient rapidement des profondeurs bien plus élevées.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mais alors, on met des px partout ?
&lt;/h2&gt;

&lt;p&gt;Bien que cela puisse paraître contre-intuitif, la responsivité ne s'exprime pas à travers les unités. Il est plus important de maîtriser correctement les breakpoints et les layouts.&lt;/p&gt;

&lt;p&gt;La taille de vos composants est généralement déterminée par la place que vous leur donnez dans votre layout. L'utilisation de &lt;code&gt;px&lt;/code&gt; pour les marges et les paddings ne pose pas de problème. En théorie, 5 &lt;code&gt;px&lt;/code&gt; de marge sur un écran de 1080 x 720 &lt;code&gt;px&lt;/code&gt; et sur un écran de 400 x 800 &lt;code&gt;px&lt;/code&gt; sont presque équivalents. En pratique, on aura plutôt tendance à jouer sur la présence de certains éléments ou leur aspect général, plutôt que sur la taille des marges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8f22aw247yjqhb4isegz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8f22aw247yjqhb4isegz.png" alt="mobile version of deepl" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvc9pu6ruijwm6vedt8je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvc9pu6ruijwm6vedt8je.png" alt="pc version of deepl" width="800" height="747"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Les marges des éléments restent les mêmes, mais le layout change !&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Le choix de l'unité doit toujours être motivé par la production d'un comportement souhaité. L'utilisation des &lt;code&gt;px&lt;/code&gt; par défaut n'est pas une mauvaise chose. Au contraire, elle est préférable à toute autre unité relative. Le principal avantage du &lt;code&gt;px&lt;/code&gt;, c'est sa simplicité. Bien sûr, il est possible de faire n’importe quoi avec cette unité absolue, mais cela ne vous créera pas de nouvelles erreurs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzudbo2j2l66etrb74d3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzudbo2j2l66etrb74d3.gif" alt="gif de madame qui fait des calculs" width="576" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Vous l’aurez compris, le but de cet article n'était pas de vous présenter les bonnes pratiques en CSS. Ce n'était pas non plus de vous expliquer le fonctionnement des tailles de police ou des unités. Simplement de vous faire sortir de la tête que l'utilisation des &lt;code&gt;rem&lt;/code&gt; ou des &lt;code&gt;em&lt;/code&gt; est la clé de la responsivité. Il sera toujours plus simple de rajouter des règles sur des &lt;code&gt;px&lt;/code&gt; que de devoir comprendre des &lt;code&gt;rem&lt;/code&gt;,&lt;code&gt;em&lt;/code&gt; mal placé. Si j'ai réussi ne serait-ce qu'un tout petit peu à vous faire réfléchir sur votre utilisation des polices relatives, alors c'est réussi !&lt;br&gt;
Mort aux &lt;code&gt;rem&lt;/code&gt; sans design system, mort aux &lt;code&gt;em&lt;/code&gt; sans information business. Il est temps de mettre &lt;strong&gt;fin à la ségrégation&lt;/strong&gt; des &lt;code&gt;px&lt;/code&gt;, qui est non seulement injustifiée, mais aussi &lt;strong&gt;une source de torture quotidienne&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq48ledmdgfeijz0zb2hi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq48ledmdgfeijz0zb2hi.jpg" alt="podium ou les px arrivent premier et les rem ne sont pas sur le podium" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Voici une suite d’articles très sympas que j’ai utilisés pour produire cette article&lt;/em&gt;&lt;br&gt;
&lt;a href="https://hackernoon.com/when-and-where-to-use-rem-and-em-units-in-web-design"&gt;when-and-where-to-use-rem-and-em-units-in-web-design&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codesweetly.com/css-unit#:~:text=A"&gt;css-unit &lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.w3.org/Style/Examples/007/units.fr.html"&gt;Unités Css:em,px,rem...&lt;/a&gt;&lt;br&gt;
&lt;a href="https://flaming.codes/fr/posts/new-dynamic-viewport-sizes-dvh-lvh-svh/"&gt;Comment svh, lvh et dvh peuvent améliorer votre conception réactive&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>beginners</category>
      <category>html</category>
      <category>french</category>
    </item>
    <item>
      <title>🇫🇷 [ANGULAR] Transformez Votre Code en Forteresse : Adoptez l'Immutabilité !</title>
      <dc:creator>Gravisto</dc:creator>
      <pubDate>Mon, 25 Mar 2024 09:39:30 +0000</pubDate>
      <link>https://forem.com/gravisto/angular-transformez-votre-code-en-forteresse-adoptez-limmutabilite--4bd1</link>
      <guid>https://forem.com/gravisto/angular-transformez-votre-code-en-forteresse-adoptez-limmutabilite--4bd1</guid>
      <description>&lt;p&gt;Dans le domaine de la programmation fonctionnelle, l’immutabilité des données est un des concepts les plus importants mais aussi un des plus durs à assimiler. Il est beaucoup plus simple de travailler avec des objets mutables et dans la grande majorité des cas le code n’en est pas affecté. Alors préférer l’immutabilité des données dans son application web, ça peut sembler s’infliger des contraintes supplémentaires sans fondement, pourtant ça ne viendrait pas à l’idée d’un collégien de faire ses exercices dans son manuel emprunté au CDI. Traiter toutes ses données comme un livre emprunté, c’est garantir que tous les lecteurs accèdent aux données non corrompues. Dans cet article, on va expliquer la différence entre les données mutables et immutables, ce que cela implique dans votre code javascript et appliquer les bonnes pratiques de manipulation de données.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le cas des variables mutables
&lt;/h2&gt;

&lt;p&gt;En javascript, seuls les objets sont mutables. Mais si vous avez déjà entendu que tout est objet en javascript alors c’est perdu, tout serait donc mutable ? La réalité est un peu plus complexes que ça. En effet, il existe 7 types primitifs immutables, parmi eux : string, number, boolean, undefined, etc. Mais il existe un objet wrapper autour de chaque type primitif. Donc en principe, tout ce avec quoi on interagit quand on écrit du code javascript est mutable.&lt;/p&gt;

&lt;p&gt;Mais in fine, ça veut dire quoi (im)mutable ? On dira qu’une valeur est immutable si pour l’éditer on doit recréer une valeur. Ouvrez la console et essayez le code suivant, la chaine de caractère associée ne sera pas éditée :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const foo = "Coucou le monde!";
foo[1] = "s";
console.log(foo) // output: "Coucou le monde!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4zpczvvocr728q2zyc7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4zpczvvocr728q2zyc7.jpg" alt="memes sur l'immutabilité" width="640" height="663"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;⚠️ Dans le cas de mutabilité, on parle de la valeur (dans l’exemple        : "Coucou le monde!") et pas de la variable (dans l’exemple : foo) associée. La variable peut donc changer autant de fois de valeur, cela ne qualifiera pour autant pas le caractère mutable de ces valeurs. ⚠️&lt;/p&gt;

&lt;p&gt;Inversement, pour une liste, on peut modifier n’importe quel élément, en ajouter et en enlever sans recréer une liste à chaque fois.&lt;/p&gt;

&lt;p&gt;Les mots clefs &lt;code&gt;const&lt;/code&gt; et &lt;code&gt;readonly&lt;/code&gt; n’ont rien à voir avec la mutabilité des valeurs. Ils garantissent juste que l’on ne peut réassigner de valeurs. On n'en parlera donc pas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En pratique, les valeurs mutables que l’on utilise sont les objets et les listes.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;ℹ️ On parlera de méthode mutable si la méthode modifie la valeur de l’objet sur laquelle elle s’applique. Inversement, un méthode immutable créera une nouvelle référence avec les nouvelles valeurs. En pratique, on parle de fonction pure.ℹ️&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi travailler avec des données immutables ?
&lt;/h2&gt;

&lt;p&gt;Maintenant qu’on a vu la différence entre valeur mutable et valeur immutable, on va donner deux exemples en Angular pour saisir l’impact que la mutabilité des valeurs peut avoir sur le résultat de notre code.&lt;/p&gt;

&lt;h3&gt;
  
  
  ChangeDetector d’Angular
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/edit/stackblitz-starters-dhnryn?file=src%2Fmain.ts"&gt;stackblitz about cdr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans cet exemple de code, on veut créer une animation dans laquelle chaque élément de la liste s’affiche après chaque seconde. Mais pourquoi l’animation du haut ne se met pas à jour ? La différence se situe sur les méthodes pour mettre à jour notre liste.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uonng0y9leaekku0r0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0uonng0y9leaekku0r0l.png" alt="crd bad example" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqwxl9kgaqdce3plwdl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqwxl9kgaqdce3plwdl5.png" alt="cdr good example" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le changeDetector d’Angular ne détecte pas les mutations de valeur. Donc si on ne crée pas une nouvelle valeur, le composant (OnPush) ou le pipe (pure) ne mettra pas à jour la valeur dans la vue, même si les valeurs sont correctes.&lt;/p&gt;

&lt;p&gt;Il faut bien comprendre que dans les deux cas la liste est bel et bien mise à jour, mais Angular ne peut détecter ces changements car pour lui la liste mutée est la même.&lt;/p&gt;




&lt;p&gt;ℹ️ &lt;strong&gt;Muter&lt;/strong&gt; (= modifier une liste de manière mutable) une liste c’est lui ajouter, enlever ou modifier un ou plusieurs élément. On ne peut pas changer une liste de manière &lt;strong&gt;immutable&lt;/strong&gt;, il faut la recréer.ℹ️&lt;/p&gt;

&lt;h3&gt;
  
  
  Partage de valeur
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/edit/stackblitz-starters-k7bzn4?file=src%2Fmain.ts"&gt;stackblitz about immutability&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans ce deuxième exemple, nous avons deux composants qui partagent un objet configuration. On change sa propriété color parce qu’à la place d’une valeur hexadécimale, on veut une valeur RGB pour le CSS. Malheureusement, si je change la valeur pour l’un, la valeur change pour les deux.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvzpj46qcbcnkmmn2k3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvzpj46qcbcnkmmn2k3o.png" alt="immutable bad example" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyxzgdh67meqg0wbxkhx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyxzgdh67meqg0wbxkhx.png" alt="immutable good example" width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour répondre au problème, on peut appliquer nos changement à la liste de manière immutable. On verra dans la partie suivante comment faire dans le cas général en Javascript.&lt;/p&gt;

&lt;p&gt;Ces problématiques ne sont pas propres à Angular, ni même au code Javascript mais quand on manipule beaucoup de données, on a intérêt à appliquer des changements immutables aux valeurs que l’on manipule. Ces deux exemples sont simples puisqu’il n'y a que deux-trois composants mais quand les données ont des parcours plus complexes, ce sont généralement des bugs très difficiles à déceler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fake it till you make it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjhluzvhems4rs1i2tug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjhluzvhems4rs1i2tug.png" alt="poisson avec une aile de requin acroché dessus" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comment travailler avec des données mutables ? Faîtes semblant que les données soient immutables. Ainsi, à chaque update de valeur, il faut recréer son objet.&lt;/p&gt;

&lt;p&gt;Le problème de cette méthode c’est qu’elle nécessite de bien connaître les méthodes mutables associées à son objet. Pour les objets issus de librairies, bon courage car il faudra tester à la main. Pour les objets natifs comme Array, MDN saura vous répondre.&lt;/p&gt;

&lt;p&gt;Vous pouvez dès à présent bannir &lt;code&gt;sort&lt;/code&gt; et accueillir sa petite sœur mutable &lt;code&gt;toSorted&lt;/code&gt; tout frais du standard 2023 d’EcmaScript (cf.&lt;a href="https://dev.to/jasmin/what-is-new-in-es2023-4bcm#4-change-array-by-copy"&gt;Nouveautés 2023 JS&lt;/a&gt;). Plus simplement, toutes les méthodes qui s’écrivent sous la forme &lt;code&gt;newValue = oldValue.method()&lt;/code&gt; ont de bonnes chances d’être immutables.&lt;/p&gt;




&lt;p&gt;ℹ️ Pour aller plus loin, il existe des librairies JS (&lt;a href="https://immutable-js.com/"&gt;immutable&lt;/a&gt;&amp;amp; &lt;a href="https://immerjs.github.io/immer/"&gt;immer&lt;/a&gt;) qui implémentent diverses structures de données immutables pour remplacer les objets natifs javascript mutables. Ces structures de données sont plus sûres à utiliser mais nécessitent que les développeurs soient formés sur ces librairies. Leur grand intérêt est surtout au niveau des performances.ℹ️&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Comme le précise la documentation MDN au sujet de l’immutabilité, il est dur de travailler qu’avec des structures de données immutables si aucune sémantique de langage ne le garantit (Rappel, le mot clef const ne garantit pas l’immutabilité des données, seulement de la variable).&lt;/p&gt;

&lt;p&gt;Dans le cas de Javascript, cela est avant tout un contrat entre développeurs que les mutations ne sont pas de bons pattern de développement (Par exemple en utilisant Object.freeze ou des librairies spécialisées).&lt;/p&gt;

&lt;p&gt;Comme on l’a vu dans la partie d’exemple, le grand intérêt de l’immutabilité est d’éviter des bugs où les mutations ne se transposent pas sur là où on les fait, ou pire qu’elles se transposent là où on ne les fait pas.&lt;/p&gt;

&lt;p&gt;Enfin, l’immutabilité est l’un des principes clefs de la programmation fonctionnelle et ouvre les portes aux fonctions pures.&lt;/p&gt;

&lt;p&gt;TL;DR: Avoid in place mutation, prefer replacing&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures"&gt;JavaScript data types and data structures - JavaScript | MDN &lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Immutable"&gt;Immutable - MDN Web Docs Glossary: Definitions of Web-related terms | MDN&lt;/a&gt;&lt;br&gt;
&lt;a href="https://mevasanth.medium.com/how-everything-is-object-in-javascript-a4164d7e6a2d"&gt;How everything is Object in JavaScript ?&lt;/a&gt; &lt;br&gt;
&lt;a href="https://mevasanth.medium.com/prototype-and-protypal-inheritance-in-javascript-bb766097ac05"&gt;Prototype and Protypal Inheritance in JavaScript&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Primitive"&gt;Primitive - MDN Web Docs Glossary: Definitions of Web-related terms | MDN &lt;/a&gt;&lt;br&gt;
&lt;a href="https://observablehq.com/@anjana/immutability?collection=@anjana/functional-javascript-first-steps"&gt;Immutability&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/9108925/how-is-almost-everything-in-javascript-an-object/9109037#9109037"&gt;How is almost everything in Javascript an object? &lt;/a&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/n5REbbvRYqQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>programming</category>
      <category>french</category>
    </item>
    <item>
      <title>🇫🇷 L'art de faire un Zoom en Web</title>
      <dc:creator>Gravisto</dc:creator>
      <pubDate>Fri, 15 Mar 2024 13:02:10 +0000</pubDate>
      <link>https://forem.com/gravisto/lart-de-faire-un-zoom-en-web-3m00</link>
      <guid>https://forem.com/gravisto/lart-de-faire-un-zoom-en-web-3m00</guid>
      <description>&lt;p&gt;Dans une application d’édition (photo, vidéo, schéma …), il y a toujours un moyen de zoomer et de dézoomer et il est facile de se dire que c’est une fonctionnalité rapide à implémenter. Puis on le fait et on se rend compte de sa complexité.&lt;/p&gt;

&lt;p&gt;Je vais donc expliquer quelles sont les conditions pour qu’un zoom soit réussi et 2 façons de l’implémenter, avec leurs avantages et leurs inconvénients.&lt;/p&gt;

&lt;p&gt;On ne va pas trop parler maths, ne vous inquiétez pas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64byd6dzaf3tkb9zluu4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64byd6dzaf3tkb9zluu4.gif" alt="math focus people" width="480" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Qu’est ce qu’un zoom réussi ?
&lt;/h2&gt;

&lt;p&gt;Il y a 3 conditions pour qu’un zoom soit fonctionnel et intuitif pour l’utilisateur: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les objets sur lesquels on zoom doivent grossir ou rapetisser selon l’action voulue et toutes les actions doivent être réversibles.&lt;/li&gt;
&lt;li&gt;Pour que le feeling du zoom soit réussi et que l’utilisateur ne se perde pas lors d’un zoom, il faut que le zoom prenne en compte la position de la souris.&lt;/li&gt;
&lt;li&gt;La modification de la distance entre les objets doit être proportionnel au ratio de zoom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et si on prend des schémas, en prenant en exemple d’un éditeur (le rectangle noir représentant la page afficher):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2nko9jyd6ze0rb3rhpr5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2nko9jyd6ze0rb3rhpr5.png" alt="zoom schema" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywz5sp6ypa9jpn3pklob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywz5sp6ypa9jpn3pklob.png" alt="unzoom schema" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les lignes pointillées vertes représentent les lignes de fuite des objets, prenant pour centre le curseur de la souris. Ces lignes ne doivent pas être modifiées avec le zoom, mais seulement avec la position des objets et de la souris.&lt;/p&gt;

&lt;p&gt;Lors d’une modification du zoom, tous les objets doivent se déplacer le long de ces lignes pour rendre le zoom fluide et compréhensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comment on fait ça ?
&lt;/h2&gt;

&lt;p&gt;Premièrement, il faut choisir si on prend un ratio de zoom constant ou un step de zoom constant. Le ratio est le zoom fait par rapport au précédent et le step est la différence entre 2 zooms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ratio de 50% : 100% ⇒ 150% ⇒ 225% ⇒ 337.5&lt;/li&gt;
&lt;li&gt;step de 50% : 100% ⇒ 150% ⇒ 200% ⇒ 250%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il n’y a pas de différence d’implémentation entre les deux, c’est juste un choix d’UX.&lt;/p&gt;

&lt;p&gt;Pour l’implémentation, je vais présenter deux solutions avec leurs avantages et leurs inconvénients et je vous laisse faire votre choix en fonction de votre besoin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Freszf3drpcqiosmk94w0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Freszf3drpcqiosmk94w0.png" alt="schema" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Utiliser les règles CSS
&lt;/h2&gt;

&lt;p&gt;Avec les propriétés CSS ‘scale’ et ‘translate’, il est possible de créer un effet de zoom très facilement.&lt;/p&gt;

&lt;p&gt;Le but est de faire notre page comme elle doit être, puis de la grossir globalement du facteur voulu (par exemple 50%) et enfin de déplacer la page en fonction de la position de la souris.&lt;/p&gt;

&lt;p&gt;Pour le zoom on obtient ceci :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfzlxmse7rsnkeqkvonf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfzlxmse7rsnkeqkvonf.png" alt="schema" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Le rectangle rouge représente la page sur laquelle on veut zoomer, contenant les rectangles jaunes.&lt;/p&gt;

&lt;p&gt;Le rectangle noir représente la vue que l’utilisateur a (l’écran de l’utilisateur), sur le schéma de gauche les rectangles noir et rouge sont confondus.&lt;/p&gt;

&lt;p&gt;Après le zoom, la page est scaled de 150% (ici) et translated d’une certaine valeur en x et y.&lt;/p&gt;

&lt;p&gt;La translation est de : -rmx sur x et -rmy sur y avec:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;r le ratio de zoom (ici 50%)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(mx;my) la position de la souris sur l’écran&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et pour le dézoom :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fai2x2rugl38ewtmboayn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fai2x2rugl38ewtmboayn.png" alt="schema" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dans ce cas la translation est de r*mx et r*my.&lt;/p&gt;

&lt;p&gt;Pour plusieurs zooms, si le ratio est constant (par exemple chaque zoom est un grossissement de 50%) alors le scale se multiplie avec le précédent, par contre si le step est constant (100% ⇒ 150% ⇒ 200% ⇒ 250% …) alors le scale s’additionne avec le précédent. &lt;strong&gt;Dans tous les cas la translation s’additionne avec la précédente.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’implémentation en CSS est facile puisqu’il ne faut pas gérer chaque élément de notre page un par un, tout sera géré en une seule fois.&lt;/p&gt;

&lt;p&gt;Cependant, il y a des problèmes avec cette implémentation :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complexité de la gestion de la position de la souris par rapport aux éléments&lt;/li&gt;
&lt;li&gt;Très peu modulable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour résoudre ces problèmes, il y a une autre implémentation possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bouger nos éléments
&lt;/h2&gt;

&lt;p&gt;Si on ne veut pas faire du CSS, il est possible de faire bouger les objets le long des lignes de fuite qu’on a vues précédemment.&lt;/p&gt;

&lt;p&gt;Pour cela, on va modifier la taille et la position des objets.&lt;/p&gt;

&lt;p&gt;La taille c’est facile, on multiplie juste la taille actuelle par le zoom effectué pour obtenir la nouvelle taille.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Par contre la position, c’est un autre problème.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les objets doivent suivre la ligne définie par la position de la souris, et la position de leur centre. Ces lignes définissent l’orientation du vecteur de déplacement de chaque objet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F873lard3qjii74w5saon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F873lard3qjii74w5saon.png" alt="vecteur schema" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La norme de ces vecteurs dépend de leur distance avec la souris.&lt;/p&gt;

&lt;p&gt;Le vecteur de déplacement est donc défini comme suit :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;r*(x-mx)+mx&lt;/li&gt;
&lt;li&gt;r* (y-my)+my&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec r le ratio de zoom, (x;y) la position de l’objet à déplacer et (mx;my) la position de la souris.&lt;/p&gt;

&lt;p&gt;On obtient ceci :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2u9r0e3vno5me2nbito.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2u9r0e3vno5me2nbito.png" alt="schema" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette méthode est plus complexe d’implémentation mais permet de gérer entièrement la position et la taille des objets. Elle permet aussi de pouvoir connaitre facilement la position de la souris par rapport aux objets. De plus, comme tous les objets connaissent leur taille affichée, il n’est pas nécessaire de connaitre le ratio de zoom actuel pour l’obtenir et l’utiliser (pour d’autres fonctionnalités par exemple).&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Le zoom n’est donc pas une fonctionnalité si simple à implémenter et les problèmes rencontrés dépendent du choix de l’implémentation, que l’on peut résumer comme ceci :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Implémentation 1 : CSS&lt;/th&gt;
&lt;th&gt;Implémentation 2 : Gestion des Objet 1 à 1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Avantages&lt;/td&gt;
&lt;td&gt;Simple d’implémentation &amp;amp; Gestion de toute la page en une seule fois&lt;/td&gt;
&lt;td&gt;Modularité complète &amp;amp; Interactions utilisateur plus simple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inconvénients&lt;/td&gt;
&lt;td&gt;Peu Modulable &amp;amp; Interactions utilisateur plus complexe&lt;/td&gt;
&lt;td&gt;Complexité d’implémentation &amp;amp; Gestion de chaque propriété peut devenir fastidieux&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;J’ai proposé 2 choix d’implémentations mais il en existe surement d’autres avec chacun des avantages et inconvénients. J’ai une préférence pour la 2ème implémentation malgré sa complexité pour sa modularité.&lt;/p&gt;

&lt;p&gt;Il faut cependant bien connaitre les contraintes pour faire un choix pertinent, ni trop complexe ni trop contraignant.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
      <category>french</category>
    </item>
  </channel>
</rss>
