Publié le 15 mai 2024

Penser que `<img>` est pour le contenu et `background-image` pour la déco est une simplification dangereuse qui bride votre design et vos performances.

  • `background-image` est un moteur de composition CSS permettant de superposer des calques, des dégradés et des filtres sans alourdir le DOM.
  • Le choix impacte directement le Largest Contentful Paint (LCP) et l’accessibilité ; un arbitrage conscient est donc non négociable.

Recommandation : Cessez de choisir par habitude. Analysez chaque image selon son rôle sémantique ET son rôle dans la composition visuelle de l’interface.

Ajouter une image à une page web. Le geste semble simple, presque un réflexe pour tout développeur. On tape <img src="..."> et le tour est joué. Puis vient la question, presque un dogme dans le métier : est-ce une image de contenu ou de décoration ? Si c’est du contenu, on garde <img> pour le SEO et son attribut alt. Si c’est de la déco, on bascule sur la propriété background-image en CSS. La messe semble dite, le débat clos depuis des années.

Et si ce dilemme binaire était la raison pour laquelle vos designs manquent de flexibilité et vos pages de performance ? Et si la balise <img>, dans de nombreux cas, était une solution rigide et finalement sous-optimale ? La véritable puissance ne réside pas dans le choix binaire entre contenu et décoration, mais dans la compréhension de background-image comme un véritable moteur de composition graphique intégré nativement à votre feuille de style. C’est un outil capable de gérer des calques, des effets dynamiques et des motifs procéduraux avec une souplesse que la balise <img> seule ne peut égaler.

Cet article va déconstruire ce mythe tenace. Nous allons démontrer que l’opposition entre ces deux méthodes est dépassée. Vous découvrirez comment, de la gestion avancée des calques aux filtres graphiques complexes, background-image est l’outil secret que vous sous-estimez pour créer des interfaces web plus riches, plus légères et infiniment plus flexibles, à condition de savoir quand et comment l’utiliser à son plein potentiel.

Cet article va vous guider à travers les concepts essentiels et les techniques avancées qui transformeront votre approche de l’intégration d’images. Préparez-vous à reconsidérer vos habitudes.

Image de contenu ou de décoration ? Le choix crucial entre `<img>` et `background-image`

Le débat fondamental entre <img> et background-image repose traditionnellement sur la sémantique et l’accessibilité. La règle de base est simple : si une image apporte une information essentielle à la compréhension du contenu (un diagramme, une photo de produit), elle doit être une balise <img> avec un attribut alt descriptif. Si elle n’est que purement esthétique (un motif, une texture), background-image est la voie à suivre. Ce principe est crucial, notamment pour l’accessibilité, car selon les données pour la France, environ 15% de la population française est en situation de handicap et dépend de ces alternatives textuelles.

Cependant, la performance vient complexifier cet arbitrage. Une idée reçue est que background-image est systématiquement meilleur pour le temps de chargement. La réalité est plus nuancée. Une étude sur le Largest Contentful Paint (LCP), une métrique clé des Core Web Vitals, a montré qu’une image de fond CSS peut augmenter le LCP de 1.3 secondes par rapport à une balise <img> optimisée avec fetchpriority="high". Le navigateur découvre en effet l’image de fond plus tardivement dans le processus de rendu. Pour les images critiques « au-dessus de la ligne de flottaison », une balise <img> bien optimisée est souvent plus performante.

L’arbitrage n’est donc pas seulement une question de sémantique, mais un compromis stratégique entre accessibilité, performance perçue et flexibilité de design. Ignorer l’un de ces trois piliers est une erreur. Pour faire un choix éclairé, un premier niveau d’analyse reste indispensable.

Votre checklist d’audit RGAA pour chaque image

  1. Information cruciale : L’image transmet-elle une information importante que le texte ne contient pas (ex: logo, schéma, photo de produit) ? Si oui, passez à l’étape 2. Sinon, passez à l’étape 3.
  2. Sémantique du contenu : Utilisez une balise <img> avec un attribut alt rigoureusement descriptif. Votre choix est fait.
  3. Rôle décoratif : L’image est-elle purement décorative ou redondante avec le texte adjacent ? Si oui, utilisez background-image en CSS ou une balise <img> avec un alt="" vide et un attribut aria-hidden="true".
  4. Fonctionnalité (icônes) : S’il s’agit d’une icône cliquable, elle est fonctionnelle. Préférez des solutions SVG ou des techniques comme mask-image pour un contrôle total via CSS.
  5. Performance critique (LCP) : L’image est-elle l’élément le plus large visible immédiatement au chargement ? Si oui, une balise <img> avec des attributs de priorisation (`loading= »eager »`, `fetchpriority= »high »`) sera probablement plus performante.

