我使用JQuery-UI draggables和droppables将元素克隆到div上。 使用JQuery在页面上的元素之间绘制线条的最佳方法是什么。
刷新页面线条的最佳方法是什么?我将在页面上有多行,只想更新一行而不是刷新每一行。
答案 0 :(得分:14)
我现在有这个工作。
根据我的经验,不要使用jquery.svg,它可能是解决它的压力,而不是学习我的方式绕过另一个插件,但我发现它比它的价值更麻烦,并导致兼容性问题。
可以使用HTML5画布和excanvas compatibility script以及a great html5 walkthrough来解决,但由于HTML5画布的工作原理,它要求画布上的所有linse都被销毁并重新绘制(如果一行)需要删除或其位置需要更新。
我在其间绘制线条的元素位于表示关系的父元素内。子元素代表一个开始和结束,所以我可以通过使用例如父母的集合来重绘所有这些关系。 $('.relationshipClass')
并询问集合元素的子节点以获取线条的点数
要使用此代码,您必须提出一种方法,以便轻松获取可用于重绘的线点。
<强>标记:强>
很好很简单,一个html <div>
来保存(最可能是JQuery UI draggables)之间的任何元素,以及一个位于相同位置的<canvas>
<div id="divCanvasId" class="divCanvasClass"></div>
<canvas id="html5CanvasId"></canvas>
<强> CSS:强>
不要使用CSS控制<canvas>
元素的宽度,请参阅Question on Canvas streching。将<canvas>
放在与<div>
相同的位置,并在其后面(使用z-index),这将显示<div>
后面的行并阻止<canvas>
阻止与<div>
的孩子的任何拖放交互。
canvas
{
background-color: #FFFFFF;
position: absolute;
z-index: -10;
/* control height and width in code to prevent stretching */
}
Javascript方法:
创建实用程序方法:示例代码位于JQuery plugin内,其中包含:
添加新线条或调整线条位置时,会破坏现有线条并绘制所有线条。 您可以将下面的代码放入常规函数中或作为插件保留。
Javascript代码:
注:没有经过匿名化测试。
$(document).ready(function () {
$.fn.yourExt = {
_readjustHTML5CanvasHeight: function () {
//clear the canvas by readjusting the width/height
var html5Canvas = $('#html5CanvasId');
var canvasDiv = $('#divCanvasId');
if (html5Canvas.length > 0) {
html5Canvas[0].width = canvasDiv.width();
html5Canvas[0].height = canvasDiv.height();
}
}
,
//uses HTML5 <canvas> to draw line representing relationship
//IE support with excanvas.js
_drawLineBetweenElements: function (sourceElement, targetElement) {
//draw from/to the centre, not the top left
//don't use .position()
//that will be relative to the parent div and not the page
var sourceX = sourceElement.offset().left + sourceElement.width() / 2;
var sourceY = sourceElement.offset().top + sourceElement.height() / 2;
var targetX = targetElement.offset().left + sourceElement.width() / 2;
var targetY = targetElement.offset().top + sourceElement.height() / 2;
var canvas = $('#html5CanvasId');
//you need to draw relative to the canvas not the page
var canvasOffsetX = canvas.offset().left;
var canvasOffsetY = canvas.offset().top;
var context = canvas[0].getContext('2d');
//draw line
context.beginPath();
context.moveTo(sourceX - canvasOffsetX, sourceY - canvasOffsetY);
context.lineTo(targetX - canvasOffsetX, targetY - canvasOffsetY);
context.closePath();
//ink line
context.lineWidth = 2;
context.strokeStyle = "#000"; //black
context.stroke();
}
,
drawLines: function () {
//reset the canvas
$().yourExt._readjustHTML5CanvasHeight();
var elementsToDrawLinesBetween;
//you must create an object that holds the start and end of the line
//and populate a collection of them to iterate through
elementsToDrawLinesBetween.each(function (i, startEndPair) {
//dot notation used, you will probably have a different method
//to access these elements
var start = startEndPair.start;
var end = startEndPair.end;
$().yourExt._drawLineBetweenElements(start, end);
});
}
现在,您可以从事件处理程序(例如JQuery UI's drag event)调用这些函数来绘制线条。
答案 1 :(得分:-4)
使用1px高度设置背景制作hr或div,并在需要时使用jquery为其宽度设置动画。