Hugo Colicchia Designer UI · Intégrateur Web

Recherche stage - janvier et février 2027

Shop

Une fiche produit complète à intégrer : fil d'Ariane, galerie à vignettes, bloc d'achat, produits associés. C'est le projet où j'ai le plus poussé la contrainte « sans JavaScript », jusqu'à obtenir en CSS seul un comportement que la maquette laissait supposer scripté.

Rôle
Intégration HTML et CSS, accessibilité
Livrable
1 fiche produit, 377 lignes de CSS en 4 fichiers
Outils
Figma, Visual Studio Code
Contexte
Projet de formation - Objectif 3W, juillet 2026
Les visuels de la fiche produit : les Air Pods en grand, et à droite le casque, l'enceinte et la montre proposés en produits associés.

Le brief

Intégrer une fiche produit d'e-commerce à partir d'une maquette : une paire d'écouteurs sans fil à 179 €, avec sa galerie, sa description, son bloc d'achat et trois produits associés en bas de page.

La fiche produit est l'écran le plus exigeant d'un site marchand. C'est le point où quelqu'un décide de dépenser de l'argent : chaque élément doit être là où on l'attend, et rien ne doit se mettre en travers du bouton d'achat.

La question que je me suis posée : jusqu'où peut-on aller sans JavaScript sur un écran dont on attend qu'il réagisse ?

Cible et contexte d'usage

Deux profils arrivent sur une fiche produit, et ils ne font pas le même geste. Celui qui sait déjà ce qu'il veut cherche le prix et le bouton, dans cet ordre, et rien d'autre. Celui qui hésite regarde les photos, lit la description, puis va voir les produits associés - souvent sans jamais revenir.

La maquette répond aux deux : le prix est le deuxième élément lu, juste sous le nom, et les produits associés sont relégués sous un filet de séparation. Mon travail a été de tenir cette hiérarchie à toutes les largeurs d'écran, y compris quand la colonne d'images passe au-dessus du bloc d'achat.

Comme sur le projet précédent, je n'ai mené ni entretien ni test : la maquette était fournie. Ce que je décris est une analyse de sa logique, pas une recherche terrain.

Lecture de la maquette

Cette maquette est monochrome. Pas un seul accent coloré : du noir, trois gris et un beige très pâle pour les filets. Toute la hiérarchie repose donc sur la taille, la graisse et l'espace.

Ce que la maquette fixe

  • Montserrat en famille unique, avec des capitales espacées sur le bouton d'achat et le fil d'Ariane. C'est le seul traitement qui distingue les libellés d'action du texte courant.
  • Un unique bouton plein, noir, qui est le seul élément massif de la page. Aucun autre bloc n'est en aplat : impossible de le rater.
  • Une galerie à quatre images : une grande et trois vignettes alignées dessous.
  • Un filet horizontal qui sépare la fiche des produits associés. C'est la seule marque de rupture entre « le produit que vous regardez » et « autre chose ».

Ce qu'elle ne dit pas

  • Le champ de quantité est dessiné à côté du bouton, mais rien n'indique s'il est toujours visible ou s'il apparaît. Une quantité affichée en permanence ajoute une décision à prendre avant même d'avoir voulu acheter.
  • Aucun état de survol, de focus ou de sélection sur les vignettes de la galerie.
  • Rien sur l'ordre des blocs en mobile : faut-il montrer les images d'abord, ou le prix ?

Structure et découpage

La fiche est un article qui contient deux colonnes : la galerie et les informations produit. Le fil d'Ariane est une nav avec une liste ordonnée, et son dernier élément porte aria-current="page" - il n'est volontairement pas un lien, puisqu'il désigne la page courante.

Les produits associés forment une section à part, avec son propre titre. Chaque produit est une carte entièrement cliquable, un seul lien par carte : le nom, l'image et le prix sont à l'intérieur du lien plutôt que d'être trois liens concurrents vers la même destination.

Comme sur Japan., le CSS est réparti en quatre fichiers chargés dans un ordre choisi, et toutes les couleurs sont regroupées dans color.css avec un commentaire par variable indiquant où elle sert.

Schéma du découpage de la fiche produit : fil d'Ariane, article à deux colonnes, filet de séparation, section des produits associés.
Le découpage. En dessous de 1199 pixels, les deux colonnes de l'article passent l'une sous l'autre - la galerie d'abord, le bloc d'achat ensuite, pour garder l'ordre de lecture de la maquette.

Direction artistique

Une palette entièrement neutre, six valeurs, aucun accent. C'est le genre de contrainte qui oblige à travailler la hiérarchie autrement que par la couleur, et c'est ce qui rend le projet intéressant.