Ce premier diagnostic est essentiel, mais il ne représente que la surface du problème. La véritable puissance de background-image se révèle lorsqu’on dépasse cette simple opposition pour l’envisager comme un outil de composition.

`cover` vs `contain` : la magie de `background-size` pour des images toujours parfaites

L’un des avantages les plus évidents de background-image sur la balise <img> est le contrôle absolu qu’il offre sur le comportement de l’image au sein de son conteneur. C’est là que la propriété background-size entre en jeu, avec ses deux valeurs reines : cover et contain. Comprendre leur différence est la clé pour obtenir des mises en page responsives robustes sans jamais déformer une image.

Avec background-size: cover, le navigateur zoome sur l’image pour qu’elle remplisse entièrement son conteneur, quitte à en rogner les bords. C’est la solution idéale pour les images de bannière (« hero images ») ou les arrière-plans pleine page, où l’intégrité du cadre est plus importante que la visibilité de l’intégralité de l’image. Le sujet principal doit être centré pour éviter d’être coupé sur certains formats d’écran. À l’inverse, background-size: contain assure que l’image sera toujours visible dans son intégralité, sans rognage. Le navigateur la réduit jusqu’à ce qu’elle tienne dans son conteneur, ce qui peut laisser des espaces vides si les proportions ne correspondent pas. C’est le choix parfait pour les logos ou les icônes, où chaque pixel compte.

Cet arbitrage simple résout 90% des problèmes de mise en page d’images, un défi souvent complexe à gérer avec une simple balise <img> qui nécessite des hacks CSS (comme `object-fit`) pour obtenir un comportement similaire.

Comparaison côte à côte de deux conteneurs montrant l'effet de background-size cover et contain sur une même image

Le tableau suivant résume les cas d’usage pour chaque valeur clé de background-size, vous permettant de choisir la bonne option en un clin d’œil.

Comparaison des valeurs de background-size
Valeur Comportement Cas d’usage idéal Avantage principal
cover Remplit tout le conteneur Images héros, bannières Pas d’espace vide
contain Image entière visible Logos, icônes Préserve les proportions
50% auto Largeur fixe, hauteur auto Watermarks Contrôle précis
100px 200px Dimensions fixes Patterns répétitifs Prévisibilité totale

Ce contrôle n’est que le début. La véritable magie opère lorsque l’on commence à combiner plusieurs arrière-plans, transformant un simple conteneur en une véritable toile de composition numérique.

Superposez vos arrière-plans : la technique des `background-image` multiples

C’est ici que background-image transcende son rôle pour devenir un véritable moteur de composition. Saviez-vous que vous pouvez appliquer un nombre quasi illimité d’images de fond à un seul et même élément HTML ? En séparant simplement les URL par des virgules, vous créez une pile de calques, similaire à ce que vous feriez dans un logiciel comme Photoshop. Le premier arrière-plan déclaré est celui du dessus, et ainsi de suite.

Cette technique ouvre des possibilités créatives immenses. Vous pouvez superposer un motif transparent sur une image, ajouter une vignette (un dégradé radial noir transparent) pour faire ressortir le centre, ou encore combiner une icône avec un fond texturé. Chaque calque peut avoir ses propres propriétés (background-size, background-position, background-repeat), vous offrant un contrôle granulaire sur la composition finale. Le tout, sans ajouter une seule balise <div> superflue à votre HTML. Le DOM reste propre et sémantique, tandis que la richesse visuelle est entièrement gérée par le CSS.

En combinant cette technique avec la propriété background-blend-mode, on atteint un niveau supérieur. Cette propriété permet de définir comment les calques d’arrière-plan se mélangent entre eux, en utilisant des modes de fusion bien connus des graphistes : multiply, screen, overlay, color-burn, etc. C’est la porte ouverte à la création d’effets complexes directement dans le navigateur.

Étude de cas : Filtre de couleur dynamique

