Bonjour,

Voici un tutoriel très simple pour apprendre le fonctionnement des overlay en HTML et CSS uniquement.

En effet, qui n’a jamais eu envie de superposer rapidement un texte sur une image ? Puis de le modifier au passage de la souris où même d’afficher une image alternative ?

Le code fourni dans cet article peut s’appliquer à n’importe quel site. Il suffit d’intégrer le code HTML sur une page et le code CSS dans votre fichier de style.

On trouve différentes façons de la faire sur le net, mais j’ai voulu synthétiser tout ce que j’ai trouvé pour en extraire une solution minimale, et surtout propre.

Présentation de l’overlay sur une image

Un overlay, c’est simplement la superposition d’une couche sur une autre, par exemple deux divs. Mais en HTML, cela implique que la couche supérieure doit sortir du flux, car sinon elle ne peut pas recouvrir l’autre.

Remarque : On peut bien sûr écrire un texte dans un div avec une image de fond, et même changer l’image de fond au survol, mais le but de cet article est de superposer un élément quelconque sur un autre élément quelconque, ici un div avec un élément image (balise img).

Superposition simple de texte sur une image

Superposition avec changement du texte au survol

Superposition avec changement texte et image au survol

Code HTML : contenus originaux et « overlay »

La structure des contenus

Le conteneur de classe .overlay-image encapsule toute la structure nécessaire :

  • image originale,
  • bloc texte original,
  • bloc image/texte affiché au passage de la souris (« hover »).

Sur une page écrite sans constructeur (page HTML ou thème WordPress simple), comme par exemple cet article, il est indispensable de le définir afin d’intégrer contenu original et overlay proprement au sein de la page.

Avec un constructeur, il peut être remplacé par un bloc conteneur (par exemple avec DIvi cela peut être le module « code », auquel on ajoute simplement la classe overlay-image).

Le code

/* Superposition simple */
<div class="overlay-image"><a href="URL_LIEN">
  <img class="image" src="IMAGE" alt="Alt text" />
  <div class="text">Image + texte
    PAS DE HOVER</div>
</a></div>
/* Superposition et changement background et texte au survol */
<div class="overlay-image"><a href="URL_LIEN">
 <img class="image" src="IMAGE" alt="Alt text" />
 <div class="normal">
  <div class="text">Image + texte
   NORMAL</div>
 </div>
 <div class="hover">
  <div class="text">Background + texte
   HOVER</div>
 </div>
</a></div>
/* Superposition et changement image et texte au survol */
<div class="overlay-image"><a href="URL_LIEN">
 <img class="image" src="IMAGE_ORIGINALE" alt="Alt text" />
 <div class="normal">
  <div class="text">Image + texte
   NORMAL</div>
 </div>
 <div class="hover">
  <img class="image" src="IMAGE_OVERLAY" alt="Alt text hover" />
  <div class="text">Image + texte
   HOVER</div>
 </div>
</a></div>

Code CSS : apparition de l’overlay sur le « hover »

Le code ci-dessous est à intégrer dans la définition de vos styles :

  • fichier style.css inclus par votre fichier HTML si vous travaillez en HTML directement,
  • fichier style.css de votre thème enfant si vous travaillez avec WordPress,
  • ou encore dans les options d’une page Divi si le mécanisme n’est utilisé qu’à un endroit précis.

Affichage de l’overlay texte original

La classe .overlay-image permet de paramétrer le conteneur global dans le cas d’une page sans constructeur. Par exemple dans cet article j’ai remplacé le « width: 100%; » par « width: 80% margin: auto; ».

Remarque importante : Le conteneur .image-overlay DOIT être « positioné » en relatif afin de pouvoir positionner à leur tour les éléments qu’il contient.

Image et texte originaux sont définis par .overlay-image .image et .overlay-image .text :

  • l’image prend toute la place disponible,
  • le texte est centré sur l’image en utilisant un « positionnement » absolu sur le block conteneur et une translation (un classique).

Affichage du nouvel overlay au survol de la souris

