2008-12-16 à 19:58:24

Bulles d'aide ou tooltips en (X)HTML

Les bulles d'aide existent depuis longtemps dans les environnements graphiques. En Windows par exemple, elles sont souvent suscitées pour rafraîchir la mémoire de l'utilisateur quant au maniement de telle ou telle option d'un programme.

Nul doute que vous souhaitiez bénéficier de la même souplesse dans la construction de pages (X)HTML.

La manière simple

La manière la plus simple de construire de petites bulles d'aide est d'utiliser l'attribut title des balises (X)HTML. C'est d'ailleurs ce que fait le présent paragraphe avec le code suivant :

<p title="Illustration de la manière la plus simple de créer des bulles d'aide"> 

    La manière la plus simple de construire de petites bulles d'aide est d'utiliser
    l'attribut <code>title</code> des balises (X)HTML. C'est d'ailleurs ce que
    fait le présent paragraphe.

</p>

La manière soignée

Loin de nous l'idée de dénigrer l'attribut title. Nous souhaitons simplement lui adjoindre une façon un peu plus minutieuse de présenter la bulle d'aide en question (tooltip en anglais) ... comme dans l'exemple suivant : bulle d'aide. (Aide: Ici ... toute une explication qui peut même être très longue avec des images, etc.)

De quoi est fait une telle bulle d'aide ? En fait elle est consitituée de deux balises span :

  1. une balise réservée au mot (ou suite de mots) sur lequel fournir une explication,
  2. une balise englobant l'explication.

Imaginons que nous souhaitions fournir une petite bulle sur les mots "bulle d'aide" dans un petit paragraphe, voilà comment nous y prendre :

<p>
    Voilà donc le petit paragraphe qui contient les mots "bulle 
    d'aide". C'est sur ces mots que nous devrions fournir le tooltip.
</p>

Entourons les mots de deux balises span :

<p>

    Voilà donc le petit paragraphe qui contient les mots "<span 
    onmouseover="tooltip('bulleExemple','show');" 
    onmouseout="tooltip('bulleExemple','hide');">bulle 
    d'aide</span><span class="tooltip" id="bulleExemple"> (Aide: l'explication en 
    question)</span>". C'est sur ces mots que nous devrions fournir le 
    tooltip.

</p>

… ce qui donne :

Voilà donc le petit paragraphe qui contient les mots "bulle d'aide (mettez votre curseur sur les mots en gras) (Aide: l'explication en question)". C'est sur ces mots que nous devrions fournir le tooltip.

La balise span de classe tooltip est définie de la manière suivante dans un CSS :

span.tooltip        {   z-index         :   1000;
                        display         :   none;
                        position        :   fixed;
                    }                   

L'instruction CSS display:none évite son affichage. Donc, par défaut, toute bulle d'aide est cachée. Chaque balise span.tooltip est affublée d'un ID unique (pour qu'on sache quelle balise il faut afficher au moment où c'est nécessaire).

L'autre balise span informe le navigateur de tenir compte de deux événements : onmouseover et onmouseout. Donc quand la souris de l'utilisateur sera positionnée sur la suite de mots pour lesquels fournir une explication, une fonction javascript est invoquée : tooltip.

Quand la souris est sur la suite de mots, on demande l'affichage de la balise d'aide : onmouseover="tooltip('bulleExemple','show')". Quand la souris quitte la suite de mots, on demande de cacher la balise d'aide : onmouseout="tooltip('bulleExemple','hide')". Quelle est la balise qu'il faut afficher ou faire disparaître ? bulleExemple, c'est le premier argument de la fonction tooltip.

Pour que tout cela fonctionne, il faut que le petit javascript qui suit soit chargé sur votre page :

<script type="text/javascript">
    MouseX = 0;
    MouseY = 0;

    function MousePos()
    /*---------------*/
    {
        MouseX = event.x + document.body.scrollLeft;
        MouseY = event.y + document.body.scrollTop;
    }

    function tooltip( szID,szVerb )
    /*---------------------------*/
    {
        if ( szVerb == 'hide' )
        {
            if ( oDiv = document.getElementById( szID )
                oDiv.style.display = "none";
        }
        else if ( szVerb == 'show' )
        {
            if ( oDiv = document.getElementById( szID )
            {
                MousePos();            

                oDiv.style.display      = "block";
                oDiv.style.left         = MouseX;
                oDiv.style.top          = MouseY;
            }
        }
        return ( true );
    }
</script>

Là vous avez, a priori, la base d'une gestion assez minutieuse des bulles d'aide. Et le plus amusant, c'est que sans le javascript et sans le CSS, votre page reste parfaitement "accessible", c'est{-}à{-}}}dire utilisable par tous.

Plus fort encore … avec des styles !

Comme annoncé au début de l'article, il est même possible d'affubler la bulle d'aide de styles bien trempés (Aide: ici un tooltip complet qui représente plusieurs lignes d'aide et qui affiche un style ambitieux, avec un bord, une taille, une couleur d'arrière-plan, et même une image de fond.).

C'est qu'ici, nous avons utilisé un troisième argument à la fonction tooltip : les styles dont il faut tenir compte !

Pour le coup, nous avons dû modifier (légèrement) le javascript :

