オリジナルツールチップの作成
今度はツールチップ(何かにマウスオーバーしたときにその説明をマウス付近にポップアップ表示するヤツ)を作成する。
ツールチップ自体は、title属性やimg要素のalt属性にテキストを記述すれば表示されるが、表示のデザインや挙動がブラウザーによって違う上、HTMLとかCSSでカスタマイズができねぇ。
なので、デザイン、操作性共に一貫性のあるツールチップを表示できるようにするために、jQueryを使うというのが背景らしいぞ。
このエントリで紹介するのは次の3種のツールチップ。
では早速やってみよう。
CSSで装飾するシンプルなツールチップ
リンク(a要素)にマウスカーソルが重なると補足テキストをフェードインで表示する。
ツールチップはマウスカーソルの右下にピッタリくっ付いて表示され、マウスの動きに合わせて移動する。
<html> <head> <style> span.tooltip{ line-height:1.5; color:white; width:200px; background:#FF9900; border:2px solid white; padding:1em; font-size:small; } </style> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript">google.load("jquery", "1.3.2");</script> <script type="text/javascript"> $(function(){ $("span.tooltip").css({ opacity:"0.9", //透明度の指定 position:"absolute", display:"none" //最初は非表示にしておく。 }) $("a").mouseover(function(){ //aタグの上にマウスが来たときに、非表示にしていたツールチップタグを徐々に表示させる。 $("span.tooltip").fadeIn(); }).mouseout(function(){ //マウスがいなくなったら徐々に非表示に。 $("span.tooltip").fadeOut() }).mousemove(function(e){ //マウスが動いている際に、その動きに追随していく。 $("span.tooltip").css({ "top":e.pageY+10+"px", "left":e.pageX+10+"px" }) }) }) </script> </head> <body> <p>これは「CSSで装飾するシンプルなツールチップ」の実験です。<br/> <a href="http://ascii.jp/elem/000/000/438/438206/">ここ</a><span class="tooltip">これはASCII.jpの<br /><strong>Web制作の現場で使えるjQuery<br />UIデザイン入門</strong>(中略)</span>に掲載されているプログラムコードにバグを発見しました。<br/> jQueryコードの、$("span.tooltip")に対する初期化処理のロジック部分で、<br/> CSSプロパティであるpositionの指定行が「;」セミコロンで終了しているために、<br/> 次の「display:"none"」の行が無効になっていたので気をつけてください。 </p> </body> </html>
ここのサンプルコードにバグ発見。jQueryコードの、$("span.tooltip")に対するCSSプロパティであるpositionの指定行が、「;」セミコロンで終了していて、display:"none" の行が無効になっていたので気をつけられたし。
透過GIFを使ったふき出し風のツールチップ
「ふきだし」だって。ふきだしにするからマウスカーソルの動きに追随して位置が移動すると困るので、このツールチップは位置固定です。
<html> <head> <style> div.tooltip{ width:230px; position:absolute; } div.tooltip p{ line-height:1.5; margin:0; font-size:small; background:url("http://editors.ascii.jp/m-kobashigawa/jquery_sample/016/images/tooltipBody.gif") top right; padding:10px 5px 0 40px; } div.tooltip img{ vertical-align:top; } </style> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript">google.load("jquery", "1.3.2");</script> <script type="text/javascript"> $(function(){ //tooltipクラスが適用されているタグの透明度を指定 $("div.tooltip").css("opacity","0.9").hide() $("a").mouseover(function(){ //任意のaタグの上にマウスカーソルが来たときに、 //tooltipクラスが適用されているタグを徐々に表示。 //かつ、マウスオーバー中のaタグの位置を元に表示座標を微調整する。 $("div.tooltip").fadeIn().css({ "top":$(this).offset().top-20+"px", "left":$(this).offset().left+$(this).width()+"px" }); }).mouseout(function(){ //任意のaタグの上からマウスカーソルが消えたときに、 //tooltipクラスが適用されているタグを徐々に非表示にする。 $("div.tooltip").fadeOut() }) }) </script> </head> <body> <p>Lorem (中略) quis, <a href="http://ascii.jp/elem/000/000/438/438206/">tooltip sample</a> (中略)</p> <div class="tooltip"> <p> これはASCII.jpの<br /> <strong>Web制作の現場で使えるjQuery<br /> UIデザイン入門</strong><br /> のサンプルプログラムです </p> <img src="http://editors.ascii.jp/m-kobashigawa/jquery_sample/016/images/tooltipFoot.gif" alt=" " /> </div> </body> </html>
とくに解説が必要なことはしてないなぁ。
透過PNGを使ったタイマー式のツールチップ
タイマー式のツールチップだって。マウスカーソルが離れた後、指定時間が経過すると消えるらしいぞ。
<html> <head> <style> p.tooltip{ margin:0; width:185px; height:86px; position:absolute; padding : 10px 20px 20px 10px; background:url("http://editors.ascii.jp/m-kobashigawa/jquery_sample/016/images/tooltip.png"); font-size:small; } /* IE6はそのままでは透過PNGを表示できないので、IE6向けにはスターハックを利用する。*/ /* セレクターの前に「* html」を付けるのがスターハック。*/ /* これはIE6以下にだけ解釈できるCSSを記述する方法とのこと。*/ /* そのほかのブラウザーではスターハックで指定されたCSSは無視される。*/ * html p.tooltip{ background:none; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/tooltip.png',sizingMethod='scale'); } </style> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript">google.load("jquery", "1.3.2");</script> <script type="text/javascript"> $(function(){ $("p.tooltip").hide() $("a").mouseover(function(){ $("p.tooltip").show().css({ "top":$(this).offset().top-20+"px", "left":$(this).offset().left+$(this).width()+10+"px" }); }).mouseout(function(){ //setTimeout関数を使う。 //このコードでは、3000msec後に第一引数の関数(つまりtooltipクラスが適用されているタグの非表示処理)が実行されるようになっている。 setTimeout(function(){ $("p.tooltip").hide() },3000) }) }) </script> </head> <body> <h1>tooltip sample</h1> <p>Lorem ipsum (中略) <a href="http://ascii.jp/elem/000/000/438/438206/">tooltip sample</a> (中略) libero imperdiet sed.</p> <p>Proin adipiscing faucibus (中略) est.</p> <p>Morbi faucibus (中略) a mi.</p> <p class="tooltip">これはASCII.jpの<br /><strong>Web制作の現場で使えるjQuery<br />UIデザイン入門</strong><br />のサンプルプログラムです</p> </body> </html>
いいね〜。自宅の環境だとfirefoxでしか確認できないんだが、これでIEでも透過のツールチップが表示できるってことっすね。