Écran de code CSS avec des règles en cascade complexes et redondantes

Les IA abusent (un peu trop) avec le CSS

Publié le

Demandez à une IA de générer un composant CSS et elle vous livrera quelque chose qui fonctionne. C'est indéniable. Mais regardez de plus près ce code, et vous verrez rapidement des dizaines de règles inutiles, des valeurs codées en dur là où une variable suffirait, un z-index: 9999 sorti de nulle part, et des positionnements absolus là où un simple flexbox aurait fait l'affaire en trois lignes. Le CSS généré par l'IA ressemble à du bon travail. Il est rarement du bon travail.

Le syndrome du code inutile

Le premier problème du CSS généré par les IA, c'est le volume. Pas la complexité, le volume. Quand vous demandez à un modèle de styliser un bouton, il ne vous donne pas les cinq propriétés pertinentes. Il vous donne vingt règles dont quinze redéfinissent des comportements déjà hérités, écrasent des valeurs qui n'avaient pas besoin d'être écrasées, ou déclarent explicitement ce que le navigateur applique de toute façon par défaut.

Ce comportement n'est pas un bug. C'est une conséquence directe de la façon dont ces modèles ont appris : en ingérant des millions de fichiers CSS de qualité très variable, souvent issus de projets anciens, de tutoriels approximatifs ou de bases de code mal entretenues. L'IA reproduit fidèlement les habitudes qu'elle a le plus observées, et ces habitudes sont rarement celles d'un développeur qui a les meilleures pratiques en tête.

Pourquoi l'IA crée des règles pour chaque élément

L'IA ne raisonne pas en termes de cascade ou d'héritage. Elle répond à une consigne localisée , "ce bouton doit avoir telle apparence" , sans intégrer le contexte global de votre feuille de styles. Résultat : elle génère des règles autonomes et autosuffisantes pour chaque composant, comme si chacun vivait dans le vide, sans parents, sans réinitialisation, sans thème global.

Un développeur expérimenté définit une règle à un niveau élevé et laisse la cascade faire le travail. L'IA définit la même règle à chaque niveau, pour être sûre. Ce n'est pas de la prudence, c'est du bruit. Et ce bruit rend la lecture du code fastidieuse, les modifications risquées, et la cohérence visuelle difficile à maintenir.

Ces propriétés redondantes qui alourdissent votre projet

Parmi les classiques que l'on retrouve systématiquement dans le CSS généré : box-sizing: border-box redéclaré sur chaque sélecteur alors qu'il est déjà défini globalement, display: block sur des éléments qui sont déjà des blocs par nature, ou encore margin: 0 et padding: 0 sur des éléments que personne n'avait touchés.

Ces propriétés ne cassent rien, mais elles polluent. Elles allongent les fichiers, elles ralentissent la lecture et elles brouillent les modifications ultérieures. Quand tout est déclaré partout, identifier ce qui est vraiment intentionnel devient un exercice de déduction.

/* Ce que l'IA génère typiquement pour un bouton */
.btn {
  display: inline-block; /* déjà le comportement par défaut d'un <button> */
  box-sizing: border-box; /* déjà défini dans votre reset global */
  margin: 0; /* personne n'avait ajouté de marge */
  padding: 10px 20px;
  font-size: 16px; /* valeur codée en dur, pas de variable */
  font-family: inherit;
  background-color: #3a86ff; /* couleur codée en dur */
  color: #ffffff;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  text-decoration: none; /* sur un bouton, pas un lien */
  line-height: normal; /* valeur par défaut redéclarée */
  vertical-align: middle;
}

L'IA ignore les variables CSS

Les custom properties CSS , les variables comme --color-primary ou --spacing-md , sont l'un des outils les plus puissants pour maintenir la cohérence d'un design system. Elles permettent de centraliser les valeurs qui se répètent et de les modifier depuis un seul endroit. L'IA les connaît. Elle ne les utilise quasiment jamais d'elle-même.