En utilisant background-image avec plusieurs valeurs, on peut créer un effet de filtre coloré sans manipuler l’image originale. Il suffit de superposer deux fonds : l’image elle-même et un dégradé de couleur uni. En appliquant background-blend-mode: multiply;, le dégradé se mélange à l’image pour la teinter. L’avantage ? La couleur du filtre peut être changée dynamiquement via une variable CSS, par exemple au survol ou en fonction d’un thème (mode sombre/clair), sans avoir à charger de nouvelles images ni à utiliser JavaScript. C’est une technique à la fois performante et incroyablement flexible.

Cette gestion des calques libère la créativité, mais background-image possède d’autres atouts, notamment pour créer des effets de profondeur et de mouvement avec une simplicité déconcertante.

Créez un effet de parallaxe en 2 lignes de CSS avec `background-attachment`

L’effet de parallaxe, où l’image de fond défile plus lentement que le contenu, a longtemps été le domaine de bibliothèques JavaScript lourdes et complexes. Pourtant, CSS offre une solution native d’une simplicité désarmante : background-attachment: fixed;. Appliquée à un élément, cette seule ligne de code fixe l’image de fond par rapport à la fenêtre du navigateur (le viewport) et non par rapport à l’élément lui-même. Lorsque l’utilisateur fait défiler la page, le contenu passe « par-dessus » l’image de fond qui, elle, reste immobile. L’illusion de profondeur est créée instantanément.

Cependant, cette simplicité a un coût de performance souvent ignoré. Parce que le navigateur doit constamment recalculer la zone visible de l’image à chaque pixel de défilement, cette technique peut être très gourmande en ressources. En effet, background-attachment: fixed peut causer jusqu’à 60% de repaints supplémentaires, provoquant des saccades (jank) sur les machines moins puissantes et sur mobile. Son utilisation doit donc être mûrement réfléchie et testée.

Heureusement, CSS moderne offre une alternative bien plus performante pour obtenir un effet de parallaxe fluide, en s’appuyant sur les transformations 3D qui sont accélérées par le processeur graphique (GPU). Cette méthode, bien que légèrement plus complexe, garantit une fluidité parfaite :

  • Étape 1 : Sur le conteneur qui défile, appliquez une perspective (ex: perspective: 1px;).
  • Étape 2 : Sur l’élément contenant le background-image, « poussez-le » en arrière dans l’espace 3D et agrandissez-le pour compenser (ex: transform: translateZ(-1px) scale(2);).
  • Étape 3 : Ajoutez will-change: transform; pour indiquer au navigateur d’optimiser cet élément pour l’animation.
  • Étape 4 : Il est sage de désactiver cet effet sur les appareils tactiles où le défilement est différent, en l’encadrant dans une media query @media (hover: hover) { ... }.

Cette capacité à créer des effets de mouvement nous amène à une autre révélation : parfois, la meilleure image de fond… n’est pas une image du tout.

Vos fonds n’ont pas besoin d’être des images : la puissance des dégradés CSS

L’un des plus grands secrets de background-image est qu’il n’accepte pas seulement des URL d’images. Il peut aussi générer des images directement via les fonctions de dégradé CSS : linear-gradient(), radial-gradient(), et le plus puissant, conic-gradient(). Ce sont des images procédurales, générées à la volée par le navigateur. Leur avantage est colossal : elles ne pèsent absolument rien (zéro octet), s’adaptent parfaitement à n’importe quelle taille de conteneur sans pixellisation, et sont entièrement contrôlables via des variables CSS.

Oubliez les fichiers JPEG de 20 Ko pour un simple fond dégradé. Deux lignes de CSS suffisent. Mais leur puissance va bien au-delà. En jouant avec les « color stops » (les points de couleur), on peut créer des lignes nettes, des rayures, des damiers, et une infinité de motifs géométriques. Ces « fausses » images peuvent ensuite être combinées entre elles ou avec de vraies images grâce à la technique des arrière-plans multiples. Vous pouvez ainsi créer des textures et des motifs complexes sans charger le moindre fichier externe, allégeant considérablement le poids de vos pages.

Collection de motifs géométriques créés uniquement avec des dégradés CSS coniques et radiaux

Le conic-gradient(), en particulier, est une révolution pour la datavisualisation, permettant de créer des graphiques circulaires de type « camembert » sans JavaScript ni SVG.

