Info bulle non destructive

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 502 fois - Téléchargée 17 fois

Contenu du snippet

Bonjour,

Un petit code source permettant de faire des infos bulles personnalisés. Jusque là rien d'extraordinaire :).
Petites particularitées :
- ce code utilise getElementsByClassName pour savoir où agir (simplifie l'implantation)
- ce code est non intrusif (si javascript est à off, le site reste totalement explotable et les informations au survol de la souris restent accessible) il respecte donc l'accessibilité.
- pas de vilain onmouseover/onmouseout dans votre code HTML.
- l'info bulle suit la souris dans la zone réactive.

Source / Exemple :


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

  <head>
    <title>Infos Bulle</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="generator" content="SCiTe" />
    <meta name="author" content="McPeter" />
    <style type="text/css">
    /* <![CDATA[ */
    #infoBull{
      position:absolute; z-index:100;
      padding:4px 10px;
      max-width:20em;
      border:2px groove silver;
      background-color:#FFFFCC;
      border:1px outset #D2D2D2;
    }
      .hide{ display:none; }
      .view{ display:block; }
      .viewBull{
        width:30em;
        border:1px solid black;
        cursor:help;
      }
    /* ]]> */
    </style>

    <script type="text/javascript">
    /* <![CDATA[ */

    var messag = new Array;
    var infoBull;

    // Pour IE qui capte jamais rien ...
    if (!document.getElementsByClassName){
      document.getElementsByClassName = function (cl) {
        var retnode = [];
        var myclass = new RegExp ('\\b'+cl+'\\b');
        var elem = this.getElementsByTagName ('*');
        for (var i = 0; i < elem.length; i++) {
          var classes = elem[i].className;
          if (myclass.test (classes)) retnode.push (elem[i]);
        }
        return retnode;
      }
    }

    // Identifie tous les élements devant afficher une infobulle via un nom de class (ici : viewBull)
    function catchBull(){
      var bullElement = document.getElementsByClassName ('viewBull');
      var bullElementNum = bullElement.length;
      for (var i=0; i<bullElementNum; i++) {
        // récupère le contenu de l'attribut title
        messag[i] = bullElement[i].getAttribute ('title')
        bullElement[i].removeAttribute ('title');
        bullElement[i].onmouseover = thisBullView (i,'view');
        bullElement[i].onmouseout = thisBullView (i,'hide');
      }
    }

    // Affiche ou cache la Bulle
    function thisBullView (i, show){
      return function(){
        infoBull.innerHTML=messag[i];
        infoBull.className=show;
      }
    }

    // Détection de la souris et positionnement de la Bulle
    function move(e){
      if(infoBull.className=='view') {  
        if (navigator.appName!="Microsoft Internet Explorer") {
          infoBull.style.left=e.pageX+5+'px';
          infoBull.style.top=e.pageY+10+'px';
        }else{
          if(document.documentElement.clientWidth>0){
            infoBull.style.left=20+event.x+document.documentElement.scrollLeft+'px';
            infoBull.style.top=10+event.y+document.documentElement.scrollTop+'px';
          } else {
            infoBull.style.left=20+event.x+document.body.scrollLeft+'px';
            infoBull.style.top=10+event.y+document.body.scrollTop+'px';
          }
        }
      }
    }

    // Chargement du script
    window.onload=function(){
      infoBull = document.getElementById('infoBull');
      catchBull();
      document.onmousemove=move;
    }
    /* ]]> */
    </script>

  </head>

  <body>

    <h1>Bulle d'aide sur className <small>(IE7-8 / FF)</small></h1>

    <h2>JavaScript non intrusif !</h2>

    <p>
      - Bulle d'aide personnalisée utilisant l'attribut "title".<br />
      - La bulle d'aide suit la souris sur les zones réactives.
    </p>

    <p class="viewBull" title="texte zone 1">
      zone 1<br />
    </p>

    <p class="viewBull" title="texte zone 3">
      zone 3
    </p>

    <p class="viewBull" title="texte zone 6">
      zone 6<br />
      <br />
      <br />
    </p>

    <p class="viewBull" title="texte zone 2">
      zone 2
    </p>

    <p class="viewBull" title="texte zone 4">
      zone 4<br />
      <br />
    </p>

    <div class="viewBull" title="Il peut être parfois utile de récupérer un élément DOM par le nom de sa classe CSS. Nativement, la méthode getElementsByClassName n'est pas implémentée. Quel dommage...">
      <p>
        blablabalbalblabab bl balbbalball blb lalabl bababl ab alb aal bl abalblbablb lbalb <br />
        bablablablabbablab lblb ablab abl bla lablabal blabalb lblab lala ba llab labbl <br />
        lablbabal blabl bblablabl bablba babla labl bab labla bb abal balbl abal blablab blaba bb al<br />
        balblaba blababa bababl blab l<br />
      </p>

    </div>

    <!-- Bulle d'aide -->
    <div id="infoBull" class="hide"></div>

  </body>
</html>

Conclusion :


Vous pouvez voir à quoi ça ressemble sur : http://dev.blinckers-groups.com/scriptJS/infos_bulles_ver_2.html

Vous devez lire "infos_bulles_ver" et non "infos_bul les_ver" (la coupure se fait lors du post de la conclusion :'(

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
21 novembre 2011

Oui, j'avais bien vu le commentaire à cette ligne mais je suis une vraie bille en javascript...
J'ai mis des signes moins les chiffres devant mais le navigateur n'a pas trop aimé !
Je vais faire d'autres essais et si je ne trouve pas je m'en remettrai à son créateur ;)

Merci en tout cas pour la rapidité de la réponse.
Messages postés
133
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
18 avril 2013

Oui c'est tout à fait possible :)
ligne 70 : // Détection de la souris et positionnement de la Bulle
tu peux là jouer sur le point d'origine de la bulle (coin gauche haut)
Messages postés
2
Date d'inscription
jeudi 1 juillet 2010
Statut
Membre
Dernière intervention
21 novembre 2011

Pas mal du tout ton script !
Une question : y a-t-il possibilité de faire apparaître l'infobulle à gauche plutôt qu'à droite ?
Merci d'avance.
Messages postés
133
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
18 avril 2013

ah effectivement .. pas pensé à ça :\
\/me ajoute todo list
Messages postés
647
Date d'inscription
samedi 30 décembre 2000
Statut
Membre
Dernière intervention
20 juillet 2012
5
En effet, il faudrait que le code vérifie si la bulle ne va pas plus bas que la hauteur de la page (offsetHeight), dans ce cas, il faudrait le mettre plus haut (si vous me suivez... ^^)
Afficher les 22 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.