Par défaut, les modèles génèrent des valeurs hexadécimales codées en dur, des tailles en pixels absolus, des espacements arbitraires qui ne correspondent à aucun système cohérent. Si votre projet utilise déjà des variables CSS et que vous ne les mentionnez pas explicitement dans votre prompt, le code généré les ignorera complètement et introduira des doublons silencieux dans votre thème. Changer la couleur principale deviendra une opération chirurgicale à travers tout le fichier.

L'anarchie du z-index

Il existe un indicateur infaillible pour savoir si un fichier CSS a été généré ou mal maintenu : la présence de z-index: 9999. Ce chiffre est une capitulation. Il dit : "je ne comprends pas pourquoi mon élément passe derrière un autre, alors je mets une valeur assez grande pour être sûr". Les IA en abusent systématiquement, et elles nous ont transmis cette mauvaise habitude.

L'abus du z-index: 9999

Le z-index ne fonctionne pas globalement. Il s'applique à l'intérieur d'un contexte d'empilement, défini par certaines propriétés CSS comme position, opacity, transform ou isolation. Deux éléments dans des contextes différents ne se comparent pas directement, quelle que soit la valeur de leur z-index respectif.

Quand l'IA génère un z-index: 9999 sur une modale ou un tooltip, elle contourne le problème sans le résoudre. Le jour où un autre composant obtient lui aussi un z-index: 9999 , et ce jour arrive toujours , vous vous retrouvez avec deux éléments au même niveau et aucune logique pour décider lequel passe devant. Certains projets en arrivent à z-index: 99999, puis 999999. C'est une escalade sans fin.

⚠ La règle des z-index sains. Un projet bien structuré devrait pouvoir gérer tous ses empilements avec des valeurs entre 1 et 100. Si vous voyez des milliers, c'est le signe d'une architecture CSS qui n'a jamais été pensée.

L'IA ignore la structure des calques

La bonne façon de gérer les empilements, c'est de définir une échelle explicite dès le départ : les éléments de base à 1, les éléments flottants à 10, les menus déroulants à 20, les modales à 50, les notifications à 80. Ces valeurs peuvent même être stockées dans des variables CSS pour être centralisées. C'est simple, prévisible, maintenable.

L'IA ne fait pas ça. Elle génère chaque composant indépendamment, sans vision d'ensemble, et attribue des valeurs arbitraires qui ne s'inscrivent dans aucun système. Quand vous assemblez plusieurs composants générés séparément, les conflits d'empilement arrivent inévitablement. Et les corriger demande de comprendre une architecture que personne n'a jamais conçue.

L'enfer des positionnements arbitraires

Le positionnement CSS, c'est le domaine où l'IA révèle le plus clairement qu'elle produit du code qui marche sur son écran, pas du code qui tient la route dans un vrai projet. Les solutions générées sont souvent fonctionnelles pour un cas précis, dans des conditions précises, avec une taille de fenêtre précise. Changez une de ces conditions et tout se décale.

L'abus du positionnement absolu

Le positionnement absolu a sa place. Il est utile pour les overlays, les badges flottants, les éléments décoratifs qui doivent sortir du flux. Mais l'IA l'utilise comme outil universel, y compris là où flexbox ou grid seraient non seulement plus propres, mais plus robustes. Un élément positionné en absolu dans un conteneur de taille fixe se comporte correctement sur l'écran du développeur. Sur un mobile, dans un conteneur dynamique, ou après une modification du parent, il se retrouve au mauvais endroit.

Ce qui aggrave le problème, c'est que le positionnement absolu rend le code difficile à lire. Pour comprendre où se trouve un élément, il faut remonter jusqu'au premier ancêtre positionné, calculer l'offset, tenir compte des marges. C'est du CSS à déchiffrer plutôt qu'à lire.

L'IA préfère le calcul à la structure

Autre symptôme fréquent : l'utilisation de calc() pour compenser des décalages qui n'auraient pas dû exister. On voit régulièrement des constructions comme left: calc(50% - 120px) ou margin-top: calc(var(--header-height) + 16px) là où un conteneur flex avec justify-content: center ou un simple padding-top sur le bon élément aurait tout résolu.