<script type="text/javascript">
    MouseX = 0;
    MouseY = 0;

    function MousePos()
    /*---------------*/
    {
        MouseX = event.x + document.body.scrollLeft;
        MouseY = event.y + document.body.scrollTop;
    }

    function tooltip( szID,szVerb )
    /*---------------------------*/
    {
        if ( szVerb == 'hide' )
        {
            if ( oDiv = document.getElementById( szID )
                oDiv.style.display = "none";
        }
        else if ( szVerb == 'show' )
        {
            if ( oDiv = document.getElementById( szID )
            {
                MousePos();            

                oDiv.style.display      = "block";
                oDiv.style.left         = MouseX;
                oDiv.style.top          = MouseY;

                if ( szStyle != null )
                {
                    var aTokens;
                    aTokens = szStyle.split(';');
                    if ( aTokens.length > 0 )
                    {
                        for ( i=0;i<aTokens.length;i++ )
                        {
                            szCSSInstr  = aTokens[i];
                            aCSSMembers = szCSSInstr.split(':');
                            if ( aCSSMembers.length == 2 )
                            {
                                szCmd = "oDiv.style." + aCSSMembers[0] + '= "' + aCSSMembers[1] + '"';
                                eval( szCmd );
                            }
                        }
                    }
                }
            }
        }
        return ( true );
    }
</script>

C'est dans Vae Soli!

Ce petit script se trouvera dans la prochaine version de Vae Soli!, prévue pour la fin de l'année. Dèjà Joyeux Noël et Bonne Année à tous.

Ajoutez un nouveau commentaire


(non affichée)





Machine de turing




(*) zone obligatoire.

Évitez d'enfoncer le bouton “ Poster ” plus d'une fois. Le traitement de votre commentaire peut prendre quelques secondes sur le serveur avant que vous ne soyez averti de sa prise en compte.

Notes à propos des commentaires

Nous vous demandons de bien vouloir faire diligence et de respecter les règles les plus élémentaires de bienséance. Les commentaires non appropriés ou offensants pourront être édités voire supprimés.

Les adresses email que vous pourriez nous laisser ne sont JAMAIS affichées par mesure de confidentialité : elles ne nous servent qu'à vous contacter pour éclaircir un point ou l'autre si besoin était.

Notez bien que toutes les balises HTML sont retirées de votre commentaire néanmoins vous pouvez utiliser les marques suivantes pour vous aider à formater votre texte :

  • [p] et [/p] : paragraphe
  • [b] et [/b] : gras (bold)
  • [i] et [/i] : italique
  • [q] et [/q] : citation
  • [http] et [/http] : ancre
  • [pre] et [/pre] : texte préformaté
  • [code] et [/code] : code source

Merci

< Février 2012 >
Lu Ma Me Je Ve Sa Di
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        
lifetime-episode

Nos autres articles

  1. Articles
    1. /articles-core.php
    2. /articles/core/MiFID/index.php
    3. /articles/core/SEPA/index.php
    4. /articles/core/accessibility-seo/index.php
    5. /articles/core/accessible-popups/index.php
    6. /articles/core/ajax/index.php
    7. /articles/core/blogs/index.php
    8. /articles/core/business-case/index.php
    9. /articles/core/closure-report/index.php
    10. /articles/core/cmmi/index.php
    11. /articles/core/css/index.php
    12. /articles/core/doctype/index.php
    13. /articles/core/dynamic-input/index.php
    14. /articles/core/dynamic-theme/index.php
    15. /articles/core/effort-de-gestion-de-projet/index.php
    16. /articles/core/error-handling-404/index.php
    17. /articles/core/estimations-programmeurs/index.php
    18. /articles/core/expressions-regulieres-php/index.php
    19. /articles/core/gestion-des-couleurs/index.php
    20. /articles/core/glossary/index.php
    21. /articles/core/ideal-team-duration/index.php
    22. /articles/core/image-transition/index.php
    23. /articles/core/inline-javascript/index.php
    24. /articles/core/investir/index.php
    25. /articles/core/it-budget/index.php
    26. /articles/core/javascript-animation/index.php
    27. /articles/core/junctions/index.php
    28. /articles/core/les-malheurs-IT/IT-soumis-business.php
    29. /articles/core/limites-de-la-croissance/club-de-rome.php
    30. /articles/core/link-rel-canonical/eviter-duplication-url-canonique.php
    31. /articles/core/link-rel/index.php
    32. /articles/core/longitude-latitude-google-maps/index.php
    33. /articles/core/meetings/index.php
    34. /articles/core/pack-and-go/index.php
    35. /articles/core/pageframe-tabs/index.php
    36. /articles/core/phases-de-projet/index.php
    37. /articles/core/php-server-variables/index.php
    38. /articles/core/pre-business-case/index.php
    39. /articles/core/project-management/principes-de-gestion-de-projet.php
    40. /articles/core/project-typology/index.php
    41. /articles/core/pso/index.php
    42. /articles/core/requirements management/index.php
    43. /articles/core/risk management/index.php
    44. /articles/core/rss/index.php
    45. /articles/core/scrum/index.php
    46. /articles/core/search-engine-optimization/accessibility-guidelines.php
    47. /articles/core/sepia/index.php
    48. /articles/core/sponsorship-meeting/index.php
    49. /articles/core/stylesheet-switching/index.php
    50. /articles/core/v-model/index.php
    51. /articles/core/vaesoli-transform-images/index.php
    52. /articles/core/wiki/index.php
    53. /articles/core/xml-sitemap/index.php