JavaScript: ToolTip Script
Jednoduchý ToolTip, používaný pro zobrazení dalších informací k elementu stránky. ToolTip může obsahovat jak prostý text, tak zformátovaný HTML text.
ToolTip chápejte jako malé „vyskakovací okno“, které většinou doplňuje informace u elementu na stránce. Toto vyskakovací okno není vytvořeno novým oknem prohlížeče, ale pouze Divem, vhodně pozivovaným na stránce.
Vše je vidět na jednoduchém příkladu pokud myší přejedete přes zvýrazněné části textu:
//div ID var myDivId = 'ZHintDiv'; //posun v ose X var movingX = 20; //px //posun v ose Y var movingY = 10; //px
//vychozi pozice var positionX = 0; var positionY = 0;
//vytvorime novy element typu DIV var divElement; divElement = document.createElement('div'); //nastavime ID divElement.setAttribute('id', myDivId); //visibility:hidden divElement.style.visibility = 'hidden'; //positin: absolute divElement.style.position = 'absolute'; //vychozi pozice divElement.style.left = '0px'; divElement.style.top = '0px';
//zjisteni souradnic mysi function getMouseXY(e) { var browserIE = document.all?true:false if (!browserIE) document.captureEvents(Event.MOUSEMOVE) //zjisteni souradnic positionX = browserIE?event.clientX + document.body.scrollLeft:e.pageX; positionY = browserIE?event.clientY + document.body.scrollTop:e.pageY; //posun elementu setPosition(); return true; }
//nastaveni pozice okna function setPosition(){ var windowWidth = 0; //zjisteni sirky okna if( typeof( window.innerWidth ) == 'number' ) { windowWidth = window.innerWidth; } else if( document.documentElement && document.documentElement.clientWidth ) { windowWidth = document.documentElement.clientWidth; } else if( document.body && document.body.clientWidth ) { windowWidth = document.body.clientWidth; } //pokud je pozice za okrajem okna, nastavi se pred kurzor if( ( positionX + parseInt(divElement.style.width ) + movingX + 50 ) > windowWidth ){ positionX -= ( movingX + parseInt(divElement.style.width ) ); } divElement.style.left = ( movingX + positionX ) + 'px'; divElement.style.top = ( movingY + positionY ) + 'px'; }
//funkce pro nastavei opacity function setOpacity( element, alpha ){ var el = document.getElementById(element);
if( el.style.opacity != undefined ){ el.style.opacity = alpha; } else if( el.style.MozOpacity != undefined ){ el.style.MozOpacity = alpha; } else if( el.style.filter != undefined ){ el.style.filter = "alpha(opacity=0)"; el.filters.alpha.opacity = ( alpha * 100 ); }
return true; }
function pulseOn(){ for( i = 0; i <= 9; i++ ){ setTimeout("setOpacity('" + myDivId + "'," + i/10 + ");", 25*i); } } //TOOLTIP FUNCTION function tooltip( str, el, width ){ //pokud neni vytvoreny div pridany v HTML if( !document.getElementById(myDivId) ) //pridame div do stranky document.body.appendChild(divElement); //nastavime pozadovanou sirku pro div divElement.style.width = width + 'px'; //nastavime visibility:visible setOpacity(myDivId, 0 ); divElement.style.visibility = 'visible'; pulseOn(); //vlozime do divu nas text divElement.innerHTML = str; //pri posunu po elementu menime pozici divu el.onmousemove=getMouseXY; //pri opusteni elementu okno schovame el.onmouseout = hidetip; } //schovani okna function hidetip(){ divElement.style.visibility = 'hidden'; }
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Lorem ipsum no sit omnis deserunt.
Co všechno bude ToolTip umožňovat?
ToolTip bude tedy umožňovat zobrazit rozšířené informace u elementu v HTML. Bude obsahovat pouze jeden div, do kterého se pomocí JavaScriptu vloží vámi zadaný text.
Po najetí na element se okno zobrazí. Zde budeme využívat nastavení CSS vlastnosti visibility a její hodnoty visible, nebo hidden.
Při zobrazení bude okno navíc obsahovat efekt postupného zobrazení, jak je tomu na ukázce, kdy se okno plynule zobrazí a nakonec zůstane částečně transparentní.
Okno se defaultně zobrazuje vpravo dole od kurzoru (dle počátečního nastavení). Takto by mohla nastat situace, kdy by se okno zobrazilo až za hranicí otevřeného okna, musíme tedy ošetřit i tuto možnost a v takovém případě přesuneme okno na druhou stranu kurzoru.
ToolTip
Jako první si vytvoříme několik proměnných, umožňujících částečné nastavení okna.
Prakticky se jedná pouze o proměnné pro posun okna vzhledem ke kurzoru a proměnnou, obsahující identifikátor okna, kvůli možnosti nastylování.
1 2 3 4 5 6 |
//div ID var myDivId = 'ZHintDiv'; //posun v ose X var movingX = 20; //px //posun v ose Y var movingY = 10; //px |
Nyní je třeba vytvořit div, do kterého se bude ToolTip načítat a ve kterém se bude zobrazovat. Zde máme v podstatě dvě možnosti. Vložit div do stránky ručně, nebo jej vytvořit dynamicky. Kvůli jednoduššímu použití vytvoříme div dynamicky a rovnou mu nastavíme základní počáteční styly:
1 2 3 4 5 6 7 8 9 10 11 12 |
//vytvorime novy element typu DIV var divElement; divElement = document.createElement('div'); //nastavime ID divElement.setAttribute('id', myDivId); //visibility:hidden divElement.style.visibility = 'hidden'; //positin: absolute divElement.style.position = 'absolute'; //vychozi pozice divElement.style.left = '0px'; divElement.style.top = '0px'; |
Div je vytvořený a tak můžeme pokračovat. Pustíme se do samotné funkce pro zobrazení ToolTipu.
Funkce bude obsahovat tři vstupní parametry:
- textový řetězec, který representuje obsah okna
- element, u kterého se tip zobrazuje
- šířku vytvořeného divu
Ve funkci nejprve zjistíme, zda je ve stránce již umístěn námi vytvořený div. V případě že ne, přidáme jej do stránky pomocí appendChild. Dále nastavíme rozměry a visibility na hodnotu visible.
Nakonec musíme vytvořit události pro myš, konkrétně pro onmousemove, při pohybu po elementu a onmouseout, při opuštění elementu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//TOOLTIP FUNCTION function tooltip( str, el, width ){ //pokud neni vytvoreny div pridany v HTML if( !document.getElementById(myDivId) ) //pridame div do stranky document.body.appendChild(divElement); //nastavime pozadovanou sirku pro div divElement.style.width = width + 'px'; //nastavime visibility:visible setOpacity(myDivId, 0 ); divElement.style.visibility = 'visible'; pulseOn(); //vlozime do divu nas text divElement.innerHTML = str; //pri posunu po elementu menime pozici divu el.onmousemove=getMouseXY; //pri opusteni elementu okno schovame el.onmouseout = hidetip; } |
Ve funkci je navíc volána funkce setOpacity. Tato funkce byla vysvětlena ve článku „Ajax Loader“ (http://www.zaachi...loader.html).
Další neznámou funkcí, která je použita je funkce pulseOn();, zajištující právě plynulé zobrazení okna a nastavení částečné transparentnosti:
1 2 3 4 5 |
function pulseOn(){ for( i = 0; i <= 9; i++ ){ setTimeout("setOpacity('" + myDivId + "'," + i/10 + ");", 25*i); } } |
Funkce využívá setOpacity, kterou volá ve velice krátkých intervalech a mění hodnotu opacity u vytvořeného divu. Konečnou hodnotu nastaví na 90 procent a div zůstane částečně transparentní. Kdybychom chtěli, aby byl div neprůhledný, museli bychom změnit hodnotu v cyklu na plných 10.
Event onmousemove, který zachytává pohyb nad elementem, je nastaven na funkci getMouseXY, která zjišťuje pozici kurzoru myši na aktuální stránce:
1 2 3 4 5 6 7 8 9 10 11 |
//zjisteni souradnic mysi function getMouseXY(e) { var browserIE = document.all?true:false if (!browserIE) document.captureEvents(Event.MOUSEMOVE) //zjisteni souradnic positionX = browserIE?event.clientX + document.body.scrollLeft:e.pageX; positionY = browserIE?event.clientY + document.body.scrollTop:e.pageY; //posun elementu setPosition(); return true; } |
Funkce zjistí pozici myši a volá funkci setPosition, která konečně nastaví pozici vytvořeného divu. Zde se navíc ošetřuje zobrazení divu za okrajem okna, a případné upravení pozice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//nastaveni pozice okna function setPosition(){ var windowWidth = 0; //zjisteni sirky okna if( typeof( window.innerWidth ) == 'number' ) { windowWidth = window.innerWidth; } else if( document.documentElement && document.documentElement.clientWidth ) { windowWidth = document.documentElement.clientWidth; } else if( document.body && document.body.clientWidth ) { windowWidth = document.body.clientWidth; } //pokud je pozice za okrajem okna, nastavi se pred kurzor if( ( positionX + parseInt(divElement.style.width ) + movingX + 50 ) > windowWidth ){ positionX -= ( movingX + parseInt(divElement.style.width ) ); } divElement.style.left = ( movingX + positionX ) + 'px'; divElement.style.top = ( movingY + positionY ) + 'px'; } |
Poslední funkcí, která je nastavená na event onmouseout, je hidetip, jež skryje okno. To se provede pouhým nastavením visibility na hodnotu hidden:
1 2 3 4 |
//schovani okna function hidetip(){ divElement.style.visibility = 'hidden'; } |
Styly okna
Jelikož vytvořený div obsahuje unikátní ID, můžeme mu vytvořit libovolné styly a přizpůsobit jej tak designu webu. Styly nastavíme klasicky:
1 2 3 4 5 6 7 8 9 10 11 12 |
#ZHintDiv{ float:left; border: 1px solid silver; border-right: 3px solid black; border-bottom: 3px solid black; background-color: white; padding: 4px; padding-left: 10px; padding-right: 10px; font-size: 11px; font-weight: normal; } |
Volání funkce
Při zobrazení voláme funkci tooltip, která obsahuje, jak již bylo zmíněno, tři vstupní parametry. První je textový řetězec zobrazení v divu, druhý je objekt elementu, nad kterým se tooltip zobrazí a třetí je šířka okna, zadaná jako číslo představující hodnotu v pixelech:
1 |
<i onmouseover="tooltip('Lorem ipsum no sit omnis deserunt.', this, 100);">ipsum</i> |
Do tipu můžeme vkládat i složitější elementy, jako libovolně zformátované HTML, například takto:
1 2 3 4 5 6 |
<script type="text/javascript"> var tip = "<center><h3>Image</h3></center><img src='image.jpg' alt='Image' align='left'/>"; </script> <a href="#" onmouseover="tooltip(tip, this, 100); return false;">Here</a> |
Závěrem
Zobrazit celý javascript můžete zde: tooltip.js.txt
Použití ToolTipu může být v některých případech poměrně praktické. Uvedený příklad je možné libovolně rozšiřovat a upravovat.
Něco takového jsem nedávno hledal, potřeboval jsem otestovat, zda iGoogle Gadget povoli popup okno u myši (nepovodli ;), nikde žádnej pořadnej skript psát vlastní se mi nechtělo, nemám připraveným svoje knihovny na zjištovaní souřadnic myši a bojovat napříč různými prohlížeči je děs (to jsem ještě neznal jquery), díky kouknu a možná se volně inspiruji 😉
To mate pravdu.
Cross-browser javascript programovani neni zadna slava. Taky dost casto ztratim nervy.
Moc pěkný tooltip.
docela dobré, jen v IE6 nějak nefunguje a v IE7 pokud člověk naskroluje stránku, pak tooltips je někde nahoře a ne pod myší. ve firefoxu funguje perfektně
Skvělý skript jen se musí trochu upravit podle "Učeň Augustin" a pak funguje i v IE. Testováno v IE 7.
Ahojdy všem, díky zaachimu za moc pěkný ToolTip. Mohl by mi ale někdo poradit, jak to rozjet pod Chromem? Ve FF to jede krásně, ale v Google Chrome se mi ten tooltip nechce nastylovat (barva pozadí, font atd.), a když vyskočí, je průhledný, nikoliv průsvitný.
Vím, že od vytvoření tohoto článku uběhlo už dost času, ale budu moc vděčný za jakoukoliv radu. Přede moc děkuju! 🙂