Ces calculs fonctionnent, mais ils créent des dépendances fragiles. Si la hauteur du header change, si le conteneur parent est modifié, si la valeur de référence évolue, le calcul devient faux. Un layout fondé sur la structure du document est résilient par nature. Un layout fondé sur des calculs compensatoires est résilient jusqu'à la prochaine modification.

/* Ce que l'IA génère souvent */
.card-badge {
  position: absolute;
  top: calc(50% - 12px);
  left: calc(100% - 24px);
  z-index: 9999;
}

/* Ce que ça devrait être */
.card {
  position: relative;
}
.card-badge {
  position: absolute;
  top: -12px;
  right: -12px;
  z-index: 10;
}

Le cadeau empoisonné du code généré

Le code CSS généré par une IA donne l'illusion d'un gain de temps. Et sur le court terme, c'en est un : en quelques secondes, vous avez un composant qui s'affiche correctement. Le problème n'apparaît pas immédiatement. Il s'accumule, silencieusement, à chaque composant ajouté, à chaque modification, à chaque fois qu'un développeur doit comprendre ce que le précédent a fait.

Pourquoi corriger un "brouillon" prend plus de temps que coder

Il existe un phénomène bien connu dans le monde du développement : il est souvent plus rapide d'écrire quelque chose from scratch que de corriger un code existant mal structuré. Lire du code prend du temps. Identifier ce qui est intentionnel et ce qui est accidentel ou comprendre des intentions qui n'ont jamais été explicitées aussi. Le CSS généré par l'IA cumule tous ces problèmes.

Vous héritez d'un code qui fonctionne, certes, mais que vous n'avez pas écrit, que vous ne comprenez pas entièrement, et que vous n'osez pas modifier sans risquer de casser quelque chose. C'est exactement la définition de la dette technique : du code dont le coût de possession augmente avec le temps, indépendamment de sa qualité apparente au moment de sa création.

Quand la maintenance se complique

Imaginez six mois après le lancement. Vous devez changer la couleur principale de votre interface. Dans un projet sain, vous modifiez une variable CSS et tout se met à jour. Dans un projet dont le CSS a été généré par accumulation, vous trouvez la même valeur hexadécimale à quarante endroits différents, parfois dans des formes légèrement différentes, parfois mélangée avec des opacités codées en dur. Chaque modification devient une opération à risque.

Le problème est encore plus flagrant quand plusieurs personnes travaillent sur le même projet. Un développeur qui reprend du code CSS généré sans documentation n'a aucun moyen de distinguer ce qui est structurant de ce qui est accidentel. Il va, lui aussi, ajouter des règles pour compenser, empiler les correctifs, et aggraver progressivement ce que le prochain développeur devra démêler.

CSS généré sans relecture CSS écrit ou relu par un développeur
Valeurs codées en dur répétées partout Variables CSS centralisées et réutilisées
z-index: 9999 à plusieurs endroits Échelle d'empilement définie et documentée
Positionnements absolus pour des layouts qui pourraient être en flux normal Flexbox et grid pour les layouts, absolu uniquement quand c'est justifié
Règles redondantes difficiles à distinguer des règles intentionnelles Chaque règle a une raison d'être identifiable

Comment reprendre la main ?

Rien de tout cela ne signifie qu'il faut abandonner l'IA pour écrire du CSS. Ces outils ont un réel intérêt pour accélérer certaines tâches répétitives, explorer des approches ou générer une base de travail. Mais l'utiliser correctement demande de changer la façon dont on perçoit son output : non pas comme un livrable, mais comme un brouillon.

Le code généré n'est qu'un brouillon

Le changement de posture est simple à formuler et difficile à tenir sous la pression du temps : tout code CSS généré par une IA doit être lu, compris et validé avant d'être intégré. Pas survolé. Pas copié-collé parce que "ça marche dans l'aperçu". Lu ligne par ligne, avec la question systématique : est-ce que cette règle est nécessaire, et est-ce qu'elle s'intègre dans l'architecture existante ?