L’overlay est matérialisé par .overlay-image .hover, « positionné » en absolu pour occuper toute la surface du conteneur comprenant image et texte originaux (largeur et hauteur à 100%).

Lors du passage de la souris, son opacité passe de 0 à 1 avec une transition douce afin de le faire apparaître par-dessus le div original.

Pour une superposition au survol de texte uniquement (donc sans image), il faut au préalable masquer le texte original car la nouvelle image n’est pas là pour le faire.

Le code

J’ai essayé de factoriser le code pour le rendre simple, lisible, compact et facilement réutilisable. Pour ce faire, je l’ai divisé en trois parties que vous pouvez choisir en fonction de vos besoins.

La première partie est commune aux trois types de superpositions et c’est la seule nécessaire pour une simple superposition de texte (sans changement au survol) :

/********* Superposition simple de texte sur une image *******/

/* Conteneur principal */
.overlay-image {
 position: relative;
 width: 100%;
}

/* Image originale */
.overlay-image .image {
 display: block;
 width: 100%;
 height: auto;
}

/* Texte original */
.overlay-image .text {
 color: #fff;
 font-size: 30px;
 line-height: 1.5em;
 text-shadow: 2px 2px 2px #000;
 text-align: center;
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, -50%);
 width: 100%;
}

Cette partie est nécessaire pour les deux hover :

/********* Hover image et texte *******/

/* Overlay */
.overlay-image .hover {
 position: absolute;
 top: 0;
 height: 100%;
 width: 100%;
 opacity: 0;
 transition: .5s ease;
}

/* Apparition overlay sur passage souris */
.overlay-image:hover .hover {
 opacity: 1;
}

La dernière est uniquement destinée au changement de texte au survol :

/********* Hover background et texte uniquement *******/

.overlay-image .normal {
 transition: .5s ease;
}
.overlay-image:hover .normal {
 opacity: 0;
}
.overlay-image .hover {
 background-color: rgba(0,0,0,0.5);
}

Conclusion

Comme vous pouvez le constater, la superposition n’est pas très difficile techniquement… C’est donc dommage que le mécansme ne soit pas intégré dans tous les thèmes WordPress du marché !

