ユーザーに次の方法で線を引いてもらいたいWebアプリがあります。ユーザーがPoint1をクリックしてマウスを動かしたときに、 Point1から現在のマウスの位置に線を引き、Point2をクリックしたときに最後の線を描きます。 Point1からPoint2への線。
jQueryおよび/またはそのプラグインの1つを使用してそれを行うにはどうすればよいですか?
ユーザーに次の方法で線を引いてもらいたいWebアプリがあります。ユーザーがPoint1をクリックしてマウスを動かしたときに、 Point1から現在のマウスの位置に線を引き、Point2をクリックしたときに最後の線を描きます。 Point1からPoint2への線。
jQueryおよび/またはそのプラグインの1つを使用してそれを行うにはどうすればよいですか?
勝負を受けて立つ。
私はCSS変換とJavascriptの数学の束でそれをやろうとしました - 30分後に私はこれを持っています:
灰色の四角を 2 回クリックすると、線が描画されます。角度が 45 度を超えると線が正しく描画されない小さなバグがまだあります。他の誰かがそれを修正する方法を知っているかもしれません。Math.asin (arcsinus) を使用する代わりに、他の三角関数を使用するかもしれませんが、私はそれが本当に苦手です。小さなバグがあっても投稿しようと思っていましたが、それはあなたにとって良いスタートだと思います.
私は今週末、さまざまなアプローチを試しましたが、私にとって最も効果的な解決策は、Adam Sanderson によるものです: http://monkeyandcrow.com/blog/drawing_lines_with_css3/
彼のデモはこちら: http://monkeyandcrow.com/samples/css_lines/
その核心は非常にシンプルで、常に優れています。
div.line{
transform-origin: 0 100%;
height: 3px; /* Line width of 3 */
background: #000; /* Black fill */
}
function createLine(x1,y1, x2,y2){
var length = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
var angle = Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
var transform = 'rotate('+angle+'deg)';
var line = $('<div>')
.appendTo('#page')
.addClass('line')
.css({
'position': 'absolute',
'transform': transform
})
.width(length)
.offset({left: x1, top: y1});
return line;
}
jQuery や従来の HTML ではできません。
SVG (+svgweb for IE8- http://code.google.com/p/svgweb/ ) を使用して実行できます。SVG は動的に作成できます。jQuery + svgweb は完全に機能しています。SVG ノードの作成方法を知っていれば、このノードを jquerify するだけで済みます。ほとんどの場合、jquerifiing の後、1 つのメソッドのみを使用しましたattr()
Raphael http://raphaeljs.com/ (SVG および VML に基づく) を使用して実行できます。
Canvas ( http://flashcanvas.net/ for IE8- )を使用して実行できます。
SVG プログラミングの場合、次のようになります。
最初の点を作成する瞬間: 空行を作成しますvar Line
(この点の座標も と になりx1
ますy1
)
次に、 Line のプロパティの再mousemove
描画時にバインドしますx2
y2
最後の行の位置を固定したmousedown
後にオン。mousemove
アップデート
CSS/JS でそれを行うことができますが、主な問題は、変換用のマトリックス フィルターのみを持つ IE8 の計算にあります。
しばらくの間、これの修正版を使用しています。うまくいきます。
http://www.ofdream.com/code/css/xline2.php
したがって、最初のクリックでドロップし、そこにプレースホルダー div (おそらく小さな円) としてオブジェクトを配置し、マウスを動かしながら線を描き続けるか、元のプレースホルダーをガイドとして使用して 2 回目にクリックしたときに線を描きます。
私のツールには行の移動が含まれているため、最近、このための別のヘルパー関数を作成しました。
function setLinePos(x1, y1, x2, y2, id) {
if (x2 < x1) {
var temp = x1;
x1 = x2;
x2 = temp;
temp = y1;
y1 = y2;
y2 = temp;
}
var line = $('#line' + id);
var length = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
line.css('width', length + "px");
var angle = Math.atan((y2 - y1) / (x2 - x1));
line.css('top', y1 + 0.5 * length * Math.sin(angle) + "px");
line.css('left', x1 - 0.5 * length * (1 - Math.cos(angle)) + "px");
line.css('-moz-transform', "rotate(" + angle + "rad)");
line.css('-webkit-transform', "rotate(" + angle + "rad)");
line.css('-o-transform', "rotate(" + angle + "rad)");
}
それが jquery のバージョンで、このイテレーションでは IE の要件がないため無視します。元の関数からかなり簡単に適応させることができました。