Étude de cas : Camembert 100% CSS

La fonction conic-gradient() permet de créer des graphiques circulaires dynamiques. Par exemple, le code background-image: conic-gradient(red 36deg, orange 36deg 180deg, yellow 180deg); génère un camembert avec une part rouge de 10% (36°), une part orange de 40% (de 36° à 180°) et une part jaune pour les 50% restants. Les valeurs en degrés peuvent être pilotées par des variables CSS, rendant le graphique entièrement dynamique. Attention cependant : ces graphiques purement visuels ne sont pas accessibles aux lecteurs d’écran. Ils doivent impérativement être accompagnés d’une alternative textuelle ou d’un tableau de données pour être conformes au RGAA.

Malgré toute cette puissance, il est essentiel de ne jamais oublier la sémantique. Quand une image est vraiment du contenu, CSS ne peut remplacer la structure HTML adéquate.

`<figure>` et `<figcaption>` : le duo sémantique qui simplifie la gestion de vos images

Lorsque notre arbitrage nous a conduits à choisir la balise <img> pour une image de contenu, notre travail sémantique n’est pas terminé. Souvent, une image est accompagnée d’une légende qui apporte un contexte ou un crédit. Le réflexe est parfois de placer cette légende dans une simple balise <p> ou <span> sous l’image. C’est une erreur sémantique.

HTML5 a introduit le couple de balises parfait pour ce cas de figure : <figure> et <figcaption>. La balise <figure> agit comme un conteneur pour un contenu autonome (une image, un diagramme, un bloc de code, une vidéo…) qui illustre le propos principal mais pourrait être déplacé ailleurs dans la page sans en casser le sens. La balise <figcaption>, placée à l’intérieur de <figure>, fournit la légende associée à ce contenu. Ce duo crée un lien sémantique indissociable entre l’image et sa description.

Ce lien est crucial pour deux raisons. Premièrement, pour l’accessibilité : les lecteurs d’écran peuvent annoncer la légende en association directe avec l’image, offrant un contexte riche aux utilisateurs malvoyants. Deuxièmement, pour le SEO : les moteurs de recherche comme Google comprennent cette relation sémantique et utilisent le contenu de la <figcaption> pour mieux comprendre et indexer l’image. C’est un signal de pertinence fort. Comme le souligne un expert français reconnu :

Les balises <figure> et <figcaption> sont cruciales pour le SEO et l’accessibilité RGAA, background-image échouerait lamentablement dans ce rôle

– Benjamin Thiers, Expert SEO et accessibilité web

Maintenant que la sémantique et la composition sont maîtrisées, penchons-nous sur la finition, là où CSS peut encore sublimer nos images, qu’elles soient en <img> ou en background-image.

`drop-shadow` vs `box-shadow` : l’ombre parfaite pour vos images transparentes

Ajouter une ombre est un moyen classique de donner du relief à un élément. La propriété que tout le monde connaît est box-shadow. Elle est efficace, performante et universellement compatible. Cependant, elle a une limite majeure : elle projette une ombre basée sur la « boîte » de l’élément, c’est-à-dire sa forme rectangulaire, ignorant totalement la transparence. Si vous appliquez une box-shadow à une image PNG avec un personnage détouré, vous obtiendrez une ombre rectangulaire décevante.

C’est là qu’intervient drop-shadow(), une fonction de la propriété filter. Contrairement à box-shadow, drop-shadow analyse le contenu de l’élément, pixel par pixel. Elle projette une ombre qui épouse parfaitement les contours des parties opaques de l’image. Pour un PNG détouré, le résultat est spectaculaire et bien plus réaliste. La syntaxe est quasi identique à celle de box-shadow, ce qui la rend facile à adopter.

Le choix entre les deux dépend donc entièrement de la nature de votre image. Pour un élément rectangulaire classique, box-shadow reste le meilleur choix car il est légèrement plus performant. Pour une image avec des contours complexes ou de la transparence (logo, icône, personnage…), drop-shadow est la seule option pour un résultat professionnel. La documentation de référence sur `drop-shadow()` détaille bien cette nuance.

