図の矢印のHTMLページを可視化する意味のリンクとテキストに及ぶ
-
23-08-2019 - |
質問
いHTMLページとテキストに及ぶこの印をつけたもののようになります:
...
<span id="T2" class="Protein">p50</span>
...
<span id="T3" class="Protein">p65</span>
...
<span id="T34" ids="T2 T3" class="Positive_regulation">recruitment</span>
...
I.。各スパンにはIDとは、ゼロ以上に及ぶそのIdを持っています。
いを可視化するこれらの参考にしています。
二つの質問:
- したいので地図IDのスパンでは、画面の座標値にレンダリング、スパン?
- い描きの矢印からレンダリングではありませんか?
に解決されるべきFirefox、他のブラウザがプラスになっ必要です。の解決策が使用jQuery、またはその他の軽量JavaScriptライブラリ。
解決
かも必要なこれらの矢印をして、特定の数学的形成する必要がありますが、すぐにそのようにあっちこっちとる。
試 WireIt.この WireItデモ (して推奨されていません).使用する canvas
タグの各ワイヤーとの間に浮かぶダイアログ div
sサイズとしてそれぞれ canvas
要素の外観の接続回線のスポットです。して実現しようとする追加の回転ローヘッドなんの矢である各要素に同じ角度になります。
編集: デモて推奨されていません.
編集:無視するこの答え @フィルH 釘付けで
他のヒント
この捕獲中心のために十分な期間を少しテストです。このコードは以下のとき での行動
しているとのことですすべてを跨るページがいを制限することで人idで始T場合に適した)"および"'id'属性のリストのリンクです。をキャンバスの要素の後に及ぶも弧を描きの矢印を交互に上下に及ぶため、それぞれの光源スなサービスを提供しています。
<script type="application/x-javascript">
function generateNodeSet() {
var spans = document.getElementsByTagName("span");
var retarr = [];
for(var i=0;i<spans.length; i++) {
retarr[retarr.length] = spans[i].id;
}
return retarr;
}
function generateLinks(nodeIds) {
var retarr = [];
for(var i=0; i<nodeIds.length; i++) {
var id = nodeIds[i];
var span = document.getElementById(id);
var atts = span.attributes;
var ids_str = false;
if((atts.getNamedItem) && (atts.getNamedItem('ids'))) {
ids_str = atts.getNamedItem('ids').value;
}
if(ids_str) {
retarr[id] = ids_str.split(" ");
}
}
return retarr;
}
// degrees to radians, because most people think in degrees
function degToRad(angle_degrees) {
return angle_degrees/180*Math.PI;
}
// draw a horizontal arc
// ctx: canvas context;
// inax: first x point
// inbx: second x point
// y: y value of start and end
// alpha_degrees: (tangential) angle of start and end
// upside: true for arc above y, false for arc below y.
function drawHorizArc(ctx, inax, inbx, y, alpha_degrees, upside)
{
var alpha = degToRad(alpha_degrees);
var startangle = (upside ? ((3.0/2.0)*Math.PI + alpha) : ((1.0/2.0)*Math.PI - alpha));
var endangle = (upside ? ((3.0/2.0)*Math.PI - alpha) : ((1.0/2.0)*Math.PI + alpha));
var ax=Math.min(inax,inbx);
var bx=Math.max(inax,inbx);
// tan(alpha) = o/a = ((bx-ax)/2) / o
// o = ((bx-ax)/2/tan(alpha))
// centre of circle is (bx+ax)/2, y-o
var circleyoffset = ((bx-ax)/2)/Math.tan(alpha);
var circlex = (ax+bx)/2.0;
var circley = y + (upside ? 1 : -1) * circleyoffset;
var radius = Math.sqrt(Math.pow(circlex-ax,2) + Math.pow(circley-y,2));
ctx.beginPath();
if(upside) {
ctx.moveTo(bx,y);
ctx.arc(circlex,circley,radius,startangle,endangle,1);
} else {
ctx.moveTo(bx,y);
ctx.arc(circlex,circley,radius,startangle,endangle,0);
}
ctx.stroke();
}
// draw the head of an arrow (not the main line)
// ctx: canvas context
// x,y: coords of arrow point
// angle_from_north_clockwise: angle of the line of the arrow from horizontal
// upside: true=above the horizontal, false=below
// barb_angle: angle between barb and line of the arrow
// filled: fill the triangle? (true or false)
function drawArrowHead(ctx, x, y, angle_from_horizontal_degrees, upside, //mandatory
barb_length, barb_angle_degrees, filled) { //optional
(barb_length==undefined) && (barb_length=13);
(barb_angle_degrees==undefined) && (barb_angle_degrees = 20);
(filled==undefined) && (filled=true);
var alpha_degrees = (upside ? -1 : 1) * angle_from_horizontal_degrees;
//first point is end of one barb
var plus = degToRad(alpha_degrees - barb_angle_degrees);
a = x + (barb_length * Math.cos(plus));
b = y + (barb_length * Math.sin(plus));
//final point is end of the second barb
var minus = degToRad(alpha_degrees + barb_angle_degrees);
c = x + (barb_length * Math.cos(minus));
d = y + (barb_length * Math.sin(minus));
ctx.beginPath();
ctx.moveTo(a,b);
ctx.lineTo(x,y);
ctx.lineTo(c,d);
if(filled) {
ctx.fill();
} else {
ctx.stroke();
}
return true;
}
// draw a horizontal arcing arrow
// ctx: canvas context
// inax: start x value
// inbx: end x value
// y: y value
// alpha_degrees: angle of ends to horizontal (30=shallow, >90=silly)
function drawHorizArcArrow(ctx, inax, inbx, y, //mandatory
alpha_degrees, upside, barb_length) { //optional
(alpha_degrees==undefined) && (alpha_degrees=45);
(upside==undefined) && (upside=true);
drawHorizArc(ctx, inax, inbx, y, alpha_degrees, upside);
if(inax>inbx) {
drawArrowHead(ctx, inbx, y, alpha_degrees*0.9, upside, barb_length);
} else {
drawArrowHead(ctx, inbx, y, (180-alpha_degrees*0.9), upside, barb_length);
}
return true;
}
function drawArrow(ctx,fromelem,toelem, //mandatory
above, angle) { //optional
(above==undefined) && (above = true);
(angle==undefined) && (angle = 45); //degrees
midfrom = fromelem.offsetLeft + (fromelem.offsetWidth / 2) - left - tofromseparation/2;
midto = toelem.offsetLeft + ( toelem.offsetWidth / 2) - left + tofromseparation/2;
//var y = above ? (fromelem.offsetTop - top) : (fromelem.offsetTop + fromelem.offsetHeight - top);
var y = fromelem.offsetTop + (above ? 0 : fromelem.offsetHeight) - canvasTop;
drawHorizArcArrow(ctx, midfrom, midto, y, angle, above);
}
var canvasTop = 0;
function draw() {
var canvasdiv = document.getElementById("canvas");
var spanboxdiv = document.getElementById("spanbox");
var ctx = canvasdiv.getContext("2d");
nodeset = generateNodeSet();
linkset = generateLinks(nodeset);
tofromseparation = 20;
left = canvasdiv.offsetLeft - spanboxdiv.offsetLeft;
canvasTop = canvasdiv.offsetTop - spanboxdiv.offsetTop;
for(var key in linkset) {
for (var i=0; i<linkset[key].length; i++) {
fromid = key;
toid = linkset[key][i];
var above = (i%2==1);
drawArrow(ctx,document.getElementById(fromid),document.getElementById(toid),above);
}
}
}
</script>
とだけ話のどこかにdraw()関数:
<body onload="draw();">
その後、キャンバス裏に及ぶ.
<canvas style='border:1px solid red' id="canvas" width="800" height="7em"></canvas><br />
<div id="spanbox" style='float:left; position:absolute; top:75px; left:50px'>
<span id="T2">p50</span>
...
<span id="T3">p65</span>
...
<span id="T34" ids="T2 T3">recruitment</span>
</div>
将来の変更、調査を実施しているのは、同じ参照:
- 平坦化トップの長矢
- リファクタリングにできるということは非横方向の矢印:新しくキャンバスのための?
- 利用をよりよい日常の合計オフセットのキャンバスとスパンです。
[編集会2011年固定ん@パロ]
このとしてとして有用であることができて楽しかったです。
の矢印のための大きいライブラリーがある JointJS を上記のようにラファエルに基づいています。 JointJSを使えば、簡単に複雑なものなしでカーブや頂点の矢印を描くことができます; - )
var j34 = s3.joint(s4, uml.arrow).setVertices(["170 130", "250 120"]);
これは、S4で2つのJS項目S3を結ぶ矢印「J34」を定義します。それ以外はJointJSのドキュメントに読み込むことができます。
あなたはこのライブラリを試みることができる - それは非常に巧妙なものだ、それは役立ちます願っています。
編集:このリンクは死んでいるように、ここで<のhref =「http://web.archive.org/web/20090220143503/http://walterzorn.com/jsgraphics/jsgraphics_e.htm」のrelから別のリンクであります= "nofollowをnoreferrer"> Archive.org を。
ようにしていくオープンなweb技術を可能な限りますが、実は、HTMLとJavaScriptはjQuery)なのでこの特定の仕事(し寂しくなりましたが、true)として特に図のだ画を複雑になります。
一方で、 Flash を行った。大ActionScript3.0をコードするに必要な構文解析するXML、レイアウトのテキストにはこれらの管理フォントおよびスーパー/subscripts)、曲線を描画するための ます。表示されます。グラフィッククラス という方法 curveTo
).全体の大きを見下のコードは、メンテナンス性の少ないhacks、より広い互換性および安定した図書けます。
"頑張ってください。
は、リストの上または下に絶対位置divを使用することができます。あなたは、矢印のヘッドを構成するこれらのdivプラスイメージのカップルのスタイルをCSSを使用することができます。以下は、jQueryのUIプロジェクト(長いURLについて申し訳ありません)から設定されたアイコンを使用した例である。
ここでは、物事を始めるためのCSSです
<style>
.below{
border-bottom:1px solid #000;
border-left:1px solid #000;
border-right:1px solid #000;
}
.below span{
background-position:0px -16px;
top:-8px;
}
.above{
border-top:1px solid #000;
border-left:1px solid #000;
border-right:1px solid #000;
}
.above span{
background-position:-64px -16px;
bottom:-8px;
}
.arrow{
position:absolute;
display:block;
background-image:url(http://jquery-ui.googlecode.com/svn/trunk/themes/base/images/ui-icons_454545_256x240.png);
width:16px;
height:16px;
margin:0;
padding:0;
}
.left{left:-8px;}
.right{right:-9px;}
</style>
今、私たちは、矢印divを組み立てるために開始することができます。例えば、上記のあなたの例では、「プロモーター」に「必要とし」から矢印のスタイルを、あなたはDIVの左上にある矢印のグラフィックを向けて上方divの上、下、右の境界線を左に行うことができます。
<div class='below' style="position:absolute;top:30px;left:30px;width:100px;height:16px">
<span class='arrow left'></span>
</div>
インラインスタイルは、あなたが接続する必要があるものの場所を考え出した後、スクリプトによって適用される必要があることになります。のは、あなたのリストはこのようになっていることを言ってみましょう。
<span id="promoter">Promoter</span><span>Something Else</span><span id="requires">Requires</span>
そして、次のスクリプトは、あなたの矢印を配置します。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script>
$(function(){
var promoterPos=$("#promoter").offset();
var requiresPos=$("#requires").offset();
$("<div class='below'><span class='arrow left'></span></div>")
.css({position:"absolute",left:promoterPos.left,right:promoterPos.top+$("#promoter").height()})
.width(requiresPos.left-promoterPos.left)
.height(16)
.appendTo("body");
});
</script>
先に行くと、空白のHTMLページに上記の例を貼り付けます。それがきちんとのようなものだ。
、JavaScriptとHTMLは、この種のもののために良いツールではありません。
ジョンResig氏は、JavaScriptのの中Processing.orgの実装を書きました。それは、Firefoxの最近のバージョンで動作しますので、それは、canvas要素を使用していますが、それはすべてのブラウザでは動作しません。あなただけのFirefoxを気にした場合、これはおそらく行くための方法だろう。
あなたはSVGを使用することができるかもしれませんが、やはり、これはすべてのブラウザでサポートされていません。
私は同様のソリューションを必要とし、私は RaphaelJSのJavaScriptライブラリのに探していました。たとえば、あなたが(x1,y1)
する(x2,y2)
からまっすぐに矢印を描くことができます:
Raphael.fn.arrow = function (x1, y1, x2, y2, size) {
var angle = Math.atan2(x1-x2,y2-y1);
angle = (angle / (2 * Math.PI)) * 360;
var arrowPath = this.path(“M” + x2 + ” ” + y2 + ” L” + (x2 - size) + ” ” + (y2 - size) + ” L” + (x2 - size) + ” ” + (y2 + size) + ” L” + x2 + ” ” + y2 ).attr(“fill”,”black”).rotate((90+angle),x2,y2);
var linePath = this.path(“M” + x1 + ” ” + y1 + ” L” + x2 + ” ” + y2);
return [linePath,arrowPath];
}
私は曲がった矢印を描画する方法を見つけ出すていないが、私はそれが可能だと確信しています。
あなたが得ることができる曲線矢印は...初めのためのセット(上下)...拡張可能ミドル用position:absolute
div要素、および終了のための別のペアを透明なGIFに設定background-image
とbacground:repeat
のdiv要素のほんの一握りを使用して終了します(上下)。
あなたはこのライブラリを使用することができます。ちょうどソース&ターゲット要素のIDを持つあなたのSVGラインに注釈を付けます。これは、接続要素の変化を観察するために MutationObserver を使用しています。