Palette

  • Noir

    #000000

    Nom du produit, prix, titres

  • Charbon

    #222222

    Logo, bouton d'achat, pied de page

  • Gris

    #888888

    Liens de navigation

  • Lin

    #E3DDDD

    Filets et bordures de champ

  • Blanc

    #FFFFFF

    Fond de page et texte sur aplat sombre

Typographie

Titres
Montserrat en graisse forte pour le nom du produit et le prix. Le prix est presque aussi gros que le nom : c'est l'information qu'on vient chercher.
Texte courant
Montserrat en capitales, avec un interlettrage élargi, pour le bouton et le fil d'Ariane. Une seule famille sur toute la page.

Iconographie

Aucun pictogramme sur cette page, et c'est volontaire : la maquette n'en propose pas, et une fiche produit à cinq libellés n'en a pas besoin. Les trois traits du menu en petit écran sont dessinés en CSS, pas importés en image.

Le résultat

Fiche produit en largeur bureau : galerie à gauche, nom, prix, description et bouton d'achat à droite.
La fiche en largeur bureau. Le prix arrive avant la description, séparé d'elle par un filet : quelqu'un qui sait déjà ce qu'il veut n'a pas à lire un paragraphe pour le trouver.
Le bloc d'achat après activation du bouton : le champ de quantité est apparu à droite du bouton.
Le champ de quantité apparaît quand le bouton reçoit le focus, et disparaît quand on quitte le bloc. La règle tient en une ligne : .cart-form:focus-within .qty-field.
La fiche produit en largeur mobile, côte à côte : à gauche le menu fermé, à droite le menu ouvert avec ses quatre entrées.
En mobile, les deux états du menu. La fiche passe sur une seule colonne, galerie d'abord et bloc d'achat ensuite : l'ordre de lecture de la maquette est conservé. Plus bas, les trois produits associés s'empilent plutôt que de se réduire - à 512 pixels, trois cartes côte à côte rendraient les photos illisibles.

Choix techniques justifiés

La quantité révélée par :focus-within

Le champ n'existe visuellement qu'à partir du moment où l'utilisateur s'intéresse au bloc d'achat. Il reste dans le HTML, donc atteignable au clavier et lisible par un lecteur d'écran - je masque un affichage, pas une fonctionnalité. C'est la différence entre visibility et une suppression pure et simple.

Un seul lien par carte produit

L'image, le nom et le prix sont à l'intérieur du même lien. Trois liens vers la même page auraient forcé un utilisateur au clavier ou au lecteur d'écran à passer trois fois sur chaque carte pour la traverser.

Le fil d'Ariane porte aria-current

Le dernier élément n'est pas un lien : il désigne la page où l'on se trouve déjà. Il porte aria-current="page", ce qui annonce la position réelle plutôt que de proposer un déplacement qui ne mène nulle part.

Le mouvement réduit traité dans les deux sens

Les transitions ne sont déclarées que si le système n'a pas demandé de mouvement réduit, et un second bloc les neutralise dans le cas contraire. C'est une ceinture et des bretelles, mais sur une page marchande, une animation qui persiste malgré le réglage système est une gêne réelle.

Bilan

Ce que j'ai appris

  • Masquer un élément et le supprimer ne sont pas la même chose. C'est sur ce projet que j'ai compris la différence entre un affichage qu'on retire et un contenu qu'on rend inaccessible.
  • Une palette sans accent oblige à faire porter la hiérarchie par la taille et l'espace. C'est plus difficile, et le résultat vieillit mieux.
  • Regrouper l'image, le nom et le prix dans un seul lien paraît anodin et change complètement le parcours au clavier. Je l'ai vérifié en traversant la page uniquement à la tabulation.

Axes d'amélioration

  • Les vignettes de la galerie ne changent pas l'image principale : sans JavaScript, il aurait fallu passer par des cases à cocher et des sélecteurs frères, ce que je n'avais pas encore en main.
  • Le champ de quantité disparaît dès que le focus quitte le bloc. Quelqu'un qui va lire la description et revient doit le faire réapparaître. Un affichage qui reste après la première activation serait plus juste.
  • Le texte de description est resté en texte de remplissage. Sur une fiche produit, c'est précisément le contenu qui décide de l'achat.
  • Les points de rupture sont écrits en max-width, comme sur le projet précédent, et il n'y en a que deux. Un palier intermédiaire manque entre 512 et 1199 pixels.

Si je reprenais ce projet en conception

Il manque à cette fiche tout ce qui rassure avant un achat : les délais de livraison, la politique de retour, la disponibilité. Trois lignes sous le bouton suffiraient et elles pèsent souvent plus lourd qu'un paragraphe de description.

Je repenserais aussi le champ de quantité. Le révéler évite d'encombrer, mais un sélecteur de quantité qui apparaît puis disparaît est un comportement inhabituel : je testerais d'abord une quantité affichée en permanence, en tout petit, avant de conclure.