Comparaison drop-shadow vs box-shadow pour les images
Propriété drop-shadow box-shadow
Respect des contours Suit la forme exacte du PNG Rectangle uniquement
Performance Plus coûteux (filter) Plus léger
Compatibilité Moderne (95%+) Universelle
Animation GPU accelerated CPU bound

Petite astuce : nativement, on ne peut pas appliquer un filter sur un background-image. La parade consiste à appliquer le background-image sur un pseudo-élément (::before ou ::after) positionné derrière son parent, et d’appliquer le filter: drop-shadow() sur ce pseudo-élément. C’est une technique avancée mais redoutablement efficace.

Cette capacité à manipuler les pixels nous ouvre la porte à un monde de possibilités graphiques qui étaient autrefois l’apanage exclusif des logiciels de retouche d’image.

À retenir

  • Le choix entre <img> et background-image est un arbitrage stratégique entre sémantique, performance (LCP) et flexibilité du design.
  • background-image est un moteur de composition : il permet de superposer calques, dégradés et motifs sans alourdir le DOM HTML.
  • Des techniques avancées comme drop-shadow et les filtres CSS permettent d’obtenir des effets graphiques complexes qui étaient auparavant réservés à des logiciels comme Photoshop.

Photoshop est dans votre CSS : la révolution des filtres graphiques

La propriété filter ne se limite pas à la fonction drop-shadow(). Elle ouvre une véritable boîte à outils de retouche d’image directement dans votre CSS, vous permettant d’appliquer en temps réel des effets qui nécessitaient autrefois de multiples versions d’une même image. Vous pouvez ajuster la luminosité (brightness()), le contraste (contrast()), la saturation (saturate()), appliquer un flou gaussien (blur()) ou passer une image en noir et blanc (grayscale()).

Ces filtres peuvent être combinés en les listant les uns après les autres, et leurs valeurs peuvent être animées au survol pour créer des interactions riches et élégantes. Imaginez une galerie de photos qui se saturent de couleurs et deviennent nettes au passage de la souris. Tout cela est possible avec quelques lignes de CSS, sans le moindre JavaScript. C’est une aubaine pour la performance et la maintenabilité : une seule image est chargée, et ses variations sont gérées par le navigateur.

Mais la véritable révolution est peut-être la propriété backdrop-filter. Elle applique les mêmes effets de filtre, non pas à l’élément lui-même, mais à ce qui se trouve derrière lui. C’est la technique reine pour créer l’effet de « verre dépoli » ou « glassmorphism », très en vogue dans les interfaces modernes. Il suffit de rendre un élément (comme un en-tête de page) semi-transparent et de lui appliquer un backdrop-filter: blur(10px);. Le contenu qui défile en dessous apparaîtra flouté à travers l’en-tête.

Étude de cas : Effet Glassmorphism avec `backdrop-filter`

Pour créer un effet de verre dépoli moderne sur un header qui reste fixe en haut de page, on peut utiliser le code suivant : `header { background-color: rgba(255, 255, 255, 0.5); backdrop-filter: blur(10px) saturate(180%); }`. L’arrière-plan semi-transparent laisse entrevoir le contenu qui défile en dessous, tandis que le `backdrop-filter` le floute et en rehausse les couleurs. C’est une technique très efficace pour créer une hiérarchie visuelle sans masquer complètement le contenu. Il faut cependant prévoir des solutions de repli (`fallback`) car cette propriété n’est pas encore supportée par tous les navigateurs plus anciens.

Pour maîtriser pleinement ces outils, il est essentiel de revoir l'éventail des possibilités offertes par les filtres graphiques CSS.

En conclusion, arrêter de voir background-image comme une simple alternative décorative est la première étape pour débloquer un potentiel de design et d’optimisation immense. En le considérant comme un système de composition à part entière, vous pouvez construire des interfaces plus légères, plus dynamiques et plus sophistiquées, tout en faisant des choix plus éclairés et stratégiques pour chaque image de votre projet. Pour aller plus loin, l’étape suivante consiste à intégrer systématiquement cette réflexion dans votre processus de développement, en réalisant un arbitrage conscient pour chaque ressource visuelle.

Rédigé par Marc Lambert, Marc Lambert est un ingénieur en performance web avec 12 ans d'expérience, obsédé par l'optimisation du "render path" des navigateurs. Son expertise se concentre sur la manière de structurer et de livrer le CSS pour obtenir des temps de chargement quasi instantanés.