28 commentaires

  • Bonjour,
    Il semblerait que les :hover de cette page ne fonctionnent pas sous Firefox. Pouvez-vous me le confirmer ?
    Merci

    • Oups, oui je confirme, j’avais introduit un conflit avec une autre feuille de style lors de la refonte du site.
      C’est corrigé, merci pour le retour 🙂

  • Bonjour
    J’ai bien intégré les codes HTML et CSS cependant le HOVER opacité ne fonctionne pas …
    Sauriez vous pourquoi ?
    Merci d’avance

    • Bonjour Sophie,
      Malheureusement sans accès à votre code je ne peux pas vous aider 😉

  • Bonjour,

    merci pour votre code, il m'est d'une aide précieuse, pourriez-vous me dire s'il existe une façon que le display soit inline sans que tout le système bug.

    je vous remercie.

    • Hello,
      Désolé mais je ne comprends pas bien la question. De quel display parlez-vous ?

  • Bonjour et merci pour ce super tuto.

    J'ai un gros problème (tout débutant que je suis), j'ai réussi a faire la version hoover image + texte mais je souhaite ajouter un bouton transparent avec bords en blanc, aligné center center (avec le texte en dessous du bouton). Je n'arrive pas du tout à intégrer de bouton 🙁

    Peux-tu m'aider ? C'est la loose lol :(((

    un grand merci à toi !

    Stef

    • Salut Stef,
      Il suffit d'ajouter le bouton juste avant le texte dans le div affiché au survol :
      <a class="overlay-button" href="URL_LIEN">Bouton</a><br><br>
      Avec le CSS suivant :
      .overlay-button { display: inline-block; color: #fff; border: solid 1px #fff; padding: 6px 12px }

  • C'est hyper intéressant merci !
    Je bidouille "divi" avec juste mes méninges pour essayer de réaliser des petites réalisations supplémentaires sur DIVI.

    J'ai juste une petite question. Cette logique serait adaptable pour l'affichage de présentation de la page blog (affichage du titre de l'article au survol de l'image , j'ai déjà réussi à supprimer l'aperçu) ?

    Merci à toi d'expliquer ces petites choses hyper utiles (et comme toi, quand je vois ce que DIVI propose, je suis hyper étonné de pas voir ce genre de truc en natif…)

    • Salut Thomas et merci pour ton message !
      Oui bien sûr on peut adapter le code pour les vignettes du blog, et c'est encore plus simple, il n'y a que du CSS, mais ça dépend beaucoup de l'affichage désiré.
      Par exemple, pour afficher le titre au survol sur l'image (avec déplacement du titre sur la photo) :
      .blog h2.entry-title {
      position: absolute;
      top: 0;
      left: 0;
      padding: 20px; /* pour pas coller aux bords */
      opacity: 0;
      }
      .blog article:hover h2.entry-title {
      opacity: 1;
      }
      Quelque chose comme ça 😉

  • bonjour et merci pour ce tuto. Il m'a permis de comprendre l'attribut "hover". Par contre, peut etre pourrez vous m'aider…. Ca fonctionne tres bien au survol de la souris mais plus rien sur ecran tactile. Y a t'il une alternative ?

    • Bonjour Sandrine et merci pour ton message !
      Malheureusement, le "hover" n'est pas du tout adapté aux écrans tactiles…
      On peut en CSS le transformer en "on-click", donc en bouton normal, mais je trouve que ce n'est pas très ergonomique.
      Perso, pour faire vraiment responsive tout en restant 100% accessible et ergonomique, je fais désormais sans hover 😉

  • Désormais divi intégre la fonction de hover dans ses paramètres. Mais je cherche à ajouter du texte en surbrillance sur une photo produit woocommerce. Pourriez-vous m'aider ? J'ai touvé pour mettre un texte en overlay sur toutes les images, mais je voudrais mettre un texte différent par image.

    • Bonjour Karen,
      Je ne sais pas quelle technique vous avez utilisé pour toutes les images, mais a priori ça peut être fait en CSS si le texte est statique (par exemple un ::after avec un content: "le texte").
      Si c'est le cas, pour adapter le texte à chaque image, vous pouvez utiliser le même procédé en ciblant spécifiquement chaque image avec un sélecteur CSS plus précis (à trouver en examinant les classes et id des images).
      Si le texte est dynamique (par exemple il correspond au titre de l'image, à la légende ou à la description), alors c'est plus complexe, il faut modifier woocommerce. Pour cela, cherchez du côté des hooks woocommerce pour voir si on peut filtrer le code source des images pour lui ajouter un overlay.

  • La solution que je cherchais depuis des lustres ! Merci, c'est parfaitement adaptable et personnalisable. Bravo.

  • Bonjour et tout d'abord un grand merci pour ce tuto extrêmement bien expliqué !
    J'ai pu arriver facilement au résultat escompté. J'ai une petite question concernant l'opacité du texte, savez-vous s'il est possible de gérer celle du texte indépendamment de celle du bloc conteneur ? (afin que le texte ne soit pas légèrement transparent)

    • Salut Nicolas,
      Pouvez-vous me décrire exactement ce que vous voulez faire ? De quel type de hover parlez-vous ?

  • Bonjour,

    Je suis tombée sur votre poste et j'avoue être impressionnée par le résultat donné puisque c'est tout à fait ce dont j'ai besoin pour mon blog. Je souhaiterai ajouter un texte à une photo de profile sur canalblog.com, selon vous comment je peux faire pour utiliser le code Html et celui en CSS3 afin d'incruster le texte sur l'image apparaissant au survol de la souris ? (Je peux modifier directement le code Html de la page source dans l'édition du message concerné, c'est la seul piste à ma disposition seulement étant plus que débutante dans le domaine je ne parviens pas à mes fins)

    Merci pour votre réponse

    • Bonjour Laura,

      Je ne connais pas le fonctionnement de canalblog.com.
      Vous n'avez pas une option pour insérer du CSS ?

      Sinon, il est aussi possible de l'intégrer directement au HTML :

      <style type="text/css">

      /* Le CSS ici */

      </style>

      A voir si canalblog l'accepte ou le filtre…

  • Merci pour ce tuto qui m'a été très utile.

  • Bonjour, merci pour ce tuto.
    J'aimerais avoir plus de précision sur comment mettre une couleur transparente sur une image au survol de la souris sans changer quoi que ça soit (ni image ni texte) comme sur le site de France 24 où on a une bleue turquoise transparente quand on met la souris sur un article.
    Merci d'avance.

    • Salut,
      Pour ce type d'overlay c'est un peu plus simple, il faut juste un div contenant l'image, auquel on ajoute un pseudo-élément after :

      HTML :
      <div class="image-container"><img …….></div>

      CSS :
      .image-container {
      position: relative;
      }
      .image-container::after {
      content: "";
      display: block;
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background-color: rgba(0,0,255,0.2);
      opacity: 0;
      transition: opacity 0.3s;
      }
      .image-container:hover::after {
      opacity: 1;
      }

  • Bonjour,
    Tout d’abord, grand merci pour ce tuto qui peut apporter pour des personnes qui débutent (dont c’est mon cas) un appui précieux.
    J’ai tenté sans succès d’utiliser la méthode avec le module bascule Divi (partie feuille de style et ajout module code).
    Le besoin : au survol de l’élément bascule , affichage d’une image (dans l’esprit de la représentation de la page : « https://4rsmokehouse.com/catering/ »).
    Pourriez-vous m’aiguiller par quelques conseils ou lectures utiles.
    En vous remerciant par avance pour votre soutien précieux.
    Excellent WE.

    • Bonjour Franck,
      Effectivement le problème est un peu complexe car il faut modifier le code généré pour le module (a priori il faut ajouter un div overlay avec image et titre de la bascule sur le .et_pb_toggle, et jouer avec l’opacité au survol pour le fondu).
      Sinon, si le fondu n’est pas important, on peut aussi simplement afficher en CSS une image de fond pour chaque titre de bascule au survol de la souris, et changer la couleur du titre :
      .et_pb_accordion .et_pb_toggle_close:hover {
      background-image: url(‘CHEMIN_IMAGE’);
      }
      .et_pb_accordion .et_pb_toggle_close:hover .et_pb_toggle_title {
      color: #fff;
      }
      C’est moins propre, mais malheureusement la propriété « transition » ne fonctionne pas pour l’image de fond.

  • de boissieu Agnès

    Bonjour,
    Je débute en Divi aussi difficile de savoir où caser tout ça. Pourriez-vous svp me préciser quoi mettre où?
    Merci

    • Bonjour Agnès,

      Désolé si ce n’est pas clair, mais l’article explique brièvement les différentes façons d’utiliser les codes fournis.

      En gros, sur une page écrite sans le constructeur de page (Divi builder), donc un article de blog ou une page statique avec l’éditeur natif WordPress, il faut insérer le code HTML via l’onglet « Texte » de l’éditeur à l’endroit voulu dans le contenu de la page. Et sur une page construite avec le builder, on peut insérer le code HTML soit dans un module « Code », le plus logique, soit dans tout autre module qui propose l’éditeur HTML, et dans ce cas, toujours dans l’onglet « Texte ».
      Comme je l’explique, l’insertion du code dans l’éditeur natif n’est pas très pratique, donc commence plutôt avec un module Divi Code, tu te prendras moins la tête.

      J’ai fourni deux exemples de code dans le bloc HTML : le premier avec un overlay texte uniquement, le second avec l’image qui change en plus.

      Tu peux coller le code CSS dans les options générales de Divi, tout en bas : « Custom CSS » ou « Personnaliser Divi », ou bien le coller dans le fichier style.css de ton thème enfant si tu en utilises un (ou le fichier équivalent contenant la définition des styles), et dans ce cas le code sera appliqué à tout le site, donc utilisable sur toutes les pages.
      Tu peux aussi le coller dans les options du builder de la page où tu veux insérer l’overlay, ainsi il ne sera chargé que pour cette page, ce qui est plus optimal.

      Bon courage !

Laissez votre commentaire