jQueryがjsライブラリのデファクトスタンダードになって、数多くプラグインが世に出ました。ライトボックス系のモーダルウィンドウや、スライドショーを作成するものなど、簡便にUIが実装出来るものが沢山あります。
僕自身もお世話になってますが、よく使うプラグインは似ているタイプのプラグインも多く、変化をつけるためにカスタマイズは必須です。
ですが、
そういったプラグインの多くはカスタマイズを考慮に入れていないため手をいれるのが難しいです。
特に圧縮されているスクリプトに修正を施すのはもう不可能〜。せっかく、制作のスピードを短縮するためのプラグインが、逆に時間を奪ってしまうこともあります。
なので案件に対応させたい時や制作時間短縮のために使用した時のために、Web上から自分にあったものを探すよりも、欲しいプラグインを作ってしまった方が良いでしょう。なにより仕様を自分のスタイルに合わせやすいですし、カスタマイズで色々備えておくことも可能になりますから。
今回作ったのはツールチップのプラグインです。リンクなど特定の部分にヒュッとでるあれですね。(余談ですけど僕はGoogle日本語入力つかってますが、ヒュッってところで単語予想の部分にヒュッケバインが入っていたのにびびりました。スパロボネタでわからない人すいません。)
aタグ内の要素を表示するツールチップ
ツールチップには色々な使われ方がありますが、リンク先の情報の表示や補足出来ていない情報をコンパクトにまとめる使い方が多いと感じます。
今回作ったのはテキスト情報を主に表示するためのツールチップです。
とりあえずサンプルはこちら。
さわってみるとわかると思いますが、割とシンプルなツールチップです。
スクリプトはこんな感じです。
javascript
$(function(){
var index,texts,nam,t,l,tp = $(".tip"),bd = $("body"),spd = 200,op_01 = {"opacity":0},op_02 = {"opacity":0.9},out = {"top":-9999};
function hover(nam,ele,atr,t,l){
appSt(nam);
var a = "."+nam+" "+ele,st = $("p.tip."+nam);
$(a).hover(
function(){index = $(a).index(this);onOver(a,st,atr,t,l);},
function(){st.animate(op_01,spd,function(){st.css(out)});});
}
function onOver(a,st,atr,t,l){
texts = $(a+":eq("+index+")").attr(atr);
st.stop(true, false).animate(op_02,spd).text(texts);
$(a).mousemove(function(e){st.css({"top":e.pageY-t,"left":e.pageX-l});})
}
function appSt(nam){bd.prepend("<p class='tip "+nam+"'></p>");tp.css(op_01);}
//5パターンのツールチップ実行
hover("t_01","a","name",-20,-10);
hover("t_02","a","href",-20,-10);
hover("t_03","a","name",120,0);
hover("t_04","a","name",50,0);
hover("t_05","em","title",50,-15);
})
各ツールチップ用毎のcss
//ツールチップの基本指定
p.tip { position:absolute; top:-9999px; z-index:10; padding: 0px; margin:0px; color:#fff; font-size:13px; font-weight:normal; color:#fff; background:none; }.tip.t_01 { width:220px; padding:5px 7px; font-size:14px; background:#000; border:1px solid #09C; }
.tip.t_02 { padding:5px 7px; font-size:11px; letter-spacing:2px; background:#000; border-bottom:5px solid #09C; }
.tip.t_03 { width:185px; height:74px; padding:10px 10px 30px 10px; font-size:14px; background:url(common/images/img_tip.png) no-repeat; }
.tip.t_04 { padding:8px 10px; color:#444; font-size:15px; background:#ccc; background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#aaa), to(#ddd));
background:-moz-linear-gradient(0% 100% 90deg, #aaa, #bbb); -moz-border-radius:3px; -webkit-border-radius:3px; text-shadow:0px 0px 1px #fff; -webkit-box-shadow:1px 1px 1px #999; -moz-box-shadow:1px 1px 1px #999; }.tip.t_05 { width:220px; padding:10px 12px; color:#fff; font-size:14px; line-height:1.3em; background:#036; background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#069), to(#036)); background:-moz-linear-gradient(0% 100% 90deg, #069, #036); text-shadow:-1px -1px 1px #025; -webkit-box-shadow:1px 1px 2px #666; -moz-box-shadow:1px 1px 2px #666; }
上記が今回作ったツールチップのjsとcssです。もちろん、これらを使用する前にはjQueryを読み込ませます。今回はjQuery1.4.2を使ってみました。このツールチップを作るとき、色々なパターンを実現出来る方がいいなと思い、CSSでの拡張性が高いものを目指しました。
入力した値をパラメータで受け渡す
表示までの大体の流れはこうなっております。
hover関数にパラメータを入れ宣言
↓
パラメータを変数に代入
↓
パラメータで指定した親クラスにツールチップのタグ要素をprependメソッドで記述
↓
hoverイベントのマウスオーバーで、まずタグ要素のプロパティを取得
↓
それをツールチップのタグ内に記述する
↓
animateメソッドで表示後、マウスムーブイベントでツールチップをマウスに追従させる
↓
マウスアウトになったら、animateメソッドでフェードアウトし、cssメソッドで画面外にツールチップを再配置
表示の流れはこんな感じです。雑な仕組みになっちゃっていると思いますが、実際のソースコードもちょっと見てみましょう。
var index,texts,nam,t,l,tp = $(".tip"),bd = $("body"),spd = 200,op_01 = {"opacity":0},op_02 = {"opacity":0.9},out = {"top":-9999};
ここはほとんど関数に必要な変数しかありません。ツールチップのアルファ値や、クラス名など基本の値を記述してあります。一番触る必要のない箇所ですね。
function hover(nam,ele,atr,t,l){
appSt(nam);//ツールチップのタグを埋め込む
var a = "."+nam+" "+ele,st = $("p.tip."+nam);
$(a).hover(
function(){index = $(a).index(this);onOver(a,st,atr,t,l);},
function(){st.animate(op_01,spd,function(){st.css(out)});});
}
hover関数は今回のスクリプトの中で、使用者が唯一記述するスクリプトになります。上記は関数を構成している記述です。(hoverイベントと名前がかぶるんで、ややこしかったですね・・・すいません。)
関数には5つのパラメータが存在しており、「nam」は親クラス、「ele」はマウスオーバーに対応するタグ要素、「atr」はツールチップに表示するタグのプロパティ、「t」と「l」はツールチップの座標の値です。親クラスのnamを指定させる理由はこのクラス名を組み合わせてツールチップのクラス名として利用するからです。
これらのパラメータを記述した命令をわかりやすくすると、こうなります。
hover("親クラス","クラス内のタグ要素","要素内のプロパティ",topプロパティ,leftプロパティ);
なので、「div#testのaタグにnameプロパティを取得したツールチップを表示させたい」時には、
hover("test","a","name",topプロパティ,leftプロパティ);
となります。topとleftの値だけは、表示するツールチップのサイズによりますので、流動的になります。
function appSt(nam){bd.prepend("<p class='tip "+nam+"'></p>");tp.css(op_01);}
hoverイベントの前に、実行されているappSt関数は指定した親タグ内にツールチップのタグを埋め込みます。パラメータのnamをpタグのクラスとして利用し、bodyタグの先頭に記述しているんですね。(prependメソッドはhtmlテキストの先頭に指定したテキストを追加するメソッドです。)
なのでもしnamが「test」というクラスで入力されていたら、ツールチップのクラスは「p.tip.test」という扱いになります。これでツールチップのタグに対してCSSを明確に指定することが出来ます。
$(a).hover(
function(){index = $(a).index(this);onOver(a,st,atr,t,l);},//マウスオーバー
function(){st.animate(op_01,spd,function(){st.css(out)})//マウスアウト
hoverのイベントにはマウスオーバーとアウトの関数をそれぞれ記述してあります。
index=の記述は、マウスオーバーしている要素が親クラスの中の何番目なのかを調べています。これによりそれぞれの要素内のプロパティを参照することができます。
マウスアウトすると、animateメソッドでフェードアウトし、そこからコールバック関数でツールチップ自体を-9999pxの位置に飛ばしています。もともと絶対配置なので、この辺は自由に座標をコントロールできます。
最後にマウスオーバーで実行したonOver()の関数ですが、
function onOver(a,st,atr,t,l){
texts = $(a+":eq("+index+")").attr(atr); //要素内のプロパティを参照
st.stop(true, false).animate(op_02,spd).text(texts); //フェードイン+テキスト挿入
$(a).mousemove(function(e){st.css({"top":e.pageY-t,"left":e.pageX-l});}) //マウス位置に追従
}
ここでは多くのパラメータを取得しています。aは親クラス内のタグ要素、stはツールチップに対応するクラス名、他は最初のパラメータと同じものです。
一行目は要素内のプロパティをまず参照しています。textsという変数にタグ要素から取得したプロパティを代入してます。
二行目はanimateメソッドでフェードイン処理を行っています。そこからメソッドチェーンでツールチップにテキストを入れ込んできます。
三行目はツールチップのカーソル追従処理です。ここではまずページ全体からマウスの座標を取得しています。これをマウスムーブイベント中ずっと行っています。
以上がスクリプトの内容です。サンプルで表示しているツールチップのスタイルが違うのは、親クラスの名前を使ってツールチップ自体がそれぞれのCSSを適用しているためです。
CSSでスタイルを分けるので、簡単に表示させたいツールチップの差別化が履かれると思います。ただ、まだ表示のエフェクトはフェードインという形になっているので、ここはちょっと改善したいですね。パラメータの受け渡しを使ってこういったツールチップを作ったのですがもうちょっと今後は変数名や値の名前まで気を使って、わかりやすいソースにしなければいけないと感じました。
今回のサンプルです。
今回の記事は西畑一馬さんの「jQuery基礎文法最速マスター」を参考にさせていただきました。