Cette étape de relecture a un coût immédiat, mais elle en évite un beaucoup plus élevé plus tard. Elle oblige aussi à mieux comprendre ce que l'on intègre, ce qui est la seule façon de rester maître de son propre code sur le long terme. Un développeur qui ne comprend pas son CSS ne peut pas le faire évoluer sereinement.

Apprendre à brider l'IA avec des prompts minimalistes

Le comportement de l'IA est en grande partie conditionné par la façon dont vous la sollicitez. Un prompt vague comme "génère le CSS pour une carte produit" produira un bloc autonome et surchargé. Un prompt précis comme "génère uniquement les propriétés spécifiques à ce composant, en utilisant les variables --color-primary et --spacing-md déjà définies, sans redéclarer les propriétés héritées du reset" produira quelque chose de beaucoup plus utilisable.

Plus vous donnez de contexte , votre architecture existante, vos conventions de nommage, vos variables, votre système de z-index , moins l'IA aura à inventer. Et moins elle inventera, moins vous aurez à nettoyer. C'est un investissement dans la qualité du prompt qui se rembourse à chaque composant généré.

Nettoyer son code

Si vous avez déjà un projet avec du CSS généré accumulé, un audit est souvent la première étape utile. L'objectif n'est pas de tout réécrire d'un coup , c'est rarement possible , mais d'identifier les sources de friction : les valeurs dupliquées qui mériteraient d'être des variables, les z-index anarchiques qui devraient être rationalisés, les positionnements absolus qui pourraient être remplacés par du flexbox.

Des outils comme PurgeCSS peuvent aider à supprimer les règles non utilisées. Un linter CSS comme Stylelint peut en détecter d'autres automatiquement. Mais aucun outil ne remplace la lecture humaine pour distinguer ce qui est superflu de ce qui est intentionnel. Le nettoyage est un travail artisanal, et c'est normal : il s'agit de redonner du sens à un code qui en manquait.

✓ Bonne pratique. Avant d'intégrer du CSS généré, ouvrez les DevTools et vérifiez quelles règles sont effectivement appliquées sur vos éléments. Les propriétés barrées dans le panneau Styles sont des règles inutiles. Si la majorité de ce que vous venez d'intégrer est barré, vous avez votre réponse sur la qualité du code généré.

L'IA est un outil de travail, pas un collègue senior. Elle n'a pas de vision d'ensemble de votre projet, pas de souci de maintenabilité, pas de sensibilité à la dette technique. Elle répond à la consigne du moment. La responsabilité de ce qui entre dans votre codebase reste la vôtre, que le code ait été écrit par vous ou généré par un modèle. Et un CSS bien structuré, c'est un projet qu'on modifie sans angoisse.

Vous avez du CSS généré par IA dans votre projet ?

Un audit de votre code permet d'identifier rapidement les règles redondantes, les z-index incontrôlés et les positionnements fragiles avant qu'ils ne deviennent un vrai problème de maintenance. Mieux vaut agir tôt que de réécrire tout tard.

Demander un audit
Cadenas ouvert devant un écran de code, symbolisant une faille de sécurité L'erreur de sécurité Supabase que je vois partout en ce moment

Coder une app avec l'IA en 5 minutes c'est cool, mais attention aux angles morts. Focus sur l'oubli de configuration Supabase le plus courant et comment le corriger.

Un développeur seul devant ses écrans de code. Votre code est biaisé : pourquoi on ne peut pas être à la fois le client et l'architecte

Coder pour soi-même, c'est séduisant. Mais en étant votre propre client, vous éliminez la friction qui forge la qualité. Ce que l'IA change à l'équation, et pourquoi il faut quand même y aller.

Écran d'ordinateur affichant du code HTML et JavaScript Comment faire un quiz en HTML et JavaScript ?

Apprenez à créer un quiz interactif en HTML, CSS et JavaScript. Structure HTML, style CSS et logique JavaScript expliqués étape par étape.