Info-Bulle javascript
Par Damien ALEXANDRE le samedi, septembre 24 2005, 13:10 - DevBlog - Lien permanent
! /!\ Ce tutoriel est obselete, nouvelle version ici ! /!\ ! Merci.
Aujourd'hui j'vous fait un javascript qui va être charger d'afficher une info-bulle (personnalisable bien sur) au passage du curseur de la souris, sur n'importe qu'elle élément HTML de votre page.
Pour ce faire, on a besoin :
- D'un script de détection de la position du curseur,
- D'un script permettant d'afficher et de cacher la bulle,
- D'un script permettant d'afficher un texte variable dans la bulle,
- D'un CSS définissant le style de la bulle,
- Un div vide.
Pour ce script, il y avait selon moi UNE difficulté, un bug d'Internet Explorer.
Lors d'un scroll de page, la position du curseur donné par Javascript n'etais plus à jour par rapport au scroll, la bulle n'est alors plus en phase avec la souris.
Pour contrer ce problème, une solution, détecter le navigateur et ajouter cette ligne à la position verticale :
document.body.scrollTop; . Voila un probléme de résolu.
Pour afficher et cacher la bulle, on va utiliser les deux évènements onmouseout et onmouseover tout simplement, chacun appelant une fonction différente.
Pour que le texte de la bulle change suivant sa position dans la page, il faut lui passer le texte au moment ou nous voulons afficher la bulle. Il faut aussi qu'a cette instant, le texte s'y écrive instantanément. Pour cela, nous allons passer le texte de cette maniere : onmouseover="montre('TEXTE');" et se servir de la fonction javascript suivante innerHTML pour écrire le texte.
Niveau CSS restons sobre le stric minimum est une couleur et une bordure.
Bon aller, je continue les commentaires dans la source du code ![]()
geshi javascript
<script language="javascript" type="text/javascript">
<!--
function GetId(id)
{
return document.getElementById(id);
}
var i=false; // La variable i nous dit si la bulle est visible ou non
function move(e) {
if(i) { // Si la bulle est visible, on calcul en temps reel sa position ideale
if (navigator.appName!="Microsoft Internet Explorer") { // Si on est pas sous IE
GetId("curseur").style.left=e.pageX + 5+"px";
GetId("curseur").style.top=e.pageY + 10+"px";
}
else { // Modif proposé par TeDeum, merci à lui
if(document.documentElement.clientWidth>0) {
GetId("curseur").style.left=20+event.x+document.documentElement.scrollLeft+"px";
GetId("curseur").style.top=10+event.y+document.documentElement.scrollTop+"px";
} else {
GetId("curseur").style.left=20+event.x+document.body.scrollLeft+"px";
GetId("curseur").style.top=10+event.y+document.body.scrollTop+"px";
}
}
}
}
function montre(text) {
if(i==false) {
GetId("curseur").style.visibility="visible"; // Si il est cacher (la verif n'est qu'une securité) on le rend visible.
GetId("curseur").innerHTML = text; // Cette fonction est a améliorer, il parait qu'elle n'est pas valide (mais elle marche)
i=true;
}
}
function cache() {
if(i==true) {
GetId("curseur").style.visibility="hidden"; // Si la bulle etais visible on la cache
i=false;
}
}
document.onmousemove=move; // des que la souris bouge, on appelle la fonction move pour mettre a jour la position de la bulle.
//-->
</script>
<div id="curseur" class="infobulle"></div>
geshi css
<style type="text/css">
.infobulle{
position: absolute;
visibility : hidden;
border: 1px solid Black;
padding: 10px;
font-family: Verdana, Arial;
font-size: 10px;
background-color: #FFFFCC;
}
</style>
Voila c'est fini ![]()
Vous pouvez tester ici, il suffit de mettre onmouseover="montre('VOTRE TEXTE');" onmouseout="cache();" sur n'importe quel balise html qui le supporte et c'est fini.
Côté optimisation c'est déjà pas mal (par exemple, on evite de calculer la position du curseur si aucune bulle n'est visible), et côté ergonomie, on pourrais encore l'améliorer, avec pourquoi pas une tempo d'une demi seconde avant d'afficher la bulle, dans le plus pur geek style ^^.
Cette source est déjà déposé sur Code-Source ce n'est donc pas la peine d'aller la déposer a ma place
Voila j'espere qu'elle vous sera utile !
MAJ : Prise en compte du monde couirk d'IE, et du scroll horizontal.
/
Commentaires
ON VEUT DES VRAIS BILLETS !!!!! *chui chiant chiheeein"
Génial avec Firefox 1.0.7! Merci...
Zemo t'aura ta révolution quand je serais d'humeur

Et, de rien Phileuf, ca fait plaisir de voir que mes scripts peuvents servir
Tes un artiste mobman !
tu trifouilles aussi le PHP et oscommerce ?
alors dis le moi .................. info@tschitou.com
Je n'arrive pas à le faire marcher dans du php
onmouseover="montre($texte)
La source affiche bien le texte mais n'affiche rien sur la page
mais si je met un texte simple, l'infobulle apparait alors
Je ne comprend pas
bizarre en effet, tu n'aurais pas oublier les ' ?
Il est génial ton script. Mais je n'arrive pas à comprendre le rôle du DIV vide et pourtant sans lui ça ne marche pas.
J'ai constaté, avec namoWebeditor, ce DIV vide est éliminé systématiquement à l'enregistrement.
Par contre, s'il contient quelque chose comme ci-dessous, il ne s'efface pas, mais ça ne marche plus. <div id="curseur" class="infobulle">.</div>
C'est curieux.
ton script est genial , rien a dire. il marche nickel sur firefox mais par contre sur IE, la bulle ne marche pas bien. Elle n apparait pas lorsqu on fait glissé la souris. sais tu pkoi,
@Goliath : le rôle du DIV vide est simple, c'est lui la bulle ! Ce div peut être placé n'importe ou dans la source car il est en position absolue, maintenant c'est sûr que si tu programme dans un logiciel peut scrupuleux... j'ai pas trop de solution pour toi dsl.
@chic : Merci, mais je saisie pas bien le problème, qu'appelle tu faire glisser la souris ?
Je l'ai testé sur IE, Nestcape, firefox et même Opéra. Ca marche. Ce script est simple, intègre parfaitement du html et personalisable avec CSS. N'en déplaise à certains, c'est aujourdh'ui le meilleur. Bravo Mobman02.
Je dois dire que c'est génial ! Seulement j'ai quelques problèmes ou des fois rien ne s'affiche. Et c'est bien mieux que du CSS !
A mon avis ça doit marcher à tous les coups, à savoir prendre quelques précautions:
-s'assurer qu'aucun symbole de programmation soit mis dans le texte qui est inclus dans le script (par ex: l'apostrophe, à remplacer par le caractere correspondant ISO).
-Veiller à ce que l'affichage <div id...></div> n'ait pas disparu à l'enregistrement.
Petit probleme sous IE 6
La bulle est caché par les <select> ! dommage
En effet, c'est un vrai bug d'IE, rien ne peut être mis devant une boite de select ! Ridicule...
Ouai, chez moi, cela bug !
Et sous les dernieres versions d'IE (Avec SP2), il le bloque (comme un ActiveX). Car il traque la souris je pense. sinon super sous Firefox. Ceci dit SP2 IE6 represente trop de monde pour qu'il soit vraiement exploitable
(Merci IE :@ )
Il ne le bloque pas chez moi (IE 6 SP2), a mon avis c'est que ton niveau de sécurité (dans les options) est trop élevé.
ce script est parfait, mais j'ai toujours des problèmes avec les caractères spéciaux... j'ai essayé les symboles ISO comme dit goliath, mais ca m'affiche carément plus l'infobulle...

sinon à part ca, c'est ni-ckel!!!
Eencore une autre personne l'utilisant et le trouvant nickel ! merci à toi ! cela m'enlève une belle épine du pied et améliore mon site !
Bravo !!
Pas mal du tout!! Pour le probleme d'apostrophe on peut tout simplement ajouter un \ avant l'apostrophe: ca marche tres bien... et mon site est en php (voir commentaire au dessus)
BRAVO c'est génial .... BRAVO
Salut,
ton script est interressant cependant est-il possible d'afficher des infos sur plusieurs lignes?
merci d'avance
Bah oui, tu met des <br /> !
Tout le code HTML que tu met dans la bulle aura le même effet que dans une page classique...
Salut !
Vraiment très bien ! J'aurais juste préférer que la bulle soit centrée par rapport à la position du curseur. J'ai essayé plusieurs modif mais sans succès. Peut-être aurais-tu une solution ?
Merci,
Seb
Tu peu modifier les ligne qui commencent par
GetId("curseur").style.
A la place des chiffre positif (les 10, 20, 5, 10...) tu peu mettre du négatif pour avoir l'effet voulu, après si tu cherche a vraiment centrer la bulle pile poil ça se complique, faut un peu plus chercher dans le CSS de base
Oui c'est çà, je la veux pile poil au milieu.
En fait, il faut que je récupère la largeur de la bulle (mais je n'arrive pas à trouver comment il faut faire), disons width et rajouter -width/2 dans la position.
Est-ce que par hasard tu saurais comment récupérer la largeur ?
Merci,
Seb
Pourquoi ne pas lui mettre une largeur fixe ? ^^
Quelle très bonne idée... je me demande pourquoi je n'y avais pas pensé plus tôt. Merci
Merci!
Mettre le <div> à la fin de la page permet de mettre l'infobulle par dessus les autres <div> en position:absolute; s'il y en a
See you
Comme tout le monde je vais dire merci et bravo pour ce script !!! Une petite galère pour l'alignement Y sous firefox dans mon cas (sans torp savoir pourquoi d'ailleur) mais une fois ce petit soucis réglé tout fonctionne nickel...
c'est EXCELLENT ! Bravo ! ...lisibilité du code : très bien. MERCI .
Merci beaucoup pour ce script très réussi.
Excellent script

J'adopte ^^
Merci pour le temps et la galère épargnée !!!!
cool , mais les event.x et event.y ne donnent pas vraiment les vraies valeurs sous IE6... ils donnent les coordonnées par rapport à l'element dans laquelle le java est appelée et non par rapport à la fenêtre ....
solution ? ? ?
Merci bien
Salut,
J'essaie de faire en sorte que l'infobulle ne bouge plus (hé oui ...) mais cela ne fonctionne pas sous Firefox.... Savez-comment faire ?
Bonjour à tous,
Ce script est super léger, efficace, facile à personnaliser, ... et j'en passe.
Cependant j'ai eu un bug où la bulle ne s'affichait plus dès que je passais sur un lien "javascripté" par un autre script : il s'est avéré que la variable i était partagée par ce script et donc y'avait une interférence. J'ai donc modifié remplacé "i"par "toolTipVisible" qui a moins de chance de se retrouver dans un autre script (itérations...).
Une dernière chose : j'ai mis l'appel à "document.onmousemove=move" dans une fonction "startMove()" appelée dans "montre()" (de même, fonction dans "cache()" qui fait "document.onmousemove=null"). Ca évite au browser de mouliner sur move même quand la bulle ne doit pas s'afficher. En plus, ça rend le script compatible avec d'autres qui utiliseraient "onmousemove" pour faire autre chose.
Z'inquiétez pas, j'ai fini :). Si ça peut aider quelqu'un ;)...
Désolé pour le roman.
PS : sympa ton blog !
super script qui marche tres bien sur un paragraphe ! mais je n'arrive pas a le mettre sur un mot du paragraphe
chris88 > normalement ça marche si tu mets ton mot dans un <span> et que tu ajoutes les évènements onmouseover et onmouseout comme sur un paragraphe.
Vraiment simpa ce script.
Juste un petit soucis, quand l'info-bulle apparait sur les bords de la fenetre navigateur, elle est coupée.
Un petit repositionnement selon la position du curseur et le script serait farpait ^^
salut, je ne sais pas si je suis a la bonne adresse mais, j'ai un probleme.
J'ai Windows 2000, Internet Explora et Mozilla 2.0.0.5, la langue est l'allemand, j'ai deja reinstaller Firefox, antivir, changer de clavier , sourris PS2.
Meme les techniciens les plus confirmes ne trouvent pas le probleme.
NB: pas de problemes avec Explorer et Word.
Merci de votre aide.
Vernis
Ah merci enfin ce que je cherche... parmi tous les sites que je viens de parcourir, celui ci me propose enfin quelque chose qui marche.... merci