本ブログにもタグクラウドが欲しいと思っていたのですが、共有には気に入ったものがなかったので、自分で作ってみました。Flashは使わず、JavaScriptだけで動きます。カスタマイズも簡単にできるようにしたので、プラグインの共有申請を出してみます。
(→「共有プラグイン追加」からダウンロードできるようになりました。ダウンロードページが上手く開けない場合は、下のコードをコピーして利用できます。)
(→「共有プラグイン追加」からダウンロードできるようになりました。ダウンロードページが上手く開けない場合は、下のコードをコピーして利用できます。)
このタグクラウドは、3Dの球体に張り付いたタグをマウスで回転させることができます。近くになると文字が大きく色も濃くなります。遠くにいくと文字が小さく色は淡くなり遠近感を出しています。もちろんタグをマウスでクリックしてタグ検索画面を表示させることもできます。
ほとんどの場合、設定しなくても利用できますが、カスタマイズも簡単です。プラグインの管理から、「HTMLの編集」を開くと、以下のようになっています。
「共有プラグイン追加」からダウンロードできますが、コードも掲載しておきます。以下の内容をプラグインの「フリーエリア」に貼り付ければ、3Dタグクラウドが表示されるようになります。40~45行目でタグのワードやリンク、利用回数を設定しています。この部分をうまく修正すれば、FC2以外のブログでも使えるかもしれません。
ほとんどの場合、設定しなくても利用できますが、カスタマイズも簡単です。プラグインの管理から、「HTMLの編集」を開くと、以下のようになっています。
var cloudSize = 180; // px クラウドサイズ(縦横共通) カラムの幅(width)と同じ値を設定してください。
var maxTagNum = 30; // タグの最大表示件数 -1:全件表示
var darkColor = 64; // 最も手前にあるときの文字の暗さ 0~255
var lightColor = 216; // 最も 奥 にあるときの文字の明るさ 0~255
var linkColor = "#FF6600"; // タグにマウスが乗った時の色
var maxFont = 24; // px 使用回数最多のタグのフォントサイズ
var minFont = 12; // px 使用回数最少のタグのフォントサイズ
var rewriteSec = 10; // 再描画間隔(ミリ秒)
var maxVelocity = 1500; // 1周にかかるおよそのミリ秒数
var attenuation = 0.95; // 減衰率 (0~1) マウスオーバーしていないときの速度の減衰率
var perspective = 0.50; // 遠近率 (0~1) 遠くなったときのフォントサイズ比率
var initrthv = 1.50; // 初期回転軸角速度(0~)
- cloudSize:タグクラウド領域のサイズ(単位:px)を指定します。カラムの幅(width)と同じ値を設定してください。
- maxTagNum:タグクラウドに表示するタグの個数。使用回数の多いものから表示されます。-1を設定すると、すべてのユーザタグを表示します。PCのスペックが低いと個数が多いときに表示が遅くなります。
- darkColor:タグクラウドを回転させて最も手前にきたときの文字の濃さ。0だと真っ黒になります。
- lightColor:タグクラウドを回転させて最も奥に行ったときの文字の淡さ。255だと真っ白になります。
- linkColor:マウスカーソルがタグに触れたときの色を指定します。タグをクリックするとタグ検索画面が開きます。
- maxFont:最も使用回数が多いタグが最も手前にきたときのフォントサイズ(単位:px)。
- minFont:最も使用回数が少ないタグが最も手前にきたときのフォントサイズ(単位:px)。
- rewriteSec:再描画間隔(ミリ秒)。この値を小さくすると、滑らかに動きますが、PCのスペックが低いと表示が遅くなります。
- maxVelocity:タグクラウドを最速で回転させたときの1周にかかる時間(ミリ秒)。あまり正確ではないので目安程度に使ってください。
- attenuation:マウスカーソルがタグクラウドから外れてから、どのくらい減速させるかを表す比率。1にするとずっと回り続けます。
- perspective:最も奥に表示されるときのフォントサイズ比率。
- initrthv:画面を開いた時の最初の回転速度。
「共有プラグイン追加」からダウンロードできますが、コードも掲載しておきます。以下の内容をプラグインの「フリーエリア」に貼り付ければ、3Dタグクラウドが表示されるようになります。40~45行目でタグのワードやリンク、利用回数を設定しています。この部分をうまく修正すれば、FC2以外のブログでも使えるかもしれません。
<div id="tagcloud" style="overflow: hidden;" onmouseover="onMouseCloud();" onmouseout="offMouseCloud();" onmousemove="mouseHandler(event);" >
<div id="tagcloudInner" style="position:relative;"></div>
</div>
<script type="text/javascript">
<!--
var cloudSize = 180; // px クラウドサイズ(縦横共通) カラムの幅(width)と同じ値を設定してください。
var maxTagNum = 30; // タグの最大表示件数 -1:全件表示
var darkColor = 64; // 最も手前にあるときの文字の暗さ 0~255
var lightColor = 216; // 最も 奥 にあるときの文字の明るさ 0~255
var linkColor = "#FF6600"; // タグにマウスが乗った時の色
var maxFont = 24; // px 使用回数最多のタグのフォントサイズ
var minFont = 12; // px 使用回数最少のタグのフォントサイズ
var rewriteSec = 10; // 再描画間隔(ミリ秒)
var maxVelocity = 1500; // 1周にかかるおよそのミリ秒数
var attenuation = 0.95; // 減衰率 (0~1) マウスオーバーしていないときの速度の減衰率
var perspective = 0.50; // 遠近率 (0~1) 遠くなったときのフォントサイズ比率
var initrthv = 1.50; // 初期回転軸角速度(0~)
var wordKey = "word";
var wordKeyAnc = wordKey + "Anc";
var tagcloudArea = "tagcloudInner";
document.getElementById("tagcloud").style.width=cloudSize+"px";
document.getElementById("tagcloud").style.height=cloudSize+"px";
var cloudWidth = cloudSize;
var cloudHeight = cloudSize;
var cloudRad = cloudSize/2*0.8; // タグクラウド領域半径
var dx = 1/Math.sqrt(2); // 初期回転軸方向 単位法線
var dy = 1/Math.sqrt(2); // 初期回転軸方向 単位法線
var rvconst = 2 * Math.PI * rewriteSec / maxVelocity; // 回転角速度
var rthv = initrthv * rvconst; // 回転軸角速度(0~)
var isOnMouseCloud = false;
var mouseX = 0;
var mouseY = 0;
var isOnAnc = false;
var tagNameList = new Array(""<!--ctag-->, "<%ctag_name>"<!--/ctag-->);
tagNameList.shift();
var tagLinkList = new Array(""<!--ctag-->, "<%ctag_url>"<!--/ctag-->);
tagLinkList.shift();
var tagNumList = new Array(""<!--ctag-->, <%ctag_count><!--/ctag-->);
tagNumList.shift();
var posi = new Array();
var dtag = new Array();
var atag = new Array();
var minCount = 0;
var maxCount = 0;
mouseCheck();
drowCloud();
function drowCloud()
{
if (tagNumList.length==0) return;
if (maxTagNum>0 && tagNumList.length>maxTagNum)
{
tagNameList.splice(maxTagNum, tagNameList.length-maxTagNum);
tagLinkList.splice(maxTagNum, tagLinkList.length-maxTagNum);
tagNumList.splice (maxTagNum, tagNumList.length -maxTagNum);
}
minCount = tagNumList[0];
maxCount = tagNumList[0];
for (i=1;i<tagNameList.length-1;i++)
{
if (minCount > tagNumList[i]) minCount = tagNumList[i];
else if (maxCount < tagNumList[i]) maxCount = tagNumList[i];
}
if (minCount==maxCount) {minCount-=0.5; maxCount+=0.5;}
var cntsqrX = Math.ceil(Math.sqrt(tagNameList.length));
var cntsqrY = cntsqrX;
if (cntsqrX*(cntsqrY+1)<=tagNameList.length)
{
cntsqrY += 1;
}
for (i=0;i<tagNameList.length;i++)
{
var sfont = (maxFont-minFont)/(Math.log(maxCount)-Math.log(minCount))*(Math.log(tagNumList[i])-Math.log(minCount)) + minFont;
posi[i] = new Position(tagNameList[i], tagLinkList[i], sfont);
}
// シャッフル
posi.sort(function(a,b) {return Math.random()-0.5;});
// 初期位置
var tagcnt=0;
var forExit=false;
for (i=0;i<cntsqrX;i++)
{
var x = (i+0.5)/cntsqrX;
for (j=0;j<cntsqrY;j++)
{
var y = (j+0.5)/cntsqrY;
var rndth = 2*Math.acos(Math.sqrt(1-x));
var rndfi = 2*Math.PI*y;
var sinth = Math.sin(rndth);
posi[tagcnt].x=sinth*Math.cos(rndfi);
posi[tagcnt].y=sinth*Math.sin(rndfi);
posi[tagcnt].z=Math.cos(rndth);
tagcnt++;
if (tagcnt >= posi.length)
{
forExit=true;
break;
}
}
if (forExit) break;
}
var I="";
for (i=0;i<posi.length;i++)
{
I += posi[i].getInitHTML(i);
}
document.getElementById(tagcloudArea).innerHTML = I;
for (i=0;i<posi.length;i++)
{
posi[i].width = document.getElementById(wordKey+i).offsetWidth;
posi[i].height = document.getElementById(wordKey+i).offsetHeight;
dtag[i] = document.getElementById(wordKey + i);
atag[i] = document.getElementById(wordKeyAnc + i);
}
rotateLoop();
}
////////////////////////////////////////////////////////////////
function rotateLoop()
{
if (isOnMouseCloud)
{
var dx1 = (mouseX - cloudWidth /2) / cloudRad;
var dy1 = (mouseY - cloudHeight/2) / cloudRad;
dx1 = Math.max(-1,Math.min(1,dx1));
dy1 = Math.max(-1,Math.min(1,dy1));
var rlength = Math.sqrt(dx1*dx1+dy1*dy1);
if (rlength>0.001)
{
dx= dy1/rlength; // マウスのx位置はy軸に影響
dy=-dx1/rlength; // マウスのy位置はx軸に影響
rthv = rlength*rvconst;
}
}
else
{
rthv *= attenuation;
}
var cosr = Math.cos(rthv);
var sinr = Math.sin(rthv);
var cost = 1-cosr;
// 座標変換
for (i=0,len=posi.length;i<len;i++)
{
var dxcost = dx*cost;
var dxdycost = dxcost*dy;
var dxsinr = dx*sinr;
var dysinr = dy*sinr;
var x1=(dx*dxcost +cosr)*posi[i].x+ dxdycost *posi[i].y+dysinr *posi[i].z;
var y1= dxdycost *posi[i].x+(dy*dy*cost+cosr)*posi[i].y-dxsinr *posi[i].z;
var z1=- dysinr *posi[i].x+ dxsinr *posi[i].y+ cosr*posi[i].z;
posi[i].x=x1;
posi[i].y=y1;
posi[i].z=z1;
}
// 奥から表示するために簡易ソート
for (i=0,len=posi.length-1;i<len;i++)
{
if (posi[i].z > posi[i+1].z) {
var t = posi[i];
posi[i] = posi[i+1];
posi[i+1] = t;
}
}
// 再描画
for (i=0,len=posi.length;i<len;i++)
{
posi[i].updateHTML(i);
}
setTimeout('rotateLoop()',rewriteSec);
}
function mouseCheck()
{
if (isOnAnc==true) offMouseCloud();
setTimeout('mouseCheck()',1500);
}
function onMouseCloud()
{
isOnMouseCloud=true;
}
function offMouseCloud()
{
isOnMouseCloud=false;
}
function mouseHandler(event)
{
if (!event) event = window.event;
var mox;
var moy;
if (document.all) { // for IE
mox = event.offsetX;
moy = event.offsetY;
} else {
mox = event.layerX;
moy = event.layerY;
}
var elem;
if (event.target) { // Firefox
elem = event.target;
}
else if (window.event.srcElement) { // IE
elem = window.event.srcElement;
}
if (elem.name)
{
var id = Number(elem.name.substring(wordKeyAnc.length));
var w = posi[id].width;
var h = posi[id].height;
mouseX = Math.floor( mox + posi[id].x * cloudRad+cloudWidth /2 - w/2);
mouseY = Math.floor( moy + posi[id].y * cloudRad+cloudHeight/2 - h/2);
isOnAnc=true;
}
else
{
mouseX = mox;
mouseY = moy;
isOnAnc=false;
}
}
function onMouseAnc(event)
{
if (!event) event = window.event;
var elem;
if (event.target) { // Firefox
elem = event.target;
}
else if (window.event.srcElement) { // IE
elem = window.event.srcElement;
}
if (elem.name)
{
var id = Number(elem.name.substring(wordKeyAnc.length));
posi[id].onMouse();
}
}
function offMouseAnc(event)
{
if (!event) event = window.event;
var elem;
if (event.target) { // Firefox
elem = event.target;
}
else if (window.event.srcElement) { // IE
elem = window.event.srcElement;
}
if (elem.name)
{
var id = Number(elem.name.substring(wordKeyAnc.length));
posi[id].offMouse();
}
for (i=0,len=posi.length;i<len;i++)
{
posi[i].offMouse();
}
}
function getStyleW(id)
{
return getStyle(wordKey + id);
}
function getStyle(name)
{
var element = document.getElementById(name);
return (element.currentStyle || document.defaultView.getComputedStyle(element, ''));
}
//// Positionクラス
function Position(tag, link, f)
{
this.tag=tag;
this.link=link;
this.f=f; // font
this.x=0;
this.y=0;
this.z=0;
this.isOnMouse=false;
this.onMouse = function() {
this.isOnMouse=true;
};
this.offMouse = function() {
this.isOnMouse=false;
};
this.getInitHTML = function(id) {
return this.getHTMLInner(id, -10000, -10000, 12);
};
this.getHTMLInner = function(id , left, top, sfont) {
var clr = Math.round(lightColor-(this.z+1)/2*(lightColor-darkColor));
var clrs = clr.toString(16); // 16進数文字列に変換
clrs = "#" + clrs+clrs+clrs;
var I = "<div id='" + wordKey + id +
"' style='position:absolute;text-align:center;vertical-align:middle;left:" + left +
"px;top:" + top + "px;font-size:" + sfont + "px;white-space:nowrap;font-weight:bold;'>" +
"<a href='" + this.link + "' name='" + wordKeyAnc + id + "' id='" + wordKeyAnc + id +
"' style='text-decoration: none;color:" + clrs +
"' onmouseover='onMouseAnc(event);' onmouseout='offMouseAnc(event);'>" +
this.tag + "</a></div>";
return I;
};
this.updateHTML = function(id) {
var left =(this.x*cloudRad+cloudWidth /2)-this.width /2;
var top =(this.y*cloudRad+cloudHeight/2)-this.height/2;
var sfont=this.f*((this.z+1)/2*(1-perspective)+perspective);
dtag[id].style.left= left + "px";
dtag[id].style.top = top + "px";
dtag[id].style.fontSize= sfont + "px";
if (atag[id].href != this.link) {
atag[id].href = this.link;
atag[id].innerText = this.tag;
}
var clrs = "";
if (this.isOnMouse) {
clrs = linkColor;
}
else {
var clr = Math.round(lightColor-(this.z+1)/2*(lightColor-darkColor));
clrs = clr.toString(16); // 16進数文字列に変換
clrs = "#" + clrs+clrs+clrs;
}
atag[id].style.color = clrs;
this.width = dtag[id].offsetWidth;
this.height = dtag[id].offsetHeight;
};
}
// -->
</script>
スポンサーリンク
まささん、こんにちは。
> 色々と探してたけど、是非使わせて頂きたいです。
まだ、プラグインの共有が承認になっていないで、記事にコードを追記しました。
どうぞ、使ってみてください。
> 色々と探してたけど、是非使わせて頂きたいです。
まだ、プラグインの共有が承認になっていないで、記事にコードを追記しました。
どうぞ、使ってみてください。
こんにちわ 早速FC2ブログにて設定してみたのですが、どうにも上手く動作しません
ひとつのタグが停止したままグレー表示されるだけなんですよねえ・・・
それぞれの記事にタグを設定しましたので、5つくらいのタグが回転して表示されるはずなんですが
ちなみにページを開くと下部にエラー表示が出て詳細を見ると引数が無効ですと出ています 関係あるのかな?
ひとつのタグが停止したままグレー表示されるだけなんですよねえ・・・
それぞれの記事にタグを設定しましたので、5つくらいのタグが回転して表示されるはずなんですが
ちなみにページを開くと下部にエラー表示が出て詳細を見ると引数が無効ですと出ています 関係あるのかな?
デルタさんこんにちは。
>どうにも上手く動作しません
すべてのタグの使用回数が同じだと表示がおかしくなりますね。
ごめんなさい。
修正版を上のブログ本文に追記しました。
具体的には、73行目を加えてください。
>どうにも上手く動作しません
すべてのタグの使用回数が同じだと表示がおかしくなりますね。
ごめんなさい。
修正版を上のブログ本文に追記しました。
具体的には、73行目を加えてください。
早速のご回答ありがとうございます
ですが、私本当の初心者でありまして、どこが修正されたのか、見直してもわかりません(~_~;)
max Countの値を0から10などに修正しなさいという事でしょうか?
HTMLの知識も全くないもので(~_~;)
ですが、私本当の初心者でありまして、どこが修正されたのか、見直してもわかりません(~_~;)
max Countの値を0から10などに修正しなさいという事でしょうか?
HTMLの知識も全くないもので(~_~;)
この記事に(このコメントの上のほうを見てください。)
同じタグクラウドのJavaScriptソースコードを掲載しています。
その73行目は、
if (minCount==maxCount) {minCount-=0.5; maxCount+=0.5;}
となっています。
これを、以下の手順で、デルタさんがダウンロードした
タグクラウドのソースを開いて、同じ場所に追加して欲しいのです。
(1) 管理画面から「プラグインの設定」→3D球体タグクラウドの「詳細」
をクリックします。
(2) 【HTMLの編集】をクリックすると、ソースコードが表示されます。
このソースコードのjavascriptは、記事に書いたものと73行目以外同じです。
(3) ここに、73行目の「if (minCount== ・・・」を同じ場所に追記します。
(4) 「設定」ボタンをクリックします。
また、分からなければ質問してください(^^
同じタグクラウドのJavaScriptソースコードを掲載しています。
その73行目は、
if (minCount==maxCount) {minCount-=0.5; maxCount+=0.5;}
となっています。
これを、以下の手順で、デルタさんがダウンロードした
タグクラウドのソースを開いて、同じ場所に追加して欲しいのです。
(1) 管理画面から「プラグインの設定」→3D球体タグクラウドの「詳細」
をクリックします。
(2) 【HTMLの編集】をクリックすると、ソースコードが表示されます。
このソースコードのjavascriptは、記事に書いたものと73行目以外同じです。
(3) ここに、73行目の「if (minCount== ・・・」を同じ場所に追記します。
(4) 「設定」ボタンをクリックします。
また、分からなければ質問してください(^^
歯車ぎあさん、こんにちは。
タグクラウドの言葉は、
「ユーザータグ」を設定すれば表示されます。
管理画面から「新しく記事を書く」もしくは「過去の記事の管理」を開き、
「ユーザータグ」の欄に言葉を入力してください。
1つの記事に「ユーザータグ」を複数個設定することもでき、
その場合は、半角スペース区切りで入力すればOKです。
ユーザータグの詳細については、
http://fc2blogmanual.blog60.fc2.com/blog-entry-28.html
を参照してみてください。
タグクラウドの言葉は、
「ユーザータグ」を設定すれば表示されます。
管理画面から「新しく記事を書く」もしくは「過去の記事の管理」を開き、
「ユーザータグ」の欄に言葉を入力してください。
1つの記事に「ユーザータグ」を複数個設定することもでき、
その場合は、半角スペース区切りで入力すればOKです。
ユーザータグの詳細については、
http://fc2blogmanual.blog60.fc2.com/blog-entry-28.html
を参照してみてください。
アルアルットさん、コメントありがとうございます。
So-netブログでの3Dタグクラウドの設置方法を書きました。
http://blog-customize.blog.so-net.ne.jp/2011-12-17
どうそ、試してみてください。
So-netブログでの3Dタグクラウドの設置方法を書きました。
http://blog-customize.blog.so-net.ne.jp/2011-12-17
どうそ、試してみてください。
アルアルットさん、ごめんなさい。
あのソースではタイトルが出ませんね。記事を修正したのでもう一度試してみてください。
なお、So-net用に修正した個所は、この記事に掲載したJavascriptコードの40,42,44行目だけです。
それを、So-netブログでタグクラウドのHTMLのヘッダーとフッターの間に入れました。
あのソースではタイトルが出ませんね。記事を修正したのでもう一度試してみてください。
なお、So-net用に修正した個所は、この記事に掲載したJavascriptコードの40,42,44行目だけです。
それを、So-netブログでタグクラウドのHTMLのヘッダーとフッターの間に入れました。
3D タグクラウドを設置したくて調べてましたら、こちらへたどり着きました。
So-netブログで出来たようですが、exciteブログではできるのでしょうか?
大変恐縮ですが、お暇な時で結構ですのでご解答よろしくお願い致します。
So-netブログで出来たようですが、exciteブログではできるのでしょうか?
大変恐縮ですが、お暇な時で結構ですのでご解答よろしくお願い致します。
カレラSWBさん、
コメントありがとうございます。
exciteブログへの3Dタグクラウドを設置ですが、
残念ながら現時点では、難しそうです。
3Dタグクラウドを設置するためには、
1)Javascriptが使えること
2)タグの情報が取得できること
が必要です。
exciteブログでは、記事にはJavascriptは使えませんが、ブログパーツとしては使えるようなので、
1)はクリアーしています。
しかし、タグのキーワードや使用回数などのタグの情報を取得する方法がどうしても分かりませんでした。
exciteブログについては、私よりもカレラSWBさんのほうが詳しいでしょうから、
もしタグの情報の取得方法が分かるようでしたら、教えていただければ、
3Dタグクラウドの設置方法を回答できると思います。
コメントありがとうございます。
exciteブログへの3Dタグクラウドを設置ですが、
残念ながら現時点では、難しそうです。
3Dタグクラウドを設置するためには、
1)Javascriptが使えること
2)タグの情報が取得できること
が必要です。
exciteブログでは、記事にはJavascriptは使えませんが、ブログパーツとしては使えるようなので、
1)はクリアーしています。
しかし、タグのキーワードや使用回数などのタグの情報を取得する方法がどうしても分かりませんでした。
exciteブログについては、私よりもカレラSWBさんのほうが詳しいでしょうから、
もしタグの情報の取得方法が分かるようでしたら、教えていただければ、
3Dタグクラウドの設置方法を回答できると思います。
右京武彦 様
ご回答ありがとうございます。
Javascriptを使ってCSS編集などに貼付ければ3Dタグクラウドが使えると安易な考えでしたが
難しそうです。
ブログの見た目が格好よくなればと思ってたんですが、こういうソースを編集などぜんぜん疎くて
タグの情報の取得方法なども調べてみましたが全くわかりませんでした。
他の方のexciteブログもいろいろ覗いたりしましたが タグを編集して設置している方も見つけられませんでした。
もう少し勉強してタグの情報の取得方法なども調べてみたいと思います。
有り難う御座いました。
ご回答ありがとうございます。
Javascriptを使ってCSS編集などに貼付ければ3Dタグクラウドが使えると安易な考えでしたが
難しそうです。
ブログの見た目が格好よくなればと思ってたんですが、こういうソースを編集などぜんぜん疎くて
タグの情報の取得方法なども調べてみましたが全くわかりませんでした。
他の方のexciteブログもいろいろ覗いたりしましたが タグを編集して設置している方も見つけられませんでした。
もう少し勉強してタグの情報の取得方法なども調べてみたいと思います。
有り難う御座いました。
タグクラウド、使っていただき、ありがとうございます。
表示文字とタグ検索ページリンクは対応するようになっているはずです。
まんだらさんのページを拝見しました。
タグクラウドを軽く見たところ、問題ないように思いますが、
例えば、どのタグ検索がおかしい、とかありますか?
表示文字とタグ検索ページリンクは対応するようになっているはずです。
まんだらさんのページを拝見しました。
タグクラウドを軽く見たところ、問題ないように思いますが、
例えば、どのタグ検索がおかしい